1

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

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

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

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

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

4

1 回答 1

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 示例

于 2013-05-17T10:16:27.057 回答