我正在使用Apache PDFBox从大型PDF文件提取图像。 (使用PDFBox并不是硬性要求。Aspose.PDF或其他API也可以。)
当前,我将文件解析为PDDocument,然后遍历页面以查找图像:
ArrayList<byte[]> imageDataList = new ArrayList<>();
try (PDDocument document = PDDocument.load(new File(filePath))) {
PDPageTree list = document.getPages();
for (PDPage page : list) {
PDResources pdResources = page.getResources();
for (COSName c : pdResources.getXObjectNames()) {
PDXObject o = pdResources.getXObject(c);
if (o instanceof PDImageXObject) {
PDImageXObject pdImage = (PDImageXObject) o;
ByteArrayOutputStream baos = new ByteArrayOutputStream());
BufferedImage image = pdImage.getImage();
ImageIO.write(image, "jpg", baos);
imageDataList.add(baos.toByteArray());
}
}
}
}
这可行,但占用大量内存。有没有一种方法可以提取图像而不将整个文档解析到内存中?我看到有一个流解析器PDFStreamParser
,但是我不了解PDF内部原理,也不知道该如何处理PDFStreamParser.parseNextToken()
返回的对象。