如何使 ghostscript 将 postscript 文件中的单个特定页面输出为 png?

Posted

技术标签:

【中文标题】如何使 ghostscript 将 postscript 文件中的单个特定页面输出为 png?【英文标题】:How do I make ghostscript output a single specific page from a postscript file as a png? 【发布时间】:2011-04-17 03:26:04 【问题描述】:

我正在尝试将 ghostscript 用于其预期目的,以解释 postscript 文件和输出 png。我想要一个将单个特定页面从多页 ps 文件转换为单个 png 的命令。在 infile 是 pdf 文件的情况下,我已经完成了这一点,但在 infile 是 ps 的情况下却没有。

这一行会将一个 ps 转换为一个文件,该文件由连接的 png 文件组成。

gs -dSAFER -dBATCH -sDEVICE=png256 -r96x96 -sOutputFile=out.png in.ps

这将从 pdf 中获取单个特定页面并将其转换为 png。

gs -q -dSAFER -dBATCH -dFirstPage=2 -dLastPage=2 -sDEVICE=png256 -SOut=fileout.png in.pdf

只需将 dFirstPage= 标志放在 post 脚本输入案例中就没有任何作用。输出与标志不存在时相同。

【问题讨论】:

【参考方案1】:

您可以使用 PostScript 执行此操作,无论文件是否符合 DSC,只要您知道您想要哪个页面。

一个自定义的 EndPage 过程将完成这项工作。 EndPage 为作业中的每一页调用,并且该过程必须返回一个布尔值,如果为 true,则该页被传输到设备进行打印,如果为 false,则该页被消耗并丢弃。

<<
/EndPage 
  0 eq        %% reason code is 0 for showpage   
    5 eq      %% 5 is just an example, you would put your page# minus 1 here
      true
    
      false
    ifelse
   
    pop        %% remove the count of pages from the stack
    false
  ifelse

>> setpagedevice

这会测试原因代码以确保它为 0(显示页面),然后检查显示页面到目前为止的执行次数,看看它是否是我们的目标,如果是,我们将 true 放入堆栈并返回。对于任何其他条件,我们输入 false 并返回。

只有在您退出解释器时才会重置页数,因此如果您在不重新启动解释器的情况下背靠背运行两个文件,那么这只对第一个文件有效。

【讨论】:

我认为您可能在内部块之后缺少 if 或 ifelse 运算符。 是的,看起来应该在第一个“假”之后的某个地方有一个。【参考方案2】:

与 PDF 不同,并非所有 postscript 文件都可以以随机顺序访问其页面。您尝试处理的文件可能就是这种情况。 (否则,这些标志应在文档中标记为“不适用于 postscript”)。

我认为最简单的方法是先将您的 PS 文件转换为 PDF,然后从生成的 PDF 中提取页面。

由于您在 Linux 上,您可以使用辅助脚本“ps2pdf”,它在下面使用 ghostscript(但在大多数发行版中是“ps-tools”或类似名称的包的一部分) - 或者只是找出gs命令行进行转换。

另一种方法是生成所有页面,直到您想要的最后一个页面,并删除第一个不需要的页面。

这是由于 postscript 本身的性质造成的:postscriptp 文件只是一个计算机程序,它设置许多内部状态,呈现页面并调用 showpage 函数 - 然后开始呈现下一页 - 所以,根据文件,外部工具无法知道哪些语句是所有页面状态的一部分,哪些仅用于呈现页面。在较新的规范下,有一些可选的数据结构,继承自 PDF 规范,可以为独立页面调用正确的代码,但很少有文件会携带。

【讨论】:

以上是关于如何使 ghostscript 将 postscript 文件中的单个特定页面输出为 png?的主要内容,如果未能解决你的问题,请参考以下文章

ImageMagick PDF 委托失败,GhostScript 丢失

Ghostscript.NET 图片文字质量问题

如何将外部字体添加到 ghostscript?

让 Graphic Magick 检测 Ghostscript 以在 Windows 上阅读 pdf。如何将 WINDOWS CMD 上的 Ghostscript 调用名称更改为“gs”?

Ghostscript:如何将 STDIN 自动裁剪为“边界框”并写入 PDF?

链接到使用 GhostScript 创建的 PDF 页面