首页 > 解决方案 > OpenXML 用实际图像替换图像占位符替换所有占位符

问题描述

我在尝试替换 Word 文档中的图像占位符时遇到了一些奇怪的问题。如果我尝试用下面的代码替换占位符,它会替换所有这些。不仅是与 docproperties 中的名称匹配的那个。

通过进一步检查,我发现使用 OpenXML SDK Productivity Tool 查看 word 文档时,我的占位符图片共享相同的嵌入 ID。这是为什么呢?这似乎就是为什么我所有的占位符都被新图像取代的原因。

使用 OpenXML Productivity Tool 的部分文档:

 <pic:blipFill>
                <a:blip r:embed="rId6">
                  <a:extLst>
                    <a:ext uri="{28A0092B-C50C-407E-A947-70E740481C1C}">
                      <a14:useLocalDpi xmlns:a14="http://schemas.microsoft.com/office/drawing/2010/main" val="0" />
                    </a:ext>
                  </a:extLst>
                </a:blip>
                <a:stretch>
                  <a:fillRect />
                </a:stretch>
              </pic:blipFill>

我的 C# 代码

public static void ReplacePlaceHolderWithPicture(this WordprocessingDocument doc, string nameOfImage, string imgFilePath)
{
    var drawings = doc.MainDocumentPart.Document.Descendants<Drawing>().ToList();
    var newImageBytes = File.ReadAllBytes(imgFilePath);

    foreach (var drawing in drawings)
    {
        var dpr = drawing.Descendants<DocProperties>().FirstOrDefault();
        if (dpr != null && dpr.Name == nameOfImage)
        {
            foreach (var b in drawing.Descendants<A.Blip>())
            {
                OpenXmlPart imagePart = doc.MainDocumentPart.GetPartById(b.Embed);

                using (var writer = new BinaryWriter(imagePart.GetStream()))
                {
                    writer.Write(newImageBytes);
                }
            }
        }
    }
}

标签: c#imageopenxmlplaceholderword

解决方案


推荐阅读