2013-05-17 3 views
1

Я использую Docx4j для создания различных документов, и у меня возникла проблема с генерацией документов, содержащих изображения.Как заставить Docx4j обновить замененный файл изображения

Моя программа создает файл PNG размером 300x200 пикселей и создает документ, содержащий это изображение. Когда я открываю этот документ, изображение масштабируется в 1: 1. Затем программа перезаписывает PNG с разрешением 600x400 пикселей и снова создает документ. Когда я открываю этот новый документ, изображение масштабируется в 1: 2. Его размеры те же, что и предыдущее изображение.

Мне кажется, что класс Docx4j BinaryPartAbstractImage кэширует информацию об изображениях в статическом члене и не обновляет информацию при изменении файла.

В настоящее время у меня нет другого решения, кроме остановки программы для очистки кеша или использования новых имен файлов изображений при создании документа. Первое решение является импровизированным, а последнее представляет больше проблем в тех частях программного обеспечения, которые ожидают, что путь файла не будет изменен.

Итак, есть ли у вас другое обходное решение для очистки кеша изображения?

ответ

0

Размеры изображения не сохраняются в части изображения; они указаны в XML-позиционировании изображения в основной части документа (или в верхнем, нижнем колонтитуле или что-то еще).

Если вы создаете docx, содержащий изображение, посмотрите на свою основную часть документа (один из способов сделать это - загрузить в PartsList webapp, а затем перейти в основную часть документа), вы увидите соответствующий XML.

Например:

    <w:drawing> 
         <wp:inline distT="0" distB="0" distL="0" distR="0"> 
          <wp:extent cx="3238500" cy="2362200"/> 
          <wp:effectExtent l="19050" t="0" r="0" b="0"/> 
          <wp:docPr id="1" name="Picture 1" /> 
          <wp:cNvGraphicFramePr> 
           <a:graphicFrameLocks noChangeAspect="true"/> 
          </wp:cNvGraphicFramePr> 
          <a:graphic> 
           <a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture"> 
            <pic:pic> 
             <pic:nvPicPr> 
              <pic:cNvPr id="0" name="Picture 1" /> 
              <pic:cNvPicPr> 
               <a:picLocks noChangeAspect="true" noChangeArrowheads="true"/> 
              </pic:cNvPicPr> 
             </pic:nvPicPr> 
             <pic:blipFill> 
              <a:blip cstate="print" r:embed="rId8"/> 
              <a:srcRect/> 
              <a:stretch> 
               <a:fillRect/> 
              </a:stretch> 
             </pic:blipFill> 
             <pic:spPr bwMode="auto"> 
              <a:xfrm> 
               <a:off x="0" y="0"/> 
               <a:ext cx="3238500" cy="2362200"/> 
              </a:xfrm> 
              <a:prstGeom prst="rect"> 
               <a:avLst/> 
              </a:prstGeom> 
              <a:noFill/> 
              <a:ln w="9525"> 
               <a:noFill/> 
               <a:miter lim="800000"/> 
               <a:headEnd/> 
               <a:tailEnd/> 
              </a:ln> 
             </pic:spPr> 
            </pic:pic> 
           </a:graphicData> 
          </a:graphic> 
         </wp:inline> 
        </w:drawing> 

это его, который вам нужно обновить (сх, су). Возможно, вам будет проще заменить всю эту структуру (заботясь о relId в @r: embed). См. AddImage sample.

+0

Я видел эти '(cx, cy)', но это не ядро ​​проблемы. Если я создаю документ 'A', который включает в себя файл' a.png', и если я перезаписываю 'a.png' содержимое другого размера, прежде чем генерировать второй документ' B', тогда размеры 'a.png 'в' B' такие же, как в 'A'. – Julien

Смежные вопросы