通过 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"
.
这样的小片段
目前我正在开发一项功能,该功能将通过 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.
您期望它做什么?
从你的命令行来看,在我看来你正试图将参数传递给 来自命令行的 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"
.