我们正在尝试使用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分钟才能渲染,而其他页面会在几秒内渲染出来吗?
答案 0 :(得分:0)
对PDF的分析表明,第34页有超过10000个XObject元素,几乎所有这些都是CMYK图像。您可以使用the PDFDebugger command line app自己查看,转到第34页,然后是资源,再转到XObject。在java中转换它们并不是很快。内存使用很可能是由于我们缓存了这些图像。您可以观察到下次显示页面时,它的完成速度要快得多。禁用缓存显示在FAQ。
中使用此选项我也可以获得一些速度提升(21秒而不是89秒):-Dorg.apache.pdfbox.rendering.UsePureJavaCMYKConversion=true
。但是,图片质量可能会略有不同,请参阅PDFBOX-3569进行讨论。