将 PDF 转换为 PNG - Java 10 给出的结果与 Java 8 不同

Convert PDF to PNG - Java 10 gives a different result than Java 8

我想将 PDF 转换为 PNG 文件。 但由于某些原因,Java 10 给出的 PNG 与 Java 8

不同
private static void writeImageToPath(String sourcePath, String path, int pageWidth, int pageHeight) throws IOException 
{

    File sourceFile = new File(sourcePath);
    PDDocument document = PDDocument.load(sourceFile);
    PDFRenderer renderer = new PDFRenderer(document);
    BufferedImage buff= renderer.renderImage(0, 1, ImageType.ARGB);
    File outputfile = new File(path);
    Image image = buff.getScaledInstance(pageWidth, pageHeight, Image.SCALE_SMOOTH);
    BufferedImage bufferedImage = new BufferedImage(pageWidth, pageHeight, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2d = bufferedImage.createGraphics();
    g2d.drawImage(image, 0, 0, null);
    g2d.setColor(Color.BLACK);
    g2d.dispose();
    ImageIO.write(bufferedImage, "png", outputfile);
}

我了解到压缩设置在 Java 9 PNG writer 中发生了变化,所以这可能就是我看到 Java 8 不同结果的原因。https://github.com/gredler/jdk9-png-writer-backport

你知道我该如何解决这个问题吗?

提前致谢!!

tl;dr:接受它。

jdk 版本之间的渲染通常略有不同。对于jdk8,建议使用柯达CMS色彩管理系统(见Getting started),因为新的LittleCMS速度很慢,而柯达CMS在jdk10中不再可用,所以现在使用 Little CMS。渲染结果的颜色略有不同(通常更好)。曲线绘制也可能略有不同。

多年来,我一直在 PDFBox 上进行 运行 像素差异测试(以检测回归),我习惯了微小的差异。请参阅源代码中的 TestPDFToImage.java...忽略最大为 3 的像素差值。

即便如此,仍然存在细微差异,这使得回归测试变得困难。当我使用新的 java 版本测试 PDFBox 时(查看是否有任何需要注意的地方),我对视觉差异文件进行了目视检查。这需要很多时间(这些测试是在 1000 多个 PDF 文件上完成的)。

不同 OS 甚至具有相同 OS 的不同计算机之间也存在视觉差异,因为安装的字体不同。

这就是我切换到 pngj 的部分原因。由于该库是稳定的(除非我升级或更改某些内容),所以我得到了稳定的结果。它比旧的 PNGWriter 快约 100%,并且仍然比 PNGWriter 的向后移植版本快约 20%。我已经和 tilman 谈过将这段代码添加到 pdfbox 但我还没有时间去做。

有趣的是,我自己发现了 imageIO PNGWriter 的问题,并考虑对其进行修补,但后来看到您的 link 向后移植版本和 java9 中的集成。所以其他人更快:-)