GhostScript 使用 bbox 裁剪 Postscript 文件

Posted

技术标签:

【中文标题】GhostScript 使用 bbox 裁剪 Postscript 文件【英文标题】:GhostScript use bbox to crop Postscript file 【发布时间】:2012-12-21 18:07:53 【问题描述】:

我想要完成的是使用 bbox 中描述的输出裁剪名为 example.ps 的 PostScript 文件。我在批处理过程中执行此操作,其中某些文件的 bbox 可能不同。我看过 pdfcrop 并看到它使用了类似的方法。这是我现在用来裁剪的命令。

gs -o cropped.pdf \
   -sDEVICE=pdfwrite \
   -dDEVICEWIDTHPOINTS=160 \
   -dDEVICEHEIGHTPOINTS=840 \
   -dFIXEDMEDIA \
   -c "0 0 translate 0 0 160 840 rectclip" \
   -f  example.ps

这个命令的问题是我必须指定要使用的宽度和高度。我想要发生的是一些如何首先调用 bbox 然后通过代码或使用某些命令行重定向来调用此语句。

【问题讨论】:

解析输入文件、读取 BB 行并编写适当的 gs 命令很简单。具体情况取决于您要使用的语言。 postscipt 中的 bbox 行不正确,所以我需要使用 bbox 命令找到正确的 bbox。然后根据 bbox 的输出创建 gs 命令。 这是windows cmd.exe shell?我可能会在 bash 和 awk 方面提供帮助,但目前我对 windows 不太了解。 那么你运行 gs 两次,首先使用 -sDEVICE=bbox,解析输出,然后再次使用 pdf 设备。一个更令人满意的选择是深入研究 pdf 设备驱动程序并给它一个选项来做你想做的事...... 我尝试通过包含“>> out.txt”来重定向 gs 命令的输出,但我似乎无法捕获 bbox 输出,因为该命令调用了一个 shell。 【参考方案1】:

首先,请注意,并非多页 PostScript 文件中的每一页都会显示完全相同的“边界框”值(事实上,这种情况很少见)。因此,您可能想找出所有可能的边界框(包括所有边界框)的公分母

其次,当您运行gs -sDEVICE=bbox 时,您在控制台窗口中看到的是stdinstdout 输出通道的混合。但是,您要获取的信息将发送到 stderr。如果你将命令输出重定向到一个文件,你捕获的是 stdout,而不是 stderr!要禁止将某些版本和调试信息转到 stderr,请将 -q 添加到命令行。

因此,为了获得所有页面边界框的“干净”输出,您必须首先重定向 stderr 通道,然后将其捕获到文件 info.xml 中。 txt。所以运行这样的命令(或类似的):

gs              \
  -dBATCH       \
  -dNOPAUSE     \
  -q            \
  -sDEVICE=bbox \
   example.ps   \
2>&1            \
| tee info.txt

甚至这个,如果你不需要关于HiResBoundingBox的信息:

gs              \
  -dBATCH       \
  -dNOPAUSE     \
  -q            \
  -sDEVICE=bbox \
   example.ps   \
2>&1            \
| grep ^%%Bound \
| tee info.txt

另外,顺便说一句,注意可以确定 PostScript 以及 PDF 输入文件的边界框。

这应该会为您提供如下输出,其中每一行代表输入文件的一个页面,从第一行的第 1 页开始:

 %%BoundingBox: 36 18 553 802
 %%BoundingBox: 37 18 553 804
 %%BoundingBox: 36 18 553 802
 %%BoundingBox: 37 668 552 803
 %%BoundingBox: 40 68 532 757

最后,您可能想阅读以下答案,了解有关 Ghostscript 的 bbox 设备的一些背景信息。您还可以在那里找到一些用于裁剪作业的替代 PostScript 代码:

PDF - Remove White Margins How to crop a section of a PDF file to PNG using Ghostscript

【讨论】:

我使用的是windows,所以我不能使用grep和tee命令来重定向stderr @user1864948:在 Windows 上,您可以使用 findstr "%%Bound" 而不是 grep。您可以使用普通重定向代替tee1> info.txt

以上是关于GhostScript 使用 bbox 裁剪 Postscript 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Ghostscript 将 AI(嵌入 PDF)裁剪为 PNG?

Ghostscript 删除裁剪框外的内容?

如何使用带有页面特定裁剪框数组的 ghostscript 裁剪多页 pdf

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

如何使用 ghostscript 在多页 pdf 中裁剪第 3 和第 4 页

ghostscript 裁剪 pdf 不正确