使用pdfbox将pdf转换为png时文本周围的红色区域

时间:2019-01-21 17:15:18

标签: java pdf pdfbox

我正在尝试使用pdfbox将pdf转换为png文件。不幸的是,结果是在输出的某些地方出现了奇怪的红色区域。我不确定是什么问题。仅有一些pdf文件是一个问题。

以下是我正在使用的一些代码:

    public static BufferedImage generateFromPdf(String ref, InputStream stream, int pageIndex, PreviewMode mode) throws IOException {
        PDDocument doc = null;
        try (InputStream buffered = new BufferedInputStream(stream)) {
            doc = PDDocument.load(buffered, PDF_LOADING_MEMORY_SETTING);
            if (pageIndex > doc.getNumberOfPages()) {
                return null;
            }
            PDFRenderer renderer = new PDFRenderer(doc);
            return rasterizePdfBox(ref, pageIndex, renderer, mode);
        } finally {
            if (doc != null) {
                doc.close();
            }
        }
    }

然后:

    private static BufferedImage rasterizePdfBox(String ref, int pageIndex, PDFRenderer renderer, PreviewMode mode) throws IOException {
        Future<BufferedImage> result = executorService.submit(() -> {
            LOGGER.info(String.format("Generate preview for ref: %s, page: %s, mode: %s ", ref, pageIndex, mode.name()));
            return renderer.renderImageWithDPI(pageIndex - 1, mode.getDpi(), ImageType.RGB);
        });

        try {
            return result.get();
        } catch (InterruptedException | ExecutionException e) {
            LOGGER.error(String.format("Error when generating preview: %s", e.getMessage()));
            Thread.currentThread().interrupt();
            throw new IOException(e.getMessage());
        }
    }

到目前为止,我只发现当我在Linux上的Master PDF editor中打开输出时,红色的位置是空白的。尽管当我用Document Viewer打开它们时,它们似乎很正常。

一些提示: -有问题的pdf已被扫描。我可以在工作部分周围选择文本,但不能在上面有红色覆盖的地方选择文本。也许与OCR问题有关? -如果我使用linux工具convert not-working-pdf.pdf converted.pdf,然后尝试将此文件转换为png,则问题不再存在。

png output after converting pdf

这是一个示例文件:https://ufile.io/3or9l

pdfbox版本:2.0.13

1 个答案:

答案 0 :(得分:1)

这是一个PDFBox错误,原因是带有蒙版的双色调图像,这是不寻常的。光栅中只有一个颜色元素,因此仅应用了“ R”,而不是所有3个RGB目标。因此,白色显示为红色。

有关此问题PDFBOX-4470中的错误的更多详细信息,将在版本2.0.14中修复。在此之前,您可以使用snapshot