OpenXML替换Word图片占位符时所有占位符均被替换问题
问题根源
所有占位符共享同一个关联图片资源的rId,你现有代码直接修改该rId指向的图片资源内容,自然所有引用这个rId的占位符都会同步变更。
修复方案
不要修改原有图片资源的内容,给匹配到的目标占位符单独创建新的图片资源,再将目标占位符的Blip关联指向新的资源唯一id,仅修改当前匹配到的占位符的关联关系,其他占位符不受影响。
修正后代码
using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; using A = DocumentFormat.OpenXml.Drawing; public static void ReplacePlaceHolderWithPicture(this WordprocessingDocument doc, string nameOfImage, string imgFilePath) { var drawings = doc.MainDocumentPart.Document.Descendants<Drawing>().ToList(); foreach (var drawing in drawings) { var dpr = drawing.Descendants<DocProperties>().FirstOrDefault(); if (dpr != null && dpr.Name == nameOfImage) { foreach (var blip in drawing.Descendants<A.Blip>()) { // 创建新的独立图片Part ImagePart newImagePart = doc.MainDocumentPart.AddImagePart(GetImagePartType(imgFilePath)); using (var stream = new FileStream(imgFilePath, FileMode.Open, FileAccess.Read)) { newImagePart.FeedData(stream); } // 获得新图片Part的唯一rId string newRid = doc.MainDocumentPart.GetIdOfPart(newImagePart); // 替换当前占位符的关联rId,不修改原有资源 blip.Embed = newRid; } } } } // 辅助方法:根据图片后缀获取对应ImagePartType private static ImagePartType GetImagePartType(string imgFilePath) { string ext = Path.GetExtension(imgFilePath).ToLower(); return ext switch { ".png" => ImagePartType.Png, ".jpg" or ".jpeg" => ImagePartType.Jpeg, ".gif" => ImagePartType.Gif, ".bmp" => ImagePartType.Bmp, _ => throw new NotSupportedException($"不支持的图片格式:{ext}") }; }
验证说明
修改完成后可重新用OpenXML SDK Productivity Tool查看文档结构,匹配到的目标占位符的<a:blip>标签r:embed属性会变为新生成的唯一id,其余未匹配的占位符仍使用原有id,不会被同步修改。
内容的提问来源于stack exchange,提问作者stickfigure4
相关产品推荐
相关产品推荐

