Используйте потоковый анализатор для извлечения изображений из файла PDF - PullRequest
0 голосов
/ 28 июня 2019

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

...