调用AddPicture后InlineShape未加入Word书签Range的问题排查
Word 365插件:嵌入式形状无法加入书签Range的问题解决
我在开发Microsoft Word 365插件时,需要实现嵌入式形状(InlineShape)的添加与删除功能,测试代码如下:
bookmark.Range.InlineShapes.AddPicture("c:\temp\test.png");
尽管图片显示在书签对应的位置,但bookmark.Range.InlineShapes集合仍为空,执行断言Assert.IsTrue(bookmark.Range.InlineShapes.Count > 0);时失败。观察发现形状实际被添加在Range之后而非内部,导致后续无法遍历书签内的形状进行删除等操作。
问题根源
Word的InlineShapes.AddPicture方法默认会将图片插入到目标Range的末尾之后,而非嵌入到Range内部,因此新添加的InlineShape不会被纳入原书签Range的InlineShapes集合。
解决方法
方法1:折叠Range后插入
先将书签的Range折叠为光标位置,再插入图片,图片会直接嵌入到书签范围内:
// 把书签Range折叠到起始位置 bookmark.Range.Collapse(WdCollapseDirection.wdCollapseStart); // 插入图片 bookmark.Range.InlineShapes.AddPicture(@"c:\temp\test.png");
方法2:插入后扩展书签范围
如果需要保留原书签内容并在其中插入图片,可在插入后重新调整书签Range,将新图片包含进去:
// 插入图片并获取新形状对象 var newShape = bookmark.Range.InlineShapes.AddPicture(@"c:\temp\test.png"); // 复制原Range并扩展至新图片的末尾 var updatedRange = bookmark.Range.Duplicate; updatedRange.End = newShape.Range.End; // 重新设置书签的Range bookmark.Range = updatedRange;
方法3:直接在Range内部插入
通过操作Range的字符位置,确保图片插入到Range内部:
var targetRange = bookmark.Range; // 在Range的第一个字符位置后插入图片,原Range会自动扩展包含图片 targetRange.Characters[1].InlineShapes.AddPicture(@"c:\temp\test.png");
验证
插入完成后,执行以下断言即可验证图片是否被正确纳入书签Range的InlineShapes集合:
Assert.IsTrue(bookmark.Range.InlineShapes.Count > 0);
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

