65.9K
CodeProject 正在变化。 阅读更多。
Home

ImageUpdater

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (2投票s)

2011 年 4 月 27 日

CPOL

3分钟阅读

viewsIcon

24138

downloadIcon

853

本文介绍了如何更新 Word 文档中图像占位符中的图像,并使用 Open XML 2.0 保持插入图像的大小(Microsoft Office 2007)。

引言

本文介绍了如何更新 Word 文档中图像占位符中的图像,并保持新图像的大小。

背景

假设您有一个 Word 文档,您想更新图像占位符中的图像,并希望保持新更新图像的大小。

Using the Code

在 Word 文档中添加图像占位符

  1. 启动 Microsoft Word 2007(或更高版本)
  2. 导航到“开发人员”选项卡
  3. 单击“控件”组框中的“图片内容控件”图标。 这将在 Word 文档中添加一个图像占位符。
  4. 单击图像占位符以选择它(如果尚未选择)
  5. 单击“控件”组框中的“属性”按钮。 这将弹出内容控件属性。
  6. 为内容控件提供标题和标签名称
  7. 单击占位符内的图标以将图像添加到占位符
  8. 保存文档并关闭它

实现细节

要更新 Word 文档中的图像,然后调整图像内容控件的大小,您需要

  1. 查找图像标签节点
  2. 查找图像节点的关联 ID
  3. 循环遍历文档以查找所有 DRAWING 元素
  4. 循环遍历每个 DRAWING 元素,找到包含您要更新的图像的 BLIP 的元素
  5. EXTENT元素中的cxcy参数设置为新尺寸(注意尺寸以EMU为单位,因此您需要将像素转换为EMU。1 像素 = 9525 EMU)
  6. EXTENTS元素中的cxcy参数设置为新尺寸(注意尺寸以EMU为单位,因此您需要将像素转换为EMU。1 像素 = 9525 EMU)
  7. 保存文档

解码 Word 文档文件

自从我开始使用 Open XML 开发应用程序以来,我学到的一件事是使用文档反射器工具 (OpenXmlSdkTool.exe)。 我再怎么强调它的用处都不为过。 一旦您了解了此工具的用法,您将能够解决您在使用 OpenXml 时遇到的任何问题。

在此示例中,我们正在研究检索图像占位符 ID。 如果您查看反射器工具,打开 test.docx 文件,然后导航到 w:documentw:bodyw: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 日 - 应用程序创建并发布
© . All rights reserved.