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