private void ParseFile(string filename, uint depth, ref System.Collections.Generic.List <string> outputfiles) { KRSrcWorkflow.WFFileType.FileType type = KRSrcWorkflow.WFFileType.GetFileType(filename); if (type == KRSrcWorkflow.WFFileType.FileType.OlePowerPoint) { uint fileidx = 0; System.Collections.Generic.List <string> pptfiles = new System.Collections.Generic.List <string>(); DIaLOGIKa.b2xtranslator.StructuredStorage.Reader.StructuredStorageReader ssr = new DIaLOGIKa.b2xtranslator.StructuredStorage.Reader.StructuredStorageReader(filename); DIaLOGIKa.b2xtranslator.PptFileFormat.PowerpointDocument ppt = new DIaLOGIKa.b2xtranslator.PptFileFormat.PowerpointDocument(ssr); foreach (uint persistId in ppt.PersistObjectDirectory.Keys) { UInt32 offset = ppt.PersistObjectDirectory[persistId]; ppt.PowerpointDocumentStream.Seek(offset, System.IO.SeekOrigin.Begin); DIaLOGIKa.b2xtranslator.PptFileFormat.ExOleObjStgAtom obj = DIaLOGIKa.b2xtranslator.OfficeDrawing.Record.ReadRecord(ppt.PowerpointDocumentStream) as DIaLOGIKa.b2xtranslator.PptFileFormat.ExOleObjStgAtom; if (obj != null) { string filedir = string.Format("{0}\\{1}", System.IO.Directory.GetParent(filename).FullName, KRSrcWorkflow.WFUtilities.GetNextDirectoryNumber(System.IO.Directory.GetParent(filename).FullName)); if (!System.IO.Directory.Exists(filedir)) { System.IO.Directory.CreateDirectory(filedir); } if (System.IO.Directory.Exists(filedir)) { byte[] data = obj.DecompressData(); System.IO.MemoryStream ms = new System.IO.MemoryStream(data); KRSrcWorkflow.WFFileType.FileType oletype = KRSrcWorkflow.WFFileType.GetOleFileType(data); if (oletype == WFFileType.FileType.OlePackage || oletype == WFFileType.FileType.OleContents) { using (OpenMcdf.CompoundFile cf = new OpenMcdf.CompoundFile(ms)) { WriteStorage(cf.RootStorage, filedir, depth, ref pptfiles); } } else { string filenm = String.Format("{0}\\pptembed{1}", filedir, fileidx); using (System.IO.FileStream fs = new System.IO.FileStream(filenm, System.IO.FileMode.Create, System.IO.FileAccess.Write)) { byte[] buffer = new byte[1024]; int len; while ((len = ms.Read(buffer, 0, buffer.Length)) > 0) { fs.Write(buffer, 0, len); } pptfiles.Add(filenm); } fileidx++; ms.Close(); ms.Dispose(); } } } } #if false foreach (DIaLOGIKa.b2xtranslator.PptFileFormat.ExOleEmbedContainer ole in ppt.OleObjects.Values) { string filedir = string.Format("{0}\\{1}", System.IO.Directory.GetParent(filename).FullName, diridx++); if (!System.IO.Directory.Exists(filedir)) { System.IO.Directory.CreateDirectory(filedir); } if (System.IO.Directory.Exists(filedir)) { string filenm = String.Format("{0}\\pptembed{1}", filedir, ole.SiblingIdx); try { System.IO.FileStream fss = new System.IO.FileStream(filenm, System.IO.FileMode.Create, System.IO.FileAccess.Write); byte[] data = ole.stgAtom.DecompressData(); fss.Write(data, 0, data.Length); fss.Flush(); fss.Close(); fss.Dispose(); pptfiles.Add(filenm); } catch (Exception ex) { } } } #endif foreach (DIaLOGIKa.b2xtranslator.OfficeDrawing.Record record in ppt.PicturesContainer._pictures.Values) //.Where(x => x.TypeCode == 0xF01C || x.TypeCode == 0xF01D || x.TypeCode == 0xF01E || x.TypeCode == 0xF01F || x.TypeCode == 0xF029 || x.TypeCode == 0xF02A)) { string filedir = string.Format("{0}\\{1}", System.IO.Directory.GetParent(filename).FullName, "PPTPictures"); //, KRSrcWorkflow.WFUtilities.GetNextDirectoryNumber(System.IO.Directory.GetParent(filename).FullName)); if (!System.IO.Directory.Exists(filedir)) { System.IO.Directory.CreateDirectory(filedir); } if (System.IO.Directory.Exists(filedir)) { string extension = string.Empty; int skip = 0; switch (record.TypeCode) { case 0xF01A: extension = ".emf"; break; case 0xF01B: extension = ".wmf"; break; case 0xF01C: extension = ".pict"; break; case 0xF01D: case 0xF02A: extension = ".jpg"; skip = 17; break; case 0xF01E: extension = ".png"; skip = 17; break; case 0xF01F: extension = ".dib"; break; case 0xF029: extension = ".tiff"; break; } string filenm = String.Format("{0}\\pptembed{1}{2}", filedir, fileidx++, extension); using (System.IO.FileStream fs = new System.IO.FileStream(filenm, System.IO.FileMode.Create, System.IO.FileAccess.Write)) { // need to skip 17 byte header in raw data stream byte[] data = ((extension == ".emf" || extension == ".wmf")) ? ((DIaLOGIKa.b2xtranslator.OfficeDrawing.MetafilePictBlip)record).Decrompress() : record.RawData.Skip(skip).ToArray(); fs.Write(data, 0, data.Length); fs.Flush(); fs.Close(); fs.Dispose(); pptfiles.Add(filenm); } } } ssr.Close(); ssr.Dispose(); outputfiles.AddRange(pptfiles); depth--; if (depth > 0) { foreach (string fn in pptfiles) { ParseFile(fn, depth, ref outputfiles); } } } else { using (OpenMcdf.CompoundFile cf = new OpenMcdf.CompoundFile(filename)) { WriteStorage(cf.RootStorage, System.IO.Directory.GetParent(filename).FullName, depth, ref outputfiles); } } }
private void ParseFile(string filename, uint depth, ref System.Collections.Generic.List<string> outputfiles) { SFWorkflow.WFFileType.FileType type = SFWorkflow.WFFileType.GetFileType(filename); if (type == SFWorkflow.WFFileType.FileType.OlePowerPoint) { uint fileidx = 0; System.Collections.Generic.List<string> pptfiles = new System.Collections.Generic.List<string>(); DIaLOGIKa.b2xtranslator.StructuredStorage.Reader.StructuredStorageReader ssr = new DIaLOGIKa.b2xtranslator.StructuredStorage.Reader.StructuredStorageReader(filename); DIaLOGIKa.b2xtranslator.PptFileFormat.PowerpointDocument ppt = new DIaLOGIKa.b2xtranslator.PptFileFormat.PowerpointDocument(ssr); foreach (uint persistId in ppt.PersistObjectDirectory.Keys) { UInt32 offset = ppt.PersistObjectDirectory[persistId]; ppt.PowerpointDocumentStream.Seek(offset, System.IO.SeekOrigin.Begin); DIaLOGIKa.b2xtranslator.PptFileFormat.ExOleObjStgAtom obj = DIaLOGIKa.b2xtranslator.OfficeDrawing.Record.ReadRecord(ppt.PowerpointDocumentStream) as DIaLOGIKa.b2xtranslator.PptFileFormat.ExOleObjStgAtom; if (obj != null) { string filedir = string.Format("{0}\\{1}", System.IO.Directory.GetParent(filename).FullName, SFWorkflow.WFUtilities.GetNextDirectoryNumber(System.IO.Directory.GetParent(filename).FullName)); if (!System.IO.Directory.Exists(filedir)) System.IO.Directory.CreateDirectory(filedir); if (System.IO.Directory.Exists(filedir)) { byte[] data = obj.DecompressData(); System.IO.MemoryStream ms = new System.IO.MemoryStream(data); SFWorkflow.WFFileType.FileType oletype = SFWorkflow.WFFileType.GetOleFileType(data); if (oletype == WFFileType.FileType.OlePackage || oletype == WFFileType.FileType.OleContents) { using (OpenMcdf.CompoundFile cf = new OpenMcdf.CompoundFile(ms)) { WriteStorage(cf.RootStorage, filedir, depth, ref pptfiles); } } else { string filenm = String.Format("{0}\\pptembed{1}", filedir, fileidx); using (System.IO.FileStream fs = new System.IO.FileStream(filenm, System.IO.FileMode.Create, System.IO.FileAccess.Write)) { byte[] buffer = new byte[1024]; int len; while ((len = ms.Read(buffer, 0, buffer.Length)) > 0) { fs.Write(buffer, 0, len); } pptfiles.Add(filenm); } fileidx++; ms.Close(); ms.Dispose(); } } } } #if false foreach (DIaLOGIKa.b2xtranslator.PptFileFormat.ExOleEmbedContainer ole in ppt.OleObjects.Values) { string filedir = string.Format("{0}\\{1}", System.IO.Directory.GetParent(filename).FullName, diridx++); if (!System.IO.Directory.Exists(filedir)) System.IO.Directory.CreateDirectory(filedir); if (System.IO.Directory.Exists(filedir)) { string filenm = String.Format("{0}\\pptembed{1}", filedir, ole.SiblingIdx); try { System.IO.FileStream fss = new System.IO.FileStream(filenm, System.IO.FileMode.Create, System.IO.FileAccess.Write); byte[] data = ole.stgAtom.DecompressData(); fss.Write(data, 0, data.Length); fss.Flush(); fss.Close(); fss.Dispose(); pptfiles.Add(filenm); } catch (Exception ex) { } } } #endif foreach (DIaLOGIKa.b2xtranslator.OfficeDrawing.Record record in ppt.PicturesContainer._pictures.Values) //.Where(x => x.TypeCode == 0xF01C || x.TypeCode == 0xF01D || x.TypeCode == 0xF01E || x.TypeCode == 0xF01F || x.TypeCode == 0xF029 || x.TypeCode == 0xF02A)) { string filedir = string.Format("{0}\\{1}", System.IO.Directory.GetParent(filename).FullName, "PPTPictures"); //, SFWorkflow.WFUtilities.GetNextDirectoryNumber(System.IO.Directory.GetParent(filename).FullName)); if (!System.IO.Directory.Exists(filedir)) System.IO.Directory.CreateDirectory(filedir); if (System.IO.Directory.Exists(filedir)) { string extension = string.Empty; int skip = 0; switch (record.TypeCode) { case 0xF01A: extension = ".emf"; break; case 0xF01B: extension = ".wmf"; break; case 0xF01C: extension = ".pict"; break; case 0xF01D: case 0xF02A: extension = ".jpg"; skip = 17; break; case 0xF01E: extension = ".png"; skip = 17; break; case 0xF01F: extension = ".dib"; break; case 0xF029: extension = ".tiff"; break; } string filenm = String.Format("{0}\\pptembed{1}{2}", filedir, fileidx++, extension); using(System.IO.FileStream fs = new System.IO.FileStream(filenm, System.IO.FileMode.Create, System.IO.FileAccess.Write)) { // need to skip 17 byte header in raw data stream byte[] data = ((extension == ".emf" || extension == ".wmf")) ? ((DIaLOGIKa.b2xtranslator.OfficeDrawing.MetafilePictBlip)record).Decrompress() : record.RawData.Skip(skip).ToArray(); fs.Write(data, 0, data.Length); fs.Flush(); fs.Close(); fs.Dispose(); pptfiles.Add(filenm); } } } ssr.Close(); ssr.Dispose(); outputfiles.AddRange(pptfiles); depth--; if (depth > 0) { foreach(string fn in pptfiles) ParseFile(fn, depth, ref outputfiles); } } else { using (OpenMcdf.CompoundFile cf = new OpenMcdf.CompoundFile(filename)) { WriteStorage(cf.RootStorage, System.IO.Directory.GetParent(filename).FullName, depth, ref outputfiles); } } }