通过Ghostscript在PDF文件的每个页面中插入页码

时间:2018-05-14 16:47:36

标签: pdf ghostscript postscript

目前,我正在开发一项功能,该功能将通过ghostscript在PDF中插入页码。作为第一种方法,我尝试按照与在每个文件的页面中插入水印相同的命令进行操作 - 如下所示:

gs -dBATCH -dNOPAUSE -dSAFER -sDEVICE=pdfwrite -sOutputFile=out.pdf watermark.ps in.pdf

在这种情况下,水印将打印在每个文件的页面中 - 这是我所期望的行为。然而,对于打印每页中的页码是一个增量数字,它将在每一页中打印,例如,对于每一页,应打印不同的数字。目前,我的代码如下所示:

<<
   /EndPage
   {
     2 eq { pop false }
     {
         gsave      
         /Arial 8 selectfont
         550 820 moveto (page 1) show
         grestore
         true
     } ifelse
   } bind
>> setpagedevice

调用它的命令几乎与水印相同,只是更改第二个参数:

gs -dBATCH -dNOPAUSE -dSAFER -sDEVICE=pdfwrite -sOutputFile=out.pdf pages.ps in.pdf

我试图在这个&#34; pages.ps&#34;中插入参数。文件以便动态打印页面。像这样:

550 820 moveto (attr[0]) show

并通过命令行调用:

gs -dBATCH -dNOPAUSE -dSAFER -sDEVICE=pdfwrite -sOutputFile=out.pdf pages.ps "pageNumber" in.pdf

不幸的是,这不起作用!

我挣扎了好几天,任何帮助都会受到赞赏。任何其他方法也会有所帮助。

干杯!

2 个答案:

答案 0 :(得分:1)

从您的命令行,在我看来,您正在尝试将参数传递给 命令行中的postscript程序。有几种方法可以做到这一点。

使用ARGUMENTS

当您使用--参数调用时,Ghostscript会有一种特殊行为。

$ gs -q -- prog.ps 1 2 3

然后程序可以将这些参数作为一个名为ARGUMENTS的字符串数组来访问。

%!
ARGUMENTS ==

此程序将打印

[ (1) (2) (3) ]

用于上述输入。

使用-d-s

这种方式可能更适合您的需求。在继续执行命令行的下一个元素之前,可以使用-sname=string执行等效的/name (string) def。使用-s表示字符串,-d表示需要扫描和解释的任何其他类型的postscript令牌。

所以你可能想做这样的事情:

$ gs -dBATCH -dNOPAUSE -dSAFER -sDEVICE=pdfwrite -sOutputFile=out.pdf -sattr=pageNumber pages.ps in.pdf

然后page.ps可以像attr一样访问此字符串。无论如何,PostScript数组索引不会使用[0],而是使用get运算符。

使用-c

您还可以使用-c选项执行-c"/attr (pageNumber) def"这样的小片段。

答案 1 :(得分:0)

您尚未说明它是如何工作的,或者发布了任何示例来说明问题所在,或者确实发布了'pages.ps'的竞争示例。

您的show命令550 820 moveto (attr[0]) show将执行的操作是在用户空间中的点5520处打印文本'attr [0]'。

你期望它做什么?