Ghostscript如何在后记文档的一个特殊页面上加水印?

时间:2019-03-04 06:57:47

标签: ghostscript postscript

我已经通过以下命令和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专家知道如何编写此要求吗? 非常感谢!

1 个答案:

答案 0 :(得分:0)

当输入为PostScript时,您可以使用程序从堆栈中弹出的数字,因为这是到目前为止执行的页面数。

如果查看PLRM(第3版的第427页)中EndPage的定义,您将看到操作数堆栈包含两个数字,一个原因码位于顶部,另一个是先前显示页面执行的次数。您需要先测试原因码。如果为2,则弹出计数并返回false。如果不是2,则检查第二个数字以查看其tha值是否会触发您的页面。如果不是,则返回true。如果是,则首先执行您的标记例程,然后返回true。

在我看来,当原因代码为2时,您的程序会将显示页面执行的计数留在操作数堆栈上。如果经常调用,则可能导致堆栈溢出错误。程序在显示期间将操作数保留在堆栈上,然后再使用它们也是合法的。如果您将某些东西留在堆栈上,则意味着该程序将检索错误的对象。

不幸的是,当输入为PDF时,Ghostscript PDF解释器将在每个页面上执行一个setpagedevice,并将计数重置为0。

因此,当输入为PDF时,您需要修改程序以保持到目前为止所遇到的页数,以便您可以检查它并仅在需要时激活。给它指定一个唯一的名称,并将其存储在userdict中,在EndPage的每次执行时将其删除,并仅在程序达到特定值时运行程序的标记部分。

PostScript 一种编程语言...