我需要使用Ghostscript在PDF文档的每一页的左下角添加一个白色矩形和一些文本。为此,我创建了以下Postscript脚本:
<<
/EndPage
{
2 eq { pop false }
{
newpath
0 0 moveto
0 20 lineto
200 20 lineto
200 0 lineto
closepath
%%gsave
1 setgray
fill
%%grestore
1 setlinewidth
0 setgray
stroke
gsave
/Times-Roman 9 selectfont
30 5 moveto
(My text) show
grestore
true
} ifelse
} bind
>> setpagedevice
与Ghostscript命令结合使用时效果很好:
gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=output.pdf my_script.ps input.pdf
但是,如果input.pdf处于横向模式,则白框和文本将打印在左上角而不是左下角。我可以通过添加以下内容使其起作用:
90 rotate 0 -595 translate
但是我无法确定页面何时处于横向模式还是纵向模式。我可以获得页面的宽度和高度,但是即使对于横向模式页面,其宽度也小于高度。我尝试了以下操作,但失败了:
/orient currentpagedevice /Orientation get def
我已经坚持了一段时间。非常感谢您的帮助!
(Ghostscript版本为9.25)
[更新]
为了说明在横向模式下页面的宽度如何小于高度,这是我正在使用的script.ps:https://gist.github.com/irinkaa/9faadf30b3a5a381a0b621d72b712020
这是input.pdf和output.pdf。如您所见,612.0 - 792.0
打印在输出文件内部,显示宽度(612)
当我在输出文件上重新运行相同的命令时,它会打印相同的宽度和高度值,但随后将该框正确放置在左下角。
当我在脚本中添加以下内容时:
/orient currentpagedevice /Orientation get def
我收到一条错误消息,提示未设置方向(如果我理解正确):
Error: /undefined in --get--
Operand stack:
orient --dict:212/312(ro)(L)-- Orientation
Execution stack:
%interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push 1999 1 3 %oparray_pop 1998 1 3 %oparray_pop 1982 1 3 %oparray_pop 1868 1 3 %oparray_pop --nostringval-- %errorexec_pop .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval--
Dictionary stack:
--dict:977/1684(ro)(G)-- --dict:0/20(G)-- --dict:80/200(L)--
Current allocation mode is local
Current file position is 151
GPL Ghostscript 9.25: Unrecoverable error, exit code 1
首先,您应该升级Ghostscript的版本。 9.25较旧,并且具有安全漏洞。
第二,您需要同时查看页面设备字典中的/ Orientation 和 / PageSize条目。不仅如此,您还应该使用PageSize来确定用于“调整”的翻译。除非您处于固定的工作流程中(如果您正在接收混合的方向文件,这似乎不太可能),那么您不应假定媒体为A4。
Ghostscript PDF解释器查看PDF文件每一页上的MediaBox,并重置页面设备字典中的/ PageSize以匹配该页面的MediaBox。如果PDF页面具有/ Rotate条目,则它将(IIRC)永不设置/ Orientation,然后将其应用于MediaBox和页面内容。
因此,您实际上只需要查看所请求媒体的宽度和高度,这由页面设备字典中的/ PageSize数组给出。
现在已经说了。...
您说'即使对于横向模式页面,宽度也小于高度'。对于我来说,这似乎不太可能,但是在没有示例的情况下,很难说出来。这也使任何人都很难提供任何建议。
我建议您将示例上传到某处,然后在此处发布URL,以便我们查看文件。
哦,我真的建议您不要将输出文件发送到stdout。这可能对您来说很方便,但是pdfwrite设备已经具有某些功能,如果您这样做就根本无法使用(它们要求输出文件是可搜索的),将来可能还会有更多情况。
“但是我无法确定页面何时处于横向模式还是纵向模式”
$ gs -sDEVICE=bbox -dNOPAUSE -dBATCH input.pdf | grep %B
%%BoundingBox: -1 0 842 596
%%HiResBoundingBox: -0.008930 0.018000 841.988998 595.223982
%%BoundingBox: -1 0 842 596
%%HiResBoundingBox: -0.008930 0.018000 841.988998 595.223982
然后您可以根据需要创建一个script-portrait.ps和一个script-landscape.ps。