Ghostscript 如何为 postscript 文档的一个特殊页面加水印?

Ghostscript How to watermark one special page of a postscript document?

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

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

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

注意,在我看来,当原因代码为 2 时,您的程序将显示页面执行的计数留在操作数堆栈中。这是不好的做法;如果经常调用,您可能会导致堆栈溢出错误。程序在显示页面期间将操作数留在堆栈中并在之后使用它们也是合法的。如果你在堆栈上留下了一些东西,那么这意味着程序检索了错误的对象。

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

因此,当输入为 PDF 时,您需要修改您的程序以记录到目前为止遇到的页面数,以便您可以检查它并仅在需要时激活。给它一个唯一的名字并将它存储在 userdict 中,在每次执行 EndPage 时增加它,并且 运行 只有当它达到特定值时程序的标记部分。

PostScript 一种编程语言......