public override void Process(StructuredStorageFileParserData data) { data.WFState.Value = WFState.WFStateFail; System.Collections.Generic.List <string> outputfiles = new System.Collections.Generic.List <string>(); ParseFile(data.DocumentToProcess, this.Depth, ref outputfiles); foreach (string outputfile in outputfiles) { string filenm = outputfile; KRSrcWorkflow.WFFileType.FileType type = KRSrcWorkflow.WFFileType.GetFileType(outputfile); if (type != KRSrcWorkflow.WFFileType.FileType.Unknown) { string newfilenm = filenm; string extension = KRSrcWorkflow.WFFileType.GetFileTypeExtension(type); if (System.IO.Path.GetExtension(filenm) != extension) { newfilenm = String.Format("{0}{1}", filenm, extension); } if (newfilenm != filenm) { if (System.IO.File.Exists(newfilenm)) { System.IO.File.Delete(newfilenm); } System.IO.File.Move(filenm, newfilenm); filenm = newfilenm; } } data.OutputDocuments.Add(filenm); } data.WFState.Value = "Process"; }
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 WriteStorage(OpenMcdf.CFStorage cfstorage, string directory, uint depth, ref System.Collections.Generic.List <string> outputfiles) { KRSrcWorkflow.WFFileType.FileType type = KRSrcWorkflow.WFFileType.GetOleFileType(cfstorage); if ((cfstorage.Name != "Root Entry") || ((cfstorage.Name == "Root Entry") && (type == KRSrcWorkflow.WFFileType.FileType.OlePackage || type == KRSrcWorkflow.WFFileType.FileType.OleContents))) { string filename = string.Empty; if (type == KRSrcWorkflow.WFFileType.FileType.OlePackage) { Ole10Native olenative = new Ole10Native(new System.IO.MemoryStream(cfstorage.GetStream(Convert.ToChar((byte)1).ToString() + "Ole10Native").GetData())); filename = olenative.FileName; int idx = olenative.FileName.LastIndexOf("\\"); if (idx != -1) { filename = olenative.FileName.Substring(idx + 1); } filename = String.Format("{0}\\{1}", directory, filename); using (System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Create, System.IO.FileAccess.Write)) { fs.Write(olenative.NativeData, 0, olenative.NativeData.Length); } } else if (type == KRSrcWorkflow.WFFileType.FileType.OleContents) { filename = String.Format("{0}\\{1}", directory, "contents"); using (System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Create, System.IO.FileAccess.Write)) { byte [] data = cfstorage.GetStream("CONTENTS").GetData(); fs.Write(data, 0, data.Length); } } else { OpenMcdf.CompoundFile tmp = new OpenMcdf.CompoundFile(); Write(tmp.RootStorage, cfstorage); filename = String.Format("{0}\\{1}", directory, cfstorage.Name); tmp.Save(filename); tmp.Close(); } outputfiles.Add(filename); } if (depth == 0) { return; } depth--; if (type == KRSrcWorkflow.WFFileType.FileType.OleWord || type == WFFileType.FileType.OlePublisher) { try { OpenMcdf.CFStorage objectpool = cfstorage.GetStorage(type == KRSrcWorkflow.WFFileType.FileType.OleWord ? "ObjectPool" : "Objects"); if (objectpool != null) { cfstorage = objectpool; } } catch (Exception) { } } if (cfstorage != null) { foreach (OpenMcdf.CFItem item in cfstorage.EnumChildren.Where(x => x.IsStorage)) { string filedir = string.Format("{0}\\{1}", directory, KRSrcWorkflow.WFUtilities.GetNextDirectoryNumber(directory)); if (!System.IO.Directory.Exists(filedir)) { System.IO.Directory.CreateDirectory(filedir); } if (System.IO.Directory.Exists(filedir)) { WriteStorage((OpenMcdf.CFStorage)item, filedir, depth, ref outputfiles); } } } }