【发布时间】:2016-12-09 12:10:14
【问题描述】:
在将一堆 PDF 渲染为图像时,icepdf 似乎随机出现 OutOfMemoryError。试图追查这一点,我发现了两件事:
- 接近 OOM 时它呈现 A0 页面或类似的大型文档页面
- 使用 eclipse 内存分析器,我发现内存中有 1/2GB 的图像。
这建议将输出图像大小限制在可管理的范围内。我想知道最简单的方法是什么?
我查看了 icepdf 的 Page 对象,但强烈建议始终使用 Page.BOUNDARY_CROPBOX 并且 Javadoc 中似乎没有记录其他用途。
如何限制Document.getPageImage 的输出图像大小或我可以使用什么其他措施来防止OOM(除了增加Xmx,我不能这样做)。降低图像质量是一种选择。但它应该只适用于“超大”图像,而不是全部。
我已经尝试使用 Document.paintPage() 使用预定义的图像,但这还不够。
调试终于让我放大了一个有问题的文档。我得到这样的日志:
2016-12-09T14:23:35Z DEBUG class org.icepdf.core.pobjects.Document 1 MEMFREE: 712484296 of 838860800
2016-12-09T14:23:35Z DEBUG class org.icepdf.core.pobjects.Document 1 LOADING: ..../F1-2.pdf
2016-12-09T14:23:37Z WARN class org.icepdf.core.pobjects.graphics.ScaledImageReference 1 Error loading image: 9 0 R Image stream= {Type=XObject, Length=8 0 R, Filter=FlateDecode, ColorSpace=DeviceGray, Decode=[1, 0], Height=18676, Width=13248, Subtype=Image, BitsPerComponent=1, Name=Im1} 9 0 R
所以这将是高度 = 18676,宽度 = 13248,这真的很大。
我猜想在加载图像的过程中已经发生了 OOM,所以以后的缩放没有帮助。此外,org.icepdf.core.imageReference=scaled 属性似乎还不够早。
对我来说,忽略这样的超大图像就可以了。有机会吗?
【问题讨论】:
标签: icepdf