【发布时间】:2019-01-21 17:15:17
【问题描述】:
我正在尝试使用 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,那么问题就不再存在了。
这是一个示例文件:https://ufile.io/3or9l
pdfbox 版本:2.0.13
【问题讨论】:
-
请分享一个样本 pdf,该问题以可重现的方式出现。
-
似乎存在 PDFBox 将 Mask 应用于图像的问题。在示例文件中,图像 Im1 是带有 Mask 的 DeviceGray JBIG2 图像。红色区域正是应用蒙版后图像的可见区域。移除遮罩后,图像正确呈现为黑白。