将 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 中的集成。所以其他人更快:-)
我想将 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 中的集成。所以其他人更快:-)