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

Insert page number in each page of PDF file via Ghostscript

目前我正在开发一项功能,该功能将通过 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

调用watermark的命令几乎一样,只是改变了第二个参数:

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

我正在尝试向此 "pages.ps" 文件插入参数以便动态打印页面。像这样:

550 820 moveto (attr[0]) show

然后像这样通过命令行调用:

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

不幸的是,这不起作用!

我为此苦苦挣扎了好几天,如有任何帮助,我们将不胜感激。任何其他方法也会有所帮助。

干杯!

您还没有说明它为什么不起作用,也没有发布任何示例来说明问题所在,或者确实发布了 'pages.ps'.

的竞争示例

您的 show 命令 550 820 moveto (attr[0]) show 将执行的是按字面意思打印用户 space.

中 55,820 处的文本 'attr[0]'

您期望它做什么?

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

使用ARGUMENTS

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

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

然后程序可以将这些参数作为字符串数组访问,称为 ARGUMENTS

%!
ARGUMENTS ==

这个程序会打印

[ (1) (2) (3) ]

对于上面的输入。

使用 -d-s

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

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

$ 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".

这样的小片段