Я использую 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()
.