Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is PDFBox PDFRenderer slow?

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

But it runs very slowly compared to ghostscript.

Here's my sample code

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.");
    }
}

The output is as follows

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

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

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

I've also already tried

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

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

Thanks for every idea, regards

Thomas

like image 458
tombo_189 Avatar asked Oct 27 '25 05:10

tombo_189


1 Answers

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

From Pdfbox docs,

PDFBox and Java 8

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

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:

Starting with -Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider or Calling

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

Sources:

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

like image 168
Sundararaj Govindasamy Avatar answered Oct 29 '25 20:10

Sundararaj Govindasamy