DocumentFormat.OpenXml.Paragraphを使用して、.DOCXから画像を抽出し画像をテキストで置換する方法は?
解決したいこと
DocumentFormat.OpenXml.Paragraphを使用して、Word(.DOCX)から画像を抽出し画像を抽出した箇所をテキストで置換する方法を知りたいです。
例)
DocumentFormat.OpenXmlを使用してWordファイルを見出し単位で.docxに分解して指定フォルダに保存するwindowsアプリをc#で作成しています。その際、分解する.docxに画像(図)が存在したら抽出してこちらも指定フォルダに保存し、画像が在った位置に抽出した画像のファイル名を出力しようとしております。
画像が在った位置に抽出した画像のファイル名を出力したいので、DocumentFormat.OpenXml.Paragraphから画像を抽出してRunを画像のファイル名で置換しようとしているのですがそもそも画像が抽出出来ずにおります。
DocumentFormat.OpenXml.Paragraphから画像を抽出する方法があればご教示いただきたいです。
例)保存する.docxの中身
テストてすとSTART
@@image01.jpeg@@ ← 画像を抽出した位置に画像のファイル名を出力したい
テストてすとEND
試しているソースコード
public static int ExtractImages(WordprocessingDocument document, Paragraph paragraph, int imageIndex, string imageOutPath, string midashi)
{
var imageFileIndex = imageIndex;
foreach (var run in paragraph.Descendants<Run>())
{
var drawing = run.Descendants<Drawing>().FirstOrDefault();
if (drawing != null)
{
var blip = drawing.Descendants<DocumentFormat.OpenXml.Drawing.Blip>().FirstOrDefault();
if (blip != null)
{
string imageId = blip.Embed.Value;
var imagePart = (ImagePart)document.MainDocumentPart.GetPartById(imageId);
// 画像のファイル名を取得
string imageName = imagePart.Uri.OriginalString;
// 画像を指定のパスに保存
string fileName = $"image{imageFileIndex}_{midashi}_{imageName}";
string savedImagePath = System.IO.Path.Combine(imageOutPath, fileName);
using (var stream = new FileStream(savedImagePath, FileMode.Create))
{
imagePart.GetStream().CopyTo(stream);
}
// 画像を削除し、テキストで置き換える
run.RemoveAllChildren();
run.Append(new Text("@@" + fileName + "@@"));
imageFileIndex++;
}
}
}
Console.WriteLine($"Extracted {imageFileIndex} images:");
return imageFileIndex;
}
自分で試したこと
var drawing = run.Descendants<Drawing>().FirstOrDefault();
上記のコードだとdrawingが必ずNullになり画像を取得できずにおります。読み込んでいるWordには画像が存在しております。
DocumentFormat.OpenXml.Paragraphから画像を抽出する方法があればご教示いただきたいです。