为啥通过 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:获取用于从 PDF 渲染的 CMYK 值
为啥 UIImageWriteToSavedPhotosAlbum 渲染后会保存红色图像?
为啥 Powerbuilder 12.5.2 需要 ghostscript 来创建 PDF?