0

我们正在尝试使用 PDFRenderer 的方法 renderImageWithDPI 渲染来自不同 PDF 文件的图像。在特定的 PDF 中,对于某些页面,库渲染器具有不同的行为。

渲染本身比其他类似页面花费更长的时间,并且内存消耗达到异常大的值:进程消耗的内存每 1-2 秒增加大约 50MB,直到达到应用程序消耗的 5GB RAM 之类的值在 renderImageWithDPI 中处理。一旦线程完成 renderImageWithDPI,内存消耗几乎立即下降 1.5 - 2 GB。由于高内存消耗,有时会抛出 Java Heap Space Exception。

发生这种情况的页面与其他页面没有明显不同,具有相同的宽度、高度和磁盘大小。使用 250 DPI 和 ImageType RGB 完成渲染。此外,应用程序使用“-Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider”参数运行。

这是内存泄漏还是预期的行为?另外,有人可以解释为什么有些页面会占用 2GB 内存并需要 1 分钟才能呈现,而另一些页面会在几秒钟内呈现?

4

1 回答 1

0

对 PDF 的分析表明,第 34 页有超过 10000 个 XObject 元素,几乎都是 CMYK 图像。您可以使用PDFDebugger 命令行应用程序自行查看,转到第 34 页,然后是资源,然后是 XObject。在java中转换它们不是很快。内存使用很可能是由于我们缓存了这些图像。您可以观察到下一次显示页面时,它的完成速度要快得多。FAQ中显示了禁用缓存。

通过使用此选项,我还获得了一些速度改进(21 秒而不是 89 秒)-Dorg.apache.pdfbox.rendering.UsePureJavaCMYKConversion=true:. 但是图像质量可能会略有不同,请参阅PDFBOX-3569进行讨论。

于 2017-04-07T17:33:25.543 回答