我使用Docx4j生成各种文档,而且生成包含图像的文档时遇到问题。
我的程序构造一个大小为300x200像素的PNG文件,并生成包含此图像的文档。当我打开此文档时,图像以1:1缩放。然后程序用600x400像素的图像覆盖PNG并再次生成文档。当我打开这个新文档时,图像按1:2缩放。它的尺寸与上一张图像相同。
在我看来,Docx4j的类BinaryPartAbstractImage
在静态成员中缓存图像的信息,并且在文件更改时不会更新信息。
目前,除了在生成文档时停止程序清除缓存或使用新的图像文件名,我没有其他解决方案。前一种解决方案是不实际的,后者在软件的部分中引入了更多的问题,这些问题期望文件的路径不会被改变。
那么,您是否有另一种解决方法来清除图像缓存?
答案 0 :(得分: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>
你需要更新它(cx,cy)。您可能会发现更换整个结构更容易(注意@r:embed中的relId)。请参阅AddImage sample。