ImageUpdater






4.50/5 (2投票s)
本文介绍了如何更新 Word 文档中图像占位符中的图像,并使用 Open XML 2.0 保持插入图像的大小(Microsoft Office 2007)。
引言
本文介绍了如何更新 Word 文档中图像占位符中的图像,并保持新图像的大小。
背景
假设您有一个 Word 文档,您想更新图像占位符中的图像,并希望保持新更新图像的大小。
Using the Code
在 Word 文档中添加图像占位符
- 启动 Microsoft Word 2007(或更高版本)
- 导航到“开发人员”选项卡
- 单击“控件”组框中的“图片内容控件”图标。 这将在 Word 文档中添加一个图像占位符。
- 单击图像占位符以选择它(如果尚未选择)
- 单击“控件”组框中的“属性”按钮。 这将弹出内容控件属性。
- 为内容控件提供标题和标签名称
- 单击占位符内的图标以将图像添加到占位符
- 保存文档并关闭它
实现细节
要更新 Word 文档中的图像,然后调整图像内容控件的大小,您需要
- 查找图像标签节点
- 查找图像节点的关联 ID
- 循环遍历文档以查找所有 DRAWING 元素
- 循环遍历每个 DRAWING 元素,找到包含您要更新的图像的 BLIP 的元素
- 将
EXTENT
元素中的cx
和cy
参数设置为新尺寸(注意尺寸以EMU
为单位,因此您需要将像素转换为EMU
。1 像素 = 9525 EMU) - 将
EXTENTS
元素中的cx
和cy
参数设置为新尺寸(注意尺寸以EMU
为单位,因此您需要将像素转换为EMU
。1 像素 = 9525 EMU) - 保存文档
解码 Word 文档文件
自从我开始使用 Open XML 开发应用程序以来,我学到的一件事是使用文档反射器工具 (OpenXmlSdkTool.exe)。 我再怎么强调它的用处都不为过。 一旦您了解了此工具的用法,您将能够解决您在使用 OpenXml 时遇到的任何问题。
在此示例中,我们正在研究检索图像占位符 ID。 如果您查看反射器工具,打开 test.docx 文件,然后导航到w:document
、w:body
、w:sdt
并单击反射按钮。 这将显示 XML + 生成 XML 内容的代码。 现在,暂时忘记代码,只看 XML 代码。图像占位符位于 SdtBlock
下,标签名称可以在 w:tag
中找到。 一个文档可能有多个 sdtBlocks
,但是因为我找到了我要查找的图像占位符名称,所以我现在知道我正在查看正确的 sdtBlock
。
图像本身将位于 Blip 中,因此循环遍历 sdtblock
中的所有 Blip。 当您找到正确的 Blip 时,查看 embed
参数,因为它将包含图像关系 ID – 图像的标识符。 获得正确的 blip 后,您可以提取其 EXTENTS
,其中包含图像的大小(以 EMU
为单位)。 图像占位符本身的大小可以在 EXTENT
元素下找到。
w:p
是一个文字处理指令 (DocumentFormat.OpenXml.Wordprocessing
),w:drawing
位于绘图指令 (DocumentFormat.OpenXml.Drawing
) 等中。
<w:sdt xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:sdtPr>
<w:alias w:val="Some Title" />
<w:tag w:val="ImagePlaceholder1" />
<w:id w:val="19550034" />
<w:picture />
</w:sdtPr>
<w:sdtContent>
<w:p w:rsidR="004E3043" w:rsidRDefault="006B65E0">
<w:r>
<w:rPr>
<w:noProof />
</w:rPr>
<w:drawing>
<wp:inline distT="0" distB="0" distL="0" distR="0"
xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing">
<wp:extent cx="6226969" cy="4981575" />
<wp:effectExtent l="19050" t="0" r="2381" b="0" />
<wp:docPr id="2" name="Picture 1" descr="test.jpg" />
<wp:cNvGraphicFramePr>
<a:graphicFrameLocks
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"
noChangeAspect="1" />
</wp:cNvGraphicFramePr>
<a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
<a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
<pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
<pic:nvPicPr>
<pic:cNvPr id="0" name="test.jpg" />
<pic:cNvPicPr />
</pic:nvPicPr>
<pic:blipFill>
<a:blip r:embed="rId4" cstate="print"
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" />
<a:stretch>
<a:fillRect />
</a:stretch>
</pic:blipFill>
<pic:spPr>
<a:xfrm>
<a:off x="0" y="0" />
<a:ext cx="6226969" cy="4981575" />
</a:xfrm>
<a:prstGeom prst="rect">
<a:avLst />
</a:prstGeom>
</pic:spPr>
</pic:pic>
</a:graphicData>
</a:graphic>
</wp:inline>
</w:drawing>
</w:r>
</w:p>
</w:sdtContent>
关注点
再次,使用反射器工具确实帮助我很多,让我了解了 OpenXML SDK 的工作原理。 一开始看起来可能令人生畏,但值得研究。 请随时评论本文以进行改进和批评。 当我在 Google 上搜索如何在图像占位符中插入图片时,我发现许多文章使用直接 XML 来查找要更新的位置。 我认为必须有一种更简单的方法,只需使用 OpenXML 本身,令我欣慰的是,确实如此。
历史
- 2011 年 4 月 27 日 - 应用程序创建并发布