如何强制Docx4j刷新替换的图像文件

时间:2013-05-17 09:40:48

标签: java docx4j

我使用Docx4j生成各种文档,而且生成包含图像的文档时遇到问题。

我的程序构造一个大小为300x200像素的PNG文件,并生成包含此图像的文档。当我打开此文档时,图像以1:1缩放。然后程序用600x400像素的图像覆盖PNG并再次生成文档。当我打开这个新文档时,图像按1:2缩放。它的尺寸与上一张图像相同。

在我看来,Docx4j的类BinaryPartAbstractImage在静态成员中缓存图像的信息,并且在文件更改时不会更新信息。

目前,除了在生成文档时停止程序清除缓存或使用新的图像文件名,我没有其他解决方案。前一种解决方案是不实际的,后者在软件的部分中引入了更多的问题,这些问题期望文件的路径不会被改变。

那么,您是否有另一种解决方法来清除图像缓存?

1 个答案:

答案 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