2016-08-03 57 views
1

Ich lese in einer DOCX-Datei mit der Novacode-API, und kann keine Bilder in der Datei zu einer WinForm-App erstellen oder anzeigen, da sie nicht konvertiert werden kann von einem Novacode-Bild (Bild) oder Bild zu einem Systembild. Ich habe bemerkt, dass es sehr wenig Informationen in dem Bild selbst gibt, mit keinerlei Möglichkeit, irgendwelche Pixeldaten zu bekommen, die ich sehen kann. Daher konnte ich keine der üblichen Conversion-Ideen nutzen.C# Novacode.Picture zu System.Drawing.Image

Ich habe auch nachgesehen, wie Word Bilder in den Dateien sowie Novacode-Quelle für Hinweise speichert und ich habe nichts gefunden.

Meine Frage ist dann gibt es eine Möglichkeit, ein Novacode Picture zu einem System zu konvertieren, oder sollte ich etwas anderes verwenden, um die Bilddaten wie OpenXML zu sammeln? Wenn ja, würden Novacode und OpenXML in irgendeiner Weise kollidieren?

Es gibt auch this answer, das könnte ein anderer Ort sein, um zu beginnen.

Jede Hilfe wird sehr geschätzt.

+0

Ich weiß nichts über Novacode, aber vielleicht als eine andere Idee, könnten Sie das Bild auf eine andere Weise extrahieren? Wenn Sie eine .docx-Erweiterung in eine Erweiterung von .docx.zip ändern und dann als Zip-Datei öffnen möchten, können Sie zu/word/media navigieren und die Bilder hier finden. – gattsbr

+0

Wenn ich dies tue, listet es alle Bilder mit generischen Namen wie "image1.png" usw. auf. Genau wie in Novacode. Ich habe in die .docx hineingeschaut, um zu sehen, ob ich Bilder manuell benennen konnte, aber nichts gefunden habe. Gibt es ein Tag in .png, das den ursprünglichen Dateinamen enthält? – DCOPTimDowd

+0

Ich gehe davon aus, dass ich sie in der Reihenfolge durchlaufe, also könnte das funktionieren, solange sie tatsächlich so genannt werden. Sieht immer noch nach einer sehr umständlichen Art aus, Dinge zu tun. – DCOPTimDowd

Antwort

1

Okay. Das ist, was ich getan habe. Danke an gattsbr für den Hinweis. Dies funktioniert nur, wenn Sie alle Bilder der Reihe nach aufnehmen können und für alle Bilder absteigende Namen haben.

using System.IO.Compression; // Had to add an assembly for this 
using Novacode; 

// Have to specify to remove ambiguous error from Novacode 
Dictionary<string, System.Drawing.Image> images = new Dictionary<string, System.Drawing.Image>(); 

void LoadTree() 
{ 
    // In case of previous exception 
    if(File.Exists("Images.zip")) { File.Delete("Images.zip"); } 

    // Allow the file to be open while parsing 
    using(FileStream stream = File.Open("Images.docx", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
    { 
     using(DocX doc = DocX.Load(stream)) 
     { 
      // Work rest of document 

      // Still parse here to get the names of the images 
      // Might have to drag and drop images into the file, rather than insert through Word 
      foreach(Picture pic in doc.Pictures) 
      { 
       string name = pic.Description; 

       if(null == name) { continue; } 

       name = name.Substring(name.LastIndexOf("\\") + 1); 
       name = name.Substring(0, name.Length - 4); 

       images[name] = null; 
      } 

      // Save while still open 
      doc.SaveAs("Images.zip"); 
     } 
    } 

    // Use temp zip directory to extract images 
    using(ZipArchive zip = ZipFile.OpenRead("Images.zip")) 
    { 
     // Gather all image names, in order 
     // They're retrieved from the bottom up, so reverse 
     string[] keys = images.Keys.OrderByDescending(o => o).Reverse().ToArray(); 

     for(int i = 1; ; i++) 
     { 
      // Also had to add an assembly for ZipArchiveEntry 
      ZipArchiveEntry entry = zip.GetEntry(String.Format("word/media/image{0}.png", i)); 

      if(null == entry) { break; } 

      Stream stream = entry.Open(); 

      images[keys[i - 1]] = new Bitmap(stream); 
     } 
    } 

    // Remove temp directory 
    File.Delete("Images.zip"); 
}