c# - 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);
}
}
}
}
}
解决方案
推荐阅读
- java - MySql - 一对多连接,将 JOIN 与 JDBI 映射到列表
- android - 在Android中获取单元格中的小部件大小
- amazon-web-services - 如何在 AWS 私有/公共 VPC 上的 Kubernetes 中对外公开 kafka 代理端口
- install4j - 由 install4j 制作的解码安装程序
- laravel - Laravel 子查询中的参数号无效
- r - 用线性方程变异数据
- maven - ARM 上的 Docker 非常慢
- html - 无法以闪亮的方式呈现交互式 Rmarkdown 图形
- java - 带有定时器的 Java 变色文本。你能帮忙吗?
- asp.net - React & asp.net - 导入 react-bootstrap 异常