我已经通过以下命令和gs脚本在.ps文档的每一页中添加了水印(或图像)。
[root@localhost ~]#gs -dBATCH -dNOPAUSE -q -sDEVICE=ps2write -sOutputFile=watermarked.ps mark.ps doc_test.ps
mark.ps的内容:
<<
/EndPage
{
2 eq { pop false }
{
gsave
/STSong-Light-UniGB-UTF8-H findfont 30 scalefont setfont
newpath
.87 setgray
260 50 moveto 30 rotate
(test 测试) false charpath
1 setlinewidth stroke
grestore
true
} ifelse
} bind
>> setpagedevice
但是我不知道如何指定要添加水印的页面,例如.ps文档的长度为12页,我只想在第6页上添加水印,但是我希望输出文件包含所有12页的文档内容,仅第6页带有水印。 有任何Ghostscript专家知道如何编写此要求吗? 非常感谢!
答案 0 :(得分:0)
当输入为PostScript时,您可以使用程序从堆栈中弹出的数字,因为这是到目前为止执行的页面数。
如果查看PLRM(第3版的第427页)中EndPage的定义,您将看到操作数堆栈包含两个数字,一个原因码位于顶部,另一个是先前显示页面执行的次数。您需要先测试原因码。如果为2,则弹出计数并返回false。如果不是2,则检查第二个数字以查看其tha值是否会触发您的页面。如果不是,则返回true。如果是,则首先执行您的标记例程,然后返回true。
在我看来,当原因代码为2时,您的程序会将显示页面执行的计数留在操作数堆栈上。如果经常调用,则可能导致堆栈溢出错误。程序在显示期间将操作数保留在堆栈上,然后再使用它们也是合法的。如果您将某些东西留在堆栈上,则意味着该程序将检索错误的对象。
不幸的是,当输入为PDF时,Ghostscript PDF解释器将在每个页面上执行一个setpagedevice,并将计数重置为0。
因此,当输入为PDF时,您需要修改程序以保持到目前为止所遇到的页数,以便您可以检查它并仅在需要时激活。给它指定一个唯一的名称,并将其存储在userdict中,在EndPage的每次执行时将其删除,并仅在程序达到特定值时运行程序的标记部分。
PostScript 是一种编程语言...