【发布时间】:2016-06-24 08:00:25
【问题描述】:
当我尝试将 pdf 转换为图像时,对于某些 pdf,我收到“内存不足”错误。所以我增加了堆大小,然后我再次得到了一些不同 pdf 文件的错误。 暂时假设我没有其他对象的内存泄漏。那么这个内存出错的原因是什么? 是否只是图像太大(我认为不是这种情况)以至于它消耗了堆,或者 pdfbox 将每个页面的缓冲图像存储在其内存中,这会导致堆大小的增长? 任何见解都会很棒。
这是我要渲染的 pdf 的链接。 https://drive.google.com/file/d/0B_Ke2amBgdpeNFFDem5KVVVzanc/view?usp=sharing 这是代码段。
PDFRenderer pdfRenderer = new PDFRenderer(pdDoc);
BufferedImage image = pdfRenderer.renderImageWithDPI(page-1, 300,ImageType.GRAY);
//image=ImageHelper.convertImageToGrayscale(image);
ImageIOUtil.writeImage(image,"G:/Trial/tempImg.png", 300);
请注意,对于这个特定的 pdf 问题是通过增加堆大小来解决的,但我想知道的是 pdfbox 是否将缓冲的图像存储在其内存中并有助于堆大小。
这是另一个 pdf,即使在增加堆大小后也面临同样的问题。 https://drive.google.com/file/d/0B_Ke2amBgdpedDBtaG1QcW1oYlU/view?usp=sharing 在这个 pdf 中,我的代码在渲染第 44 页时需要很长时间。 我不知道为什么会这样。
【问题讨论】:
-
可能会添加您要转换的内容的大小以及执行此操作的代码的 sn-p
-
我已经编辑了我的帖子并上传了代码和文件。
-
关于内存使用:如果我没记错的话 pdfbox 使用大量内存(尤其是彩色图像),是的,即使您不需要它们(一年前或所以他们计划在使用后进行 readOnDemand/remove,但我没有保持最新)。您可以尝试使用暂存文件来节省内存,但它会很慢
-
您的文件很大...也许您需要更多的 -Xmx 空间。我认为 p44 没有任何问题。这只是一堆非常大的扫描。是的,PDFBox 确实在内存中存储了很多。确保在转换时不要保留图像(例如,在数组中),以便空间可用。如果您使用的是 JDK8,请不要忘记特殊设置。 pdfbox.apache.org/2.0/getting-started.html
-
@Zeromus 我们正在缓存图像,但从 2.0 版本开始使用 SoftReference,因此不应将它们保存在内存中。我对p44没有问题。顺便说一句,提取的页面最大为 31MB(p8)。彩色扫描通常是个坏主意。由于人工制品,将文本文件扫描为JPEG(如链接的PDF)也是一个坏主意。可悲的是,许多编程不佳的多功能复印机都会这样做。