VBA中有没有一种方法可以找到嵌入式图片(inlineShape)扩展名(jpeg,png,emf ...)?

时间:2019-04-04 15:57:26

标签: vba ms-word word-vba file-extension

我正在尝试确定docx文档中嵌入图像的扩展名。 此打开的xml文档可能是由其他用户使用Microsoft Word或OpenOffice生成的。 图像已通过功能区嵌入或拖放,它们可以是inlineShape(当时的时间)或Shape。 我需要访问扩展名,因为然后(不在我的管辖范围内)文档被解析并转换为pdf,并且某些图像扩展名与进程(即wmf的emf)不兼容。

这些图像可能没有名称,也没有AlternativeText属性。 linkFormat属性也不可用,因为它们是嵌入式的。 通过查看ActiveDocument.WordOpenXML字符串,可以知道是否有此类图像。但是,我无法将它们链接到文档中的相应形状以识别哪个图像有问题。 由于它们是嵌入式的,因此docx zip中的文件夹媒体包含该图像,并且它们通过document.xml.rels(例如)链接到文档中的ID。

<Relationship Target="media/image1.emf" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Id="rId8"/>

现在我可以在document.xml中找到该rId8的使用位置:

<w:drawing>
  <wp:inline distT="0" distB="0" distL="0" distR="0" wp14:anchorId="59736095" wp14:editId="3A4D29FE">
    <wp:extent cx="1286510" cy="712470"/>
    <wp:effectExtent l="0" t="0" r="8890" b="0"/>
    <wp:docPr id="2" name="Picture 2"/>
    <wp:cNvGraphicFramePr>
      <a:graphicFrameLocks noChangeAspect="1"/>
    </wp:cNvGraphicFramePr>
    <a:graphic>
      <a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
        <pic:pic>
          <pic:nvPicPr>
            <pic:cNvPr id="0" name="Picture 2"/>
            <pic:cNvPicPr>
              <a:picLocks noChangeAspect="1" noChangeArrowheads="1"/>
            </pic:cNvPicPr>
          </pic:nvPicPr>
          <pic:blipFill>
            <a:blip r:embed="rId8" cstate="print">
              <a:extLst>
                <a:ext uri="{28A0092B-C50C-407E-A947-70E740481C1C}">
                  <a14:useLocalDpi val="0"/>
                </a:ext>
              </a:extLst>
            </a:blip>
            <a:srcRect/>
            <a:stretch>
              <a:fillRect/>
            </a:stretch>
          </pic:blipFill>
          <pic:spPr bwMode="auto">
          </pic:spPr>
        </pic:pic>
      </a:graphicData>
    </a:graphic>
  </wp:inline>
</w:drawing>

从那以后我被卡住了!如何处理这些数据? 图纸的父节点是一个带有ID的段落

w14:paraId="78D01A35"

但这是ActiveDocument.WordOpenXML字符串中ID的唯一实例。

我想知道我的外观。 据我了解,当Word解析docx并构建对象模型时,它会将关系链接转换为在适当位置具有锚点的inlineShape。 但它会以某种方式丢失对docx zip中图片名称或位置的所有引用。

P.S。 :我需要用vba单词找到解决方案

1 个答案:

答案 0 :(得分:0)

您在正确的轨道上。 rId是文档中图像位置和实际图形文件之间的“链接”。

document.xml中的所有信息都是“格式化”的,因此文件扩展名(图像类型)将永远不会存储在其中,仅在媒体关系中。

在document.xml中,这是在您显示的XML中找到rId的地方

  <pic:blipFill>
        <a:blip r:embed="rId8" cstate="print">

您需要先接blip,然后接embed。此信息可能会对您http://officeopenxml.com/drwPic-ImageData.php

有帮助

您可以尝试使用RegEx或某种字符串解析来进行选择。或者可以使用MSXML和XML“解析”来完成。有效的方法取决于所有这些东西遵循可识别模式的紧密程度,以及学习如何使用XML对象模型将花费多少时间/精力。