Есть ли способ в слове VBA найти расширение встроенного изображения (inlineShape) (jpeg, png, emf ...)? - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь определить в документе docx расширение встроенных изображений.Этот открытый XML-документ мог быть создан другим пользователем с помощью Microsoft Word или OpenOffice.Изображения были внедрены через ленту или перетаскиванием, и они могут быть inlineShape (mose of the time) или Shape.Мне нужно получить доступ к расширению, потому что документ затем (не в моей юрисдикции) анализируется и преобразуется в pdf, а некоторые расширения изображений не совместимы с процессом (а именно, emf of wmf).

Эти изображения могутне имеют ни имен, ни свойств альтернативного текста.Свойство linkFormat также недоступно, поскольку они встроены.Просматривая строку ActiveDocument.WordOpenXML, я могу узнать, есть ли такие изображения.Но тогда я не могу связать их с соответствующей формой в документе, чтобы определить, какое изображение будет проблематичным.Поскольку они встроены, папка media в docx zip содержит изображение, и они связаны с идентификаторами в документе через document.xml.rels, например,

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

Теперь я могу найти в документе.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>

Оттуда я застрял!Что делать с этими данными?Родительским узлом чертежа является абзац с идентификатором

w14:paraId="78D01A35"

, но это единственный экземпляр идентификатора в строке ActiveDocument.WordOpenXML.

Я хотел бы иметь указателигде я могу посмотреть.Из того, что я понимаю, когда Word анализирует docx и строит объектную модель, он преобразует ссылки отношений в inlineShape с якорями в хорошем месте.Но он каким-то образом теряет всю ссылку на имя изображения или местоположение в zip docx.

PS: мне нужно найти решение в слове vba

1 Ответ

0 голосов
/ 07 апреля 2019

Вы на правильном пути. rId - это «ссылка» между расположением изображения в документе и фактическим графическим файлом.

Вся информация в document.xml является «форматированием», поэтому расширение файла (тип изображения) никогда не будет храниться там, только в отношении носителя.

В document.xml это где найти rId в отображаемом вами XML

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

Вам нужно взять blip, а затем embed. Эта информация может помочь вам http://officeopenxml.com/drwPic-ImageData.php

Вы можете попытаться использовать RegEx или какой-нибудь синтаксический анализ строки, чтобы подобрать это. Или это может быть сделано с помощью MSXML и XML «синтаксический анализ». Что будет работать, будет зависеть от того, насколько близко все эти вещи следуют узнаваемому шаблону, и сколько времени / усилий потребуется вам, чтобы научиться использовать объектную модель XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...