为啥通过 ghostscript API 渲染图像需要这么多时间?

Posted

技术标签:

【中文标题】为啥通过 ghostscript API 渲染图像需要这么多时间?【英文标题】:why does image rendring through ghostscript API takes so much time?为什么通过 ghostscript API 渲染图像需要这么多时间? 【发布时间】:2013-09-26 07:14:07 【问题描述】:

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

问题是渲染过程需要两分钟以上才能生成一张图像,虽然通过命令行需要一秒钟,但我试图通过 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】:

有几件事会减慢“渲染”过程。

首先,这不是由于Ghostscript,Ghostscript本身的工作原理是一样的,无论是通过命令行还是API执行都没有关系。

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

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

    首先pdf文档被iText加载和解析。 然后通过将加载的 pdf 文档写回磁盘到新位置来制作完整文档的副本。 然后 Ghostscript 被初始化。 然后 Ghostscript 再次从新位置加载、解析和呈现文档。 对于每个页面,Ghostscript 都在调用 ghost4j 显示设备回调。 对于每个显示设备回调,ghost4j 从内存中获取光栅化页面并将其存储到磁盘。 结束。

周部分是 iText 和使用的显示设备回调。我认为可以通过让 Ghostscript 处理光栅化结果存储而不是从 Java 手动执行来提高速度...

我想现在你可以明白为什么会注意到速度差异了。

【讨论】:

谢谢你的解释,但是你能解释一下这句话吗? “让 Ghostscript 处理光栅化结果存储,而不是从 Java 手动执行” 是的,我想说的是简单地调用 Ghostscript.initialize(String[] args) 其中 args 将是你的命令行参数。 好的,你已经回答了我的问题:) 但是根据link,它首先将其转换为 input.ps 然后显示回调,你认为它为什么会这样做? 链接中的样本实际上是两个独立的样本。第一个展示了如何通过让 Ghostscript 负责将输出文件保存到磁盘来将 input.ps 转换为 output.pdf。第二个显示如何将 postscript 文件光栅化到内存中,仅此而已。第二个示例中的光栅化页面图像需要您自己处理,因为示例显示它正在使用 ImageIO.write() 将光栅化页面存储到磁盘。

以上是关于为啥通过 ghostscript API 渲染图像需要这么多时间?的主要内容,如果未能解决你的问题,请参考以下文章

可以用ghostscript显示渲染PS文件的进度吗?

Ghostscript:获取用于从 PDF 渲染的 CMYK 值

为啥 UIImageWriteToSavedPhotosAlbum 渲染后会保存红色图像?

为啥 Powerbuilder 12.5.2 需要 ghostscript 来创建 PDF?

Ghostscript:为啥我必须为 PDF/A 转换提供 pdfa_def.ps?

为啥使用 pdfmark /BP、/EP、/SP 的 ghostscript 快得多?