为什么通过ghostscript API进行图像渲染需要花费很多时间?

时间:2013-09-26 07:14:07

标签: java ghostscript

我正在使用Ghostscript通过java使用命令从PDF渲染图像,但是我正在尝试使用ghost4j-0.5.0.jar从PDF中运行Ghoscript进行图像渲染,下面的代码是我从{{3}获取的网站。

问题是渲染过程需要两分钟以上才能生成一个图像,虽然通过命令行需要一秒钟,但是我试图通过java运行所有东西,我想停止使用imagemagick和ghostscript作为工具,请注意,我很满意使用ghoscript,我不想使用任何其他工具,因为它为我提供了我需要的图像质量和尺寸, 使用的代码是,:

    public class SimpleRendererExample {

public static void main(String[] args) {
    imageRenderingFromPdf();
}

public static void imageRenderingFromPdf() {

    try {

         PDFConverter converter = new PDFConverter();
         PDFDocument doc;
        // load PDF document
        PDFDocument document = new PDFDocument();
        document.load(new File("d:/cur/outputfile.pdf"));
        // create renderer
        SimpleRenderer renderer = new SimpleRenderer();
        // set resolution (in DPI)
        renderer.setResolution(100);
        System.out.println("started");
        // render
        long before = System.currentTimeMillis();
        List<Image> images = renderer.render(document);
        long after = System.currentTimeMillis();

        System.out.println("reder " + (after - before) / 1000);
        // write images to files to disk as PNG
        try {
            before = System.currentTimeMillis();
            ImageIO.write((RenderedImage) images.get(0), "png", new File(
                    "d:/dd" + ".png"));
            after = System.currentTimeMillis();

            System.out.println("write " + (after - before) / 1000);
        } catch (IOException e) {
            System.out.println("ERROR: " + e.getMessage());
        }
    } catch (Exception e) {
        System.out.println("ERROR: " + e.getMessage());
    }

     }

1 个答案:

答案 0 :(得分:1)

有些事情会减慢“渲染”过程。

首先,它不是由于Ghostscript,Ghostscript由它的自身工作相同,如果它是通过命令行或API执行无关紧要。

速度差异是ghost4j渲染实现的结果。我刚检查了ghost4j的源代码,我发现它是iText和Ghostscript实现的混合体。

那么,您使用的代码如何工作:

  1. 首先,通过iText加载和解析pdf文档。
  2. 然后通过将加载的pdf文档写回磁盘到新地点来制作完整文档的副本。
  3. 然后Ghostscript被初始化。
  4. 然后Ghostscript第二次加载,解析并从新位置渲染文档。
  5. 对于每个页面,Ghostscript都在调用ghost4j显示设备回调。
  6. 对于每个显示设备回调,ghost4j从内存中获取光栅化页面并将其存储到磁盘。
  7. 结束。
  8. 周部分是iText并用于显示设备回调。我想通过让Ghostscript处理光栅化结果存储而不是从Java手动执行它来获得速度......

    我想你现在可以看到你注意到速度差异的原因了。