我们尝试使用PDFRenderer的方法renderImageWithDPI渲染来自不同PDF文件的图像。在特定 PDF 上,对于某些页面,库渲染器具有不同的行为。
渲染本身比其他类似页面花费更长的时间,并且内存消耗达到异常大的值:进程消耗的内存每 1 - 2 秒增加约 50MB,直到达到应用程序进程在 renderImageWithDPI 中消耗的 5GB RAM 等值。一旦线程完成渲染图像与DPI,内存消耗几乎立即下降1.5 - 2 GB。由于内存消耗较高,有时会引发 Java 堆空间异常。
发生这种情况的页面与其他页面没有明显差异,具有相同的宽度、高度和磁盘大小。渲染以 250 DPI 完成,具有 图像类型 RGB。此外,应用程序使用"-Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider"参数运行。
这是内存泄漏还是预期行为?另外,有人可以解释为什么有些页面占用 2GB 内存并需要 1 分钟才能渲染,而其他页面则需要几秒钟才能渲染?
对PDF的分析显示,第34页有超过10000个XObject元素,几乎所有都是CMYK图像。您可以使用PDFDebugger命令行应用程序自己看到这一点,转到第34页,然后转到资源,然后转到XObject。在 java 中转换它们不是很快。内存使用很可能是由于我们缓存了这些图像。您可以观察到,下次显示页面时,它完成的速度要快得多。禁用缓存显示在常见问题解答中。
通过使用此选项,我还获得了一些速度改进(21 秒而不是 89 秒):-Dorg.apache.pdfbox.rendering.UsePureJavaCMYKConversion=true
.但是,图像质量可能略有不同,请参阅PDFBOX-3569进行讨论。