尝试转换为PNG时,Ghostscript打印出一堆编码的字符

时间:2013-07-10 11:39:07

标签: pdf ghostscript

我调用了以下GhostScript命令,目的是将输入pdf转换为一堆输出PNG图像(每页一个图像):

"C:\Program Files\gs\gs9.07\bin\gswin64c.exe" \
   -dNOPAUSE \
   -q \
   -r150 \
   -sDEVICE=png16m \
   -dBATCH \
   -c "30000000 setvmthreshold" \
   -dNumRenderingThreads=8 \
   -sOutputFile="C:\output-%d.png" \
    "C:\input.pdf"

当我在Windows命令提示符中运行此命令时,它突然从我的默认打印机中打印出一堆带有一堆编码字符的纸张。它不会产生任何类型的PNG图像。

更新 省略-q给出:

GPL Ghostscript 9.07 (2013-02-14)
Copyright (C) 2012 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 4.
Page 1
Page 2
Page 3
Page 4

更新2: 感谢KenS,我一次删除了一个部件,直到确认它是以下参数来打破它:

-c "30000000 setvmthreshold"

我在一个试图提高GS速度的不同论坛上得到了这个。我使用它错了还是我应该把它留下来? PDF将会非常庞大​​并且有100页,所以我需要尽可能地进行优化。有什么建议吗?

有人能指出我正确的方向吗? 感谢

3 个答案:

答案 0 :(得分:3)

我相信重写命令行以便更改参数的顺序并添加-f来表示输入文件应该可以使它工作:

"C:\Program Files\gs\gs9.07\bin\gswin64c.exe" -dNOPAUSE -q -r150 -sDEVICE=png16m -dBATCH  -dNumRenderingThreads=8 -sOutputFile=C:\output-%d.png -c "30000000 setvmthreshold" -f C:\input.pdf

How to use Ghostscript中的以下内容应该显而易见:

  

-c string ... 将参数解释为PostScript代码,直到以“-”开头,后跟非数字或“{”的下一个参数为止{1}}”。   例如,如果文件@只包含单词“quit.ps”,那么   命令行上的quit相当于-c quit。每个参数必须是有效的PostScript,或者是定义的单个标记   由标记运算符或包含有效PostScript的字符串。

     

quit.ps将非切换参数解释为要使用普通-f命令执行的文件名。由于这是默认值   行为,run仅用于终止令牌列表   -f切换。

答案 1 :(得分:2)

回答“为什么不使用NumRenderingThreads”的问题。

它很复杂: - )

PostScript是一种解释型语言,只能作为单个解释线程运行,因为状态可以随时改变,程序执行可以依赖于当前状态。由于您无法对解释器进行多线程处理,因此需要从程序开始处开始并继续执行。

因此,为了运行线程,我们将'clist'写成一种所谓的显示列表。这不是解释,它只是输出页面上的图形基元和位置列表,它是通过执行PostScript程序得出的。 NB clist是一个固定的分辨率,原来的Pos​​tScript程序不是,PostScript程序可以根据它执行的环境采取不同的动作,clist不能等等。

然后,我们将输出页面拆分为水平条纹,并使用clist为每个条带运行一个线程,以仅渲染位于该条带上的位。 clist允许多线程访问,因为它没有被解释,所以值不会改变。一些对象将跨越条纹并将(部分)渲染多次(这对于图像数据很重要)为了创建最终页面,我们将条纹拼接在一起。

这意味着总体上我们需要解释程序写入clist,多次读取clist创建多个条带,然后我们需要将它们重新组合在一起。

或者我们可以使用页缓冲区,一大块内存足以容纳整个输出。我们解释一次,并随着我们去渲染。我们不写一个clist,我们只渲染每个对象一次,我们不需要合并输出。毫不奇怪,这更快。

那么clist和多线程的重点是什么?在高分辨率下,大多数系统没有足够的内存来保持整个输出,所以我们 生成条纹并将它们拼接在一起,这意味着我们需要一个clist。如果我们必须沿着那条路走下去,那么NumRenderingThreads会更快。

在150 dpi时,除非你在建筑物的两侧打印横幅,否则情况不太可能如此: - )

所以NumRenderingThreads 可以更快,但在你的情况下几乎肯定不是。但无论如何它可能是如此之快,你无法分辨。

答案 2 :(得分:1)

1)不要使用NumRenderingThreads。在150 dpi时,这只会减慢速度。

2)我们需要查看一个示例文件来评论很多。

3)我无法确定这会导致您的默认打印机开始发送页面。

从更简单的事情开始,确实:

gswin64c input.pdf

做点什么?我希望打开一个窗口显示PDF文件的第一页,按回车键会显示下一页等等。