有没有办法在单词VBA中找到嵌入图片(inlineShape)扩展名(jpeg,png,emf ...)?

问题描述 投票:0回答:1

我试图在docx文档中确定嵌入图像的扩展。此打开的xml文档可能是由其他用户使用Microsoft Word或OpenOffice生成的。图像已通过功能区嵌入或拖放,它们可以是inlineShape(mose of the time)或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中图片名称或位置的所有引用。

附: :我需要在vba中找到解决方案

vba ms-word word-vba file-extension
1个回答
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对象模型需要多少时间/精力。

© www.soinside.com 2019 - 2024. All rights reserved.