2016-08-03 6 views
1

Novacode APIを使用して.docxファイルを読み込んでいて、変換できないためにファイル内の画像をWinFormアプリケーションに作成または表示できませんNovacode画像(pic)または画像からシステム画像に変換します。私は、写真自体にはほとんど情報がないことに気付きました。私は、見ることができるピクセルデータを得る方法がありません。だから私はいつものコンバージョンのアイデアを利用することができませんでした。c#Novacode.Picture to System.Drawing.Image

また、Wordはファイル内に画像を保存し、Novacodeソースにヒントを保存する方法を調べましたが、何も出てこなかった。

私の質問では、Novacode Pictureをシステムに変換する方法がありますか、あるいはOpenXMLのような画像データを収集するために何か別のものを使うべきですか?もしそうなら、NovacodeとOpenXMLは何らかの形で矛盾しますか?

また別の場所になる可能性がありますthis answerもあります。

ご迷惑をおかけして申し訳ありません。

+0

私はnovacodeについては何も知らないが、別の考え方として別の方法でイメージを抽出することはできますか?すなわち.docx拡張子を.docx.zip拡張子に変更してからzipファイルとして開く場合は、/ word/mediaに移動して、ここで画像を見つけることができます。 – gattsbr

+0

私はこれを行うと、 "image1.png"のような一般的な名前を持つすべての画像を一覧表示します。 Novacodeと同じです。私は手動でイメージの名前を付けることができたが、何も見つけることができなかったかどうかを.docxの中に見てきた。元のファイル名を保持する.pngファイル内にタグがありますか? – DCOPTimDowd

+0

私は順番にそれらを通っていると思うので、実際にはそのように指定されている限り、これは動作することができます。それでも、やっかいなやり方のようです。 – DCOPTimDowd

答えて

1

いいえ。これは私がやったことです。助言のためにgattsbrに感謝します。これは、すべての画像を順番に取得でき、すべての画像の名前が降順である場合にのみ機能します。

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"); 
}