为什么 PDFBox PDFRenderer 很慢? [英] Why is PDFBox PDFRenderer slow?

查看:245
本文介绍了为什么 PDFBox PDFRenderer 很慢?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用 PDFBox 2.x 和 PDFRenderer 类将 PDF 转换为 TIFF.

I want to convert a PDF to a TIFF using PDFBox 2.x and the PDFRenderer Class.

但与 ghostscript 相比,它的运行速度非常慢.

But it runs very slowly compared to ghostscript.

这是我的示例代码

public class SpeedTest
{
    static long startTime = System.currentTimeMillis ();

    public static void logTime (String msg)
    {
        long now = System.currentTimeMillis ();
        System.out.println (String.format ("%.3f: %s", (now - startTime) / 1000.0, msg));
        startTime = now;
    }

    public static void main (String[] args) throws Exception
    {
        //System.setProperty ("sun.java2d.cmm", "sun.java2d.cmm.kcms.KcmsServiceProvider");

        String pdfFileName = args[0];
        String tiffFileName = args[1];

        PDDocument document = PDDocument.load (new File (pdfFileName));
        logTime (pdfFileName + " loaded.");
        PDFRenderer pdfRenderer = new PDFRenderer (document);
        logTime ("intitalized renderer.");
        BufferedImage img = pdfRenderer.renderImageWithDPI (0, 600, ImageType.RGB);
        logTime ("page rendered as image.");
        ImageIO.write (img, "TIFF", new File (tiffFileName));
        logTime ("image saved as TIFF.");
    }
}

输出如下

0.521: sample.pdf loaded.
0.013: intitalized renderer.
2.910: page rendered as image.
2.005: image saved as TIFF.

如您所见,对 pdfRenderer.renderImageWithDPI 的调用需要近 3 秒(同样 ImageIO.write-call 也需要 2 秒).

As you can see, the call to pdfRenderer.renderImageWithDPI takes almost 3 secs (also ImageIO.write-call takes 2 secs, too).

当使用 ghostscript 完成相同的任务时,整个任务在 0.4 秒内完成.

When done the same using ghostscript the complete task finishes in 0.4secs.

time gs -dQUIET -dBATCH -dNOPAUSE -sstdout=/dev/null -sDEVICE=tifflzw -r600 -dFirstPage=1 -dLastPage=1 -sOutputFile=sample.tif sample.pdf

real    0m0.389s
user    0m0.340s
sys     0m0.048s

我也试过了

System.setProperty("sun.java2d.cmm", "sun.java2d.cmm.kcms.KcmsServiceProvider");

因为我运行的是 Java 8(准确地说是 1.8.0_161),但这没什么区别.

as I'm running Java 8 (1.8.0_161 to be precise) but that makes no difference.

感谢您的每一个想法,问候

Thanks for every idea, regards

托马斯

推荐答案

升级2018年10月发布的JDK 1.8.0_191或JDK 9.0.4.

Upgrade to JDK 1.8.0_191 which was released on Oct, 2018, or JDK 9.0.4.

来自 Pdfbox 文档

From Pdfbox docs,

PDFBox 和 Java 8

在 Java 8 中使用 PDFBox 时的重要通知1.8.0_191 之前或 Java 9 9.0.4 之前

Important notice when using PDFBox with Java 8 before 1.8.0_191 or Java 9 before 9.0.4

由于java颜色管理模块向LittleCMS",用户体验色彩表现缓慢操作.一个解决方案是禁用 LittleCMS 以支持旧的KCMS(柯达色彩管理系统)由:

Due to the change of the java color management module towards "LittleCMS", users can experience slow performance in color operations. A solution is to disable LittleCMS in favor of the old KCMS (Kodak Color Management System) by:

-Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider 开始或打电话

System.setProperty("sun.java2d.cmm", "sun.java2d.cmm.kcms.KcmsServiceProvider")

来源:

https://bugs.openjdk.java.net/browse/JDK-8041125

这篇关于为什么 PDFBox PDFRenderer 很慢?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆