PDFBox не может генерировать изображения из страниц PDF-файла - PullRequest
0 голосов
/ 19 марта 2020

Я уже некоторое время использую PDFBox для разделения файлов PDF на изображения, но после обновления до 2.0.19 у меня начались неожиданные исключения.

Это трассировка стека исключения:

java.lang.ArrayIndexOutOfBoundsException: 3
    at java.awt.color.ICC_ColorSpace.toRGB(ICC_ColorSpace.java:191)
    at org.apache.pdfbox.pdmodel.graphics.color.PDICCBased.toRGB(PDICCBased.java:350)
    at org.apache.pdfbox.rendering.PageDrawer.getPaint(PageDrawer.java:335)
    at org.apache.pdfbox.rendering.PageDrawer.getNonStrokingPaint(PageDrawer.java:708)
    at org.apache.pdfbox.rendering.PageDrawer.fillPath(PageDrawer.java:808)
    at org.apache.pdfbox.contentstream.operator.graphics.FillEvenOddRule.process(FillEvenOddRule.java:37)
    at org.apache.pdfbox.contentstream.PDFStreamEngine.processOperator(PDFStreamEngine.java:875)
    at org.apache.pdfbox.contentstream.PDFStreamEngine.processStreamOperators(PDFStreamEngine.java:509)
    at org.apache.pdfbox.contentstream.PDFStreamEngine.processStream(PDFStreamEngine.java:483)
    at org.apache.pdfbox.contentstream.PDFStreamEngine.processPage(PDFStreamEngine.java:156)
    at org.apache.pdfbox.rendering.PageDrawer.drawPage(PageDrawer.java:269)
    at org.apache.pdfbox.rendering.PDFRenderer.renderImage(PDFRenderer.java:321)
    at org.apache.pdfbox.rendering.PDFRenderer.renderImage(PDFRenderer.java:243)
    at org.apache.pdfbox.rendering.PDFRenderer.renderImage(PDFRenderer.java:203)
    at org.apache.pdfbox.rendering.PDFRenderer.renderImage(PDFRenderer.java:190)

Вот код, который я использовал для разделения файла:


try (PDDocument document = PDDocument.load(new File("updated_test.pdf"))) {
    PDPageTree pdPages = document.getDocumentCatalog().getPages();
    PDFRenderer pdfRenderer = new PDFRenderer(document);

    int page = 0;
    for (PDPage pdPage : pdPages) {
        String fileName = "demo" + page + ".png";

        File tempImg = new File(fileName);

        BufferedImage bim = pdfRenderer.renderImage(page);
        ImageIOUtil.writeImage(bim, tempImg.getAbsolutePath(), 150);

        page++;
    }
} catch (Exception e) {
    e.printStackTrace();
}

А вот Фактический файл, который вызывает проблему: https://stackoverflowuploads.s3-us-west-2.amazonaws.com/updated_test.pdf

Любая помощь, идеи и советы будут высоко оценены, если у вас есть идеи относительно других решений / библиотек, которые могут достичь тех же результатов, что и те, было бы очень полезно. Спасибо!

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

Это было исправлено в PDFBOX-4801 и доступна сборка снимков здесь внизу.

Это будет в 2.0.20, что скорее всего, выйдет летом (надеюсь).

Причина - неверное значение / N (3) в словаре профиля CMYK I CC. Правильное значение должно было быть 4. Это приводит к упомянутому исключению позже. Исправленный код проверяет профиль I CC и корректирует значение объекта PCICCBased.

0 голосов
/ 20 марта 2020

Вау, спасибо Тильман Хаушерр , исходя из вашего комментария, я в основном сделал то, что вы предложили, но в Java как временное исправление, пока у вас не появится возможность сделать снимок версии:

FileInputStream fileInputStream = new FileInputStream(new File("updated_test.pdf"));
File file = new File("updated_test2.pdf");

if (file.exists()) {
    file.delete();
}

FileOutputStream fileOutputStream = new FileOutputStream(new File("updated_test2.pdf"));
int i;

long m = 0;
char prev1 = '-';
char prev2 = '-';
char prev3 = '-';
while ((i = fileInputStream.read()) != -1) {
    if (prev3 == '/' && prev2 == 'N' && prev1 == ' ' && i == '3') {
        fileOutputStream.write('4');
    } else {
        fileOutputStream.write(i);
    }

    prev3 = prev2;
    prev2 = prev1;
    prev1 = (char)i;

    m++;
}

fileOutputStream.flush();
fileOutputStream.close();

try (PDDocument document = PDDocument.load(new File("updated_test2.pdf"))) {
    PDPageTree pdPages = document.getDocumentCatalog().getPages();
    PDFRenderer pdfRenderer = new PDFRenderer(document);

    int page = 0;
    for (PDPage pdPage : pdPages) {
        String fileName = "demo" + page + ".png";

        File tempImg = new File(fileName);

        BufferedImage bim = pdfRenderer.renderImage(page);
        ImageIOUtil.writeImage(bim, tempImg.getAbsolutePath(), 150);

        page++;
    }
} catch (Exception e) {
    e.printStackTrace();
}

Большое спасибо за оперативную помощь!

...