目前,我正在开发一项功能,该功能将通过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
不幸的是,这不起作用!
我挣扎了好几天,任何帮助都会受到赞赏。任何其他方法也会有所帮助。
干杯!
答案 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]'。
你期望它做什么?