Как заставить Docx4j обновить замененный файл изображения

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

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

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

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

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


person Julien    schedule 17.05.2013    source источник


Ответы (1)


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

Если вы создаете docx, содержащий изображение, посмотрите на основную часть документа (один из способов сделать это — загрузить в веб-приложение PartsList, а затем перейдите в основную часть документа), вы увидите соответствующий 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>

Это то, что вам нужно обновить (cx, cy). Возможно, вам будет проще заменить всю эту структуру (заботясь о relId в @r:embed). См. пример AddImage.

person JasonPlutext    schedule 17.05.2013
comment
Я видел эти (cx, cy), но суть проблемы не в этом. Если я сгенерирую документ A, который включает файл a.png, и если я перезапишу a.png содержимым другого размера перед созданием второго документа B, то размеры a.png в B будут такими же, как в A. - person Julien; 17.05.2013