合并两个后记时 ghostscript 不保留页面级别参数

Posted

技术标签:

【中文标题】合并两个后记时 ghostscript 不保留页面级别参数【英文标题】:ghostscript not retaining page level parameter while merging two postscripts 【发布时间】:2020-10-02 22:08:56 【问题描述】:

我已经使用 ghostscript 将 pdf 文件转换为 postscript,在转换时,我已经为 duplex 选项传递了页面级参数,如下所示。

gswin32c.exe -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE=output.ps \
  -c "<</PSPageOptions [ (<</Duplex false>> setpagedevice) 
  (<</Duplex true>> setpagedevice) (<</Duplex true>> setpagedevice) ] 
  /LockDistillerParams true>> setdistillerparams" -f input.pdf

上述命令参考解决方案链接:https://***.com/a/64128881/13696415

现在,我为 2 个 pdf 文件添加了双工参数并转换为 2 个单独的 postscript,问题是,当我将这些 pdf 与 Ghostscript 合并时,它丢失了我在转换为 ps 时传递的页面级参数。我尝试了以下建议的答案来合并后记。 https://***.com/a/3445325/13696415 为什么在合并时它会丢失添加的参数?合并时如何保留页面级别参数?请有人帮忙。

【问题讨论】:

【参考方案1】:

我可以确认 setpagedevice 的 %%BeginPageSetup 条目在合并 2 个 postscript 文件时丢失。甚至 /LockDistillerParams 也无法保存设置。只需使用 ghostscript ps2write 设备再次运行 postscript 文件,就会导致输出放弃以前的设置。我怀疑如果 /PSPageOptions 丢失重做它们,ghostscript 每次都会重写这些。我不知道合并时保存设置的方法。

我尝试了另外两种效果不错的技术。

(1) 合并 2 个 postscript 文件,然后使用 ps2write 设备将所需的设置写入合并后的 postscript 文件。

gs -dBATCH -dNOPAUSE -sDEVICE=ps2write -sOutputFile=merged.ps -f file1.pdf file2.pdf
gs -dBATCH -dNOPAUSE -sDEVICE=ps2write -sOutputFile=merged-out.ps -c ' << /PSPageOptions [ (<</Duplex false>> setpagedevice) (<</Duplex true>> setpagedevice) (<</Duplex true>> setpagedevice) ] /LockDistillerParams true >> setdistillerparams ' -f merged.ps

(2) 使用 ghostscript 使用 ps2write 设备合并 2 个 pdf 文件,并使用包含的 /PSPageOptions setdistillerparams 进行多合一操作。我发现这仅适用于某些 pdf 文件。如果 pdf 文件是使用我的 Firefox 使用的 cairographics 库生成的,即使使用 ghostscript 重新蒸馏,这也不起作用。

我在这里的测试是针对两个 12 页表现良好的 pdf 文件。结果根据需要在第 13 页显示 % page3 字符串。可以根据需要更改字符串以使用 setpagedevice:

gs -dBATCH -dNOPAUSE -sDEVICE=ps2write -sOutputFile=file1+2.ps -c '<< /PSPageOptions [(% page1)(% page2)(% page3)(% page4)(% page5)] /LockDistillerParams true >>setdistillerparams' -f file1.pdf file2.pdf

附:请编辑您的原始帖子以显示正确的 sDEVICE 标注。根据用户的不同,反斜杠可以省略。

【讨论】:

感谢您的意见。我已经尝试过这种方法。它对我有用。但问题是,我们至少有 1000 个文档要转换为 PS 并插入双工参数。平均而言,每个文档将有 3 页,因此我们必须传递 3000 个双工参数,例如 (> setpagedevice)。甚至我也尝试通过编写一个 python 程序来通过原始 Ghostscript 命令附加参数来传递 3000 个参数,但它失败并出现错误“参数列表太长”。 报错“Argument list too long”的原因是Linux命令行的参数长度有限制。为了增加这个限制,我们需要改变一个配置文件和最大长度基于服务器堆栈内存。unix.stackexchange.com/a/45584。这种方法对我没有帮助。 除了Ghostscript之外,还有其他可以合并PS的软件吗?我尝试过使用 pdftops,结果与 Ghostscript 相同,丢失了现有参数。然后找到了一个叫做“psjoin”的工具,它可以在不丢失参数的情况下进行合并,但是它会使PS文件非常大,并且需要花费很多时间来合并许多文件。当我测试时,合并 1000 个文件需要 4 小时。但在实时情况下,我们可以预期的文件数量会比这更多。所以我也放弃了这个。如果您发现任何其他工具,请告诉我。 关于原帖的反斜杠,有人编辑并添加了反斜杠以避免水平滚动。

以上是关于合并两个后记时 ghostscript 不保留页面级别参数的主要内容,如果未能解决你的问题,请参考以下文章

Ghostscript - 后记代码的缩进

使用 Ghostscript 将 PDF 转换为 TIFF 时保留页面尺寸

合并时批处理文件不会运行(在批处理文件中退出 ghostscript

排序时保留 JSON 数组

使用 GhostScript 打印 PDF

使用 Ghostscript 打印时页面裁剪和旋转不正确