【问题标题】:How do I make ghostscript output a single specific page from a postscript file as a png?如何使 ghostscript 将 postscript 文件中的单个特定页面输出为 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 脚本输入案例中就没有任何作用。输出与标志不存在时相同。

【问题讨论】:

    标签: linux ghostscript postscript


    【解决方案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 规范,可以为独立页面调用正确的代码,但很少有文件会携带。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-02
      • 2011-03-22
      • 2021-01-15
      • 2011-09-21
      • 1970-01-01
      • 2016-03-11
      • 2014-07-17
      • 1970-01-01
      相关资源
      最近更新 更多