Ghostscript使用bbox来裁剪Postscript文件。

3
我想要实现的是使用 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

这个命令的问题在于我必须指定要使用的宽度和高度。我希望的是通过代码或使用某些命令行重定向方式,先调用,然后再调用这个语句。


解析输入文件、读取BB行并创建适当的gs命令非常简单。具体细节将取决于您想使用的编程语言。 - agentp
在Postscript中,bbox行不正确,因此我需要使用bbox命令来查找正确的bbox。然后根据bbox的输出创建gs命令。 - SuNnY_sYeD
这是Windows的cmd.exe shell吗?我可能可以帮忙处理bash和awk,但目前对Windows不是很熟悉。 - luser droog
那么你需要运行两次gs,第一次使用-sDEVICE=bbox参数解析输出,然后再使用pdf设备。更令人满意的选择是深入pdf设备驱动程序并给它一个选项来实现你想要的功能... - agentp
我尝试通过包含“>> out.txt”来重定向gs命令的输出,但似乎无法捕获bbox输出,因为该命令调用了一个shell。 - SuNnY_sYeD
@user1864948:请查看我的答案,关于如何在文件中捕获bbox信息的问题。 - Kurt Pfeifle
1个回答

4
首先,需要注意的是,并非来自多页PostScript文件的每个页面都会显示完全相同的“边界框”值(事实上,这相当罕见)。因此,您可能希望找到跨所有可能的边界框的“公共分母”(包括它们所有)。
其次,在运行gs -sDEVICE=bbox时,控制台窗口中看到的是stdinstdout输出通道的混合。然而,您需要的信息将会发送到stderr。如果您将命令输出重定向到文件,则捕获的是stdout而不是stderr!为了防止一些版本和调试信息进入到stderr中,请在命令行添加-q
因此,为了获取所有页面的边界框的“干净”输出,您必须首先重新定向stderr通道,然后再将其捕获到文件info.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代码来进行裁剪操作:

我正在使用Windows,因此无法使用grep和tee命令来重定向stderr。 - SuNnY_sYeD
@user1864948:在Windows上,你可以使用findstr "%%Bound"代替grep。而不是使用tee,你可以使用普通的重定向:1> info.txt - Kurt Pfeifle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接