Java PDFBox 2.0.4:提取图像时内存使用率高

Java PDFBox 2.0.4:提取图像时内存使用率高,java,pdf,pdfbox,Java,Pdf,Pdfbox,我使用PDFBOX 2.0.4从PDF文件中提取嵌入图像,代码如下: for(int i = 0; i < document.getNumberOfPages() ;i++) { PDPage page = document.getPage(i); PDResources resources = page.getResources(); PDImageXObject pageImg =

我使用PDFBOX 2.0.4从PDF文件中提取嵌入图像,代码如下:

        for(int i = 0; i < document.getNumberOfPages() ;i++)
        {
            PDPage page = document.getPage(i);
            PDResources resources = page.getResources();

            PDImageXObject pageImg = null;
            Iterable<COSName> xObjectNames = resources.getXObjectNames();
            for (COSName cosName : xObjectNames)
            {
                PDXObject xObject = resources.getXObject(cosName);
                if (xObject instanceof PDImageXObject) 
                {
                    PDImageXObject img = (PDImageXObject) xObject;
                    BufferedImage pageBufferedImage = pageImg.getImage();


                    targetType = pageImg.getSuffix();

                    File imageFile = new File(out, String.valueOf(i+"."+targetType));

                    ImageIO.write(pageBufferedImage,targetType,imageFile);                  
                }
            }
        }

这似乎工作得更快,但输出文件图像已损坏:


Pdfbox体系结构主要基于整个pdf的内存表示(不完全,请参阅临时文件,但主要是临时文件)。因此,它有大量的内存占用。如果这对您来说是个问题,您可能需要先拆分大文件。您的替代代码不起作用,因为这些是解压缩的图像流,通常每RGB像素3字节。你无能为力。PDFBox 2.*有一种机制可以从BuffereImage(
SoftReference
cache)释放空间,但仅当其他代码需要内存时才释放。非常感谢您的重播,非常感谢,所以除了使用bufferImage方法之外没有其他方法了?通过使用bufferimage,您实际上需要为图像转换支付内存占用和cpu利用率。我确实注意到了softreference的使用情况以及在需要时丢弃的内存,但在我们的例子中,缓存是不需要的。ZH@user1804121如果它很重要,只需获取源代码并删除缓存BuffereImage的几行代码即可。但是,除非您有自己的代码来处理图像存储和保存,否则需要使用BuffereImage。唯一的例外是(某些)直接保存的JPEG文件。(这在ExtractImages源代码中显示)Tilman,你说的“图像存储和保存”是什么意思,我实际上不喜欢使用java来处理图像,我们通常使用外部exec(即使用磁盘IO)来处理图像(甚至更快),再次感谢。
pdImageXObject.getStream().toByteArray(); 
pdImageXObject.createInputStream();