// Save to MDI / TIFF private static void SaveToDoc(IList<int> pages, string modiFile, string outFile, MODI.MiFILE_FORMAT format, WaitForm wait, string tmpDir, bool closeForm=true) { MODI.Document modiDoc = null; try { wait.Status = "Saving to " + Path.GetFileName(outFile) + "..."; modiDoc = new MODI.Document(); modiDoc.Create(modiFile); // Can't find a way to add images to an empty doc... // doc.Images.Add doesn't like images from other docs // Probably the same bug that doesn't allow access to Image.Picture // This works backwards and removes unselected images from a complete doc for (int page = modiDoc.Images.Count - 1; page >= 0; page--) { if (!pages.Contains(page)) modiDoc.Images.Remove(modiDoc.Images[page]); } modiDoc.SaveAs(outFile, format); //modiDoc.Close(false); // closing still keeps the file locked... see below } catch { wait.MessageSafe("Failed to save " + Path.GetFileName(outFile)); if(closeForm) wait.CloseSafe(); } try { // The file gets locked for some reason until the program exits // or another save is made elsewhere // This unlocks the file on 2 of the 3 machines I tested on ... while (modiDoc.Images.Count > 1) // can't save w/ 0 imgs - leave 1 modiDoc.Images.Remove(modiDoc.Images[0]); // Needed new files for batch processing :/ This. Is. Ugly. // Not to mention slow if (!Directory.Exists(tmpDir)) Directory.CreateDirectory(tmpDir); modiDoc.SaveAs(tmpDir+"\\"+Path.GetRandomFileName()); modiDoc.Close(); if(closeForm) wait.CloseSafe(); } catch { } }
public void SaveToDocAsync(IList<int> pages, string outFile, MODI.MiFILE_FORMAT format, WaitForm wait) { if (!isOpen) return; doc.Save(); Thread thread = new Thread(() => SaveToDoc(pages, fileName, outFile, format, wait, tmpDir)); thread.Start(); }
public void SaveToDocAsync(IList<int> pages, string outFile, MODI.MiFILE_FORMAT format) { WaitForm dummy = new WaitForm(); SaveToDocAsync(pages, outFile, format, dummy); }
public void Read(byte[] data) { // Clear chunks to prevent double data. Chunks.Clear(); using (var stream = new MemoryStream(data)) using (var reader = new BinaryReader(stream)) { while (reader.BaseStream.Position < reader.BaseStream.Length) { var chunkId = (WMOChunkId)reader.ReadUInt32(); var chunkSize = reader.ReadUInt32(); var chunkData = new byte[chunkSize]; Buffer.BlockCopy(stream.ToArray(), (int)reader.BaseStream.Position, chunkData, 0, (int)chunkSize); IChunk chunk = null; switch (chunkId) { case WMOChunkId.MVER: chunk = new MVER(); break; case WMOChunkId.MOHD: chunk = new MOHD(); break; case WMOChunkId.MOTX: chunk = new MOTX(); break; case WMOChunkId.MOMT: chunk = new MOMT(); break; case WMOChunkId.MOGN: chunk = new MOGN(); break; case WMOChunkId.MOGI: chunk = new MOGI(); break; case WMOChunkId.MOPV: chunk = new MOPV(); break; case WMOChunkId.MOPT: chunk = new MOPT(); break; case WMOChunkId.MOPR: chunk = new MOPR(); break; case WMOChunkId.MOLT: chunk = new MOLT(); break; case WMOChunkId.MODS: chunk = new MODS(); break; case WMOChunkId.MODI: chunk = new MODI(); break; case WMOChunkId.MODD: chunk = new MODD(); break; case WMOChunkId.MFOG: chunk = new MFOG(); break; default: Console.WriteLine($"Skipping {chunkId} (0x{(uint)chunkId:X})"); break; } if (chunk != null) { chunk.Read(chunkData); Chunks.Add(chunk); } reader.BaseStream.Position += chunkSize; } // Add mandatory chunks. Chunks.Add(new MOSB()); Chunks.Add(new MOVV()); Chunks.Add(new MOVB()); // Close the streams so they can be written. reader.Close(); stream.Close(); } }