确定后记中的页面方向

问题描述 投票:0回答:2

我需要使用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.pdfoutput.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
pdf ghostscript postscript
2个回答
0
投票

首先,您应该升级Ghostscript的版本。 9.25较旧,并且具有安全漏洞。

第二,您需要同时查看页面设备字典中的/ Orientation / PageSize条目。不仅如此,您还应该使用PageSize来确定用于“调整”的翻译。除非您处于固定的工作流程中(如果您正在接收混合的方向文件,这似乎不太可能),那么您不应假定媒体为A4。

Ghostscript PDF解释器查看PDF文件每一页上的MediaBox,并重置页面设备字典中的/ PageSize以匹配该页面的MediaBox。如果PDF页面具有/ Rotate条目,则它将(IIRC)永不设置/ Orientation,然后将其应用于MediaBox和页面内容。

因此,您实际上只需要查看所请求媒体的宽度和高度,这由页面设备字典中的/ PageSize数组给出。

现在已经说了。...

您说'即使对于横向模式页面,宽度也小于高度'。对于我来说,这似乎不太可能,但是在没有示例的情况下,很难说出来。这也使任何人都很难提供任何建议。

我建议您将示例上传到某处,然后在此处发布URL,以便我们查看文件。

哦,我真的建议您不要将输出文件发送到stdout。这可能对您来说很方便,但是pdfwrite设备已经具有某些功能,如果您这样做就根本无法使用(它们要求输出文件是可搜索的),将来可能还会有更多情况。


0
投票

“但是我无法确定页面何时处于横向模式还是纵向模式”

$ 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。

© www.soinside.com 2019 - 2024. All rights reserved.