将图像从PDImageXObject提取到文件中,而不将其加载到内存中
问题描述
这与How to extract image bytes out of PDF efficiently有关,但是我将尝试以不同的方式重述该问题,因此它与PDF解析有关,而与图像处理有关。
我正在使用PDFBox从PDF文件中提取图像。有一个类PDImageXObject表示PDF中的图像,其中包含图像元数据(高度,宽度等),并公开了两个用于提取图像的API:BufferedImage getImage()
和BufferedImage getImage(Rectangle rect, int subsampling);
。
当前代码很简单:
BufferedImage image = pdImage.getImage();
ImageIO.write(image, "jpg", baos);
但是,对于大图像,内存使用存在问题,因为BufferedImage将未压缩的图像数据存储在内存中,这比压缩结果要大得多。
[有没有一种方法可以通过将整个图像拆分为多个图块(例如1024x1024)并使用需要getImage
的Rectangle
签名对其进行迭代来避免将整个图像加载到内存中?我看到一些有关JAI的有前途的信息,这些信息能够使用Tiles输出压缩的图像而无需立即将未压缩的内容加载到内存中,但是我不知道如何将其与我从PDImageXObject获得的内容联系在一起。还是有其他方法可以做到? JAI仍是一个活跃的项目吗?
顺便说一下,提取图像的目的是将其馈送到可处理多种图像格式的管道中的下一个组件中。因此,如果jpg以外的其他格式更适合平铺处理,那应该没问题。
解决方法:
[确定,我找到了一个藏书:Commons Imaging。班级Imaging可能会帮助您。
我认为您可以尝试createInputStream()
方法,找出实际数据的大小(字节长度)。
下一篇:如何访问对象的字段