いいえ。これは私がやったことです。助言のために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");
}
私はnovacodeについては何も知らないが、別の考え方として別の方法でイメージを抽出することはできますか?すなわち.docx拡張子を.docx.zip拡張子に変更してからzipファイルとして開く場合は、/ word/mediaに移動して、ここで画像を見つけることができます。 – gattsbr
私はこれを行うと、 "image1.png"のような一般的な名前を持つすべての画像を一覧表示します。 Novacodeと同じです。私は手動でイメージの名前を付けることができたが、何も見つけることができなかったかどうかを.docxの中に見てきた。元のファイル名を保持する.pngファイル内にタグがありますか? – DCOPTimDowd
私は順番にそれらを通っていると思うので、実際にはそのように指定されている限り、これは動作することができます。それでも、やっかいなやり方のようです。 – DCOPTimDowd