是否可以在Ghostscript中为PDF中的每个页面添加水印

时间:2012-09-03 06:38:04

标签: pdf jpeg ghostscript watermark postscript

我转换 PDF - >许多JPEG 许多JPEG - >许多PDF 使用ghostscript。我需要在每个转换的JPEG(PDF)页面上添加水印文本。是否可以只使用Ghostscript和PostScript?

我找到的唯一方法:

  

gswin32c -q -sDEVICE = pdfwrite -dBATCH -dNOPAUSE -sOutputFile = output.pdf watermark.ps input.pdf

但是这会在watermark.ps的第一个单独页面上插入output.pdf水印。

我可以直接在输出PDF页面上执行此操作吗?

我可以直接在输出JPEG页面上执行此操作吗?

<<
   /BeginPage
   { gsave
       /Helvetica_Bold 120 selectfont
       .85 setgray 130 70 moveto 50 rotate (Sample) show
     grestore
   } bind
>> setpagedevice

如果我使用/EndPage代替/BeginPage,则表示setpagedevice不适用...

如何为/EndPage重新制作此脚本?

3 个答案:

答案 0 :(得分:8)

评论太大了,所以我添加了一个新答案。 EndPage过程(参见PostScript语言参考手册的第441页)在堆栈上获取了两个附加参数,到目前为止发出的页数以及原因码。

你可以使用页面数来做有趣的事情,比如双面打印,或者只标记偶数页面等等,但我认为在这种情况下你不需要它,所以你只需从堆栈中“弹出”它。 / p>

原因代码告诉你为什么页面被发出,你可能不在乎所以你只是弹出值。

最后,EndPage必须向解释器返回一个布尔值,说明是否要传输页面(这允许你做其他有趣的事情,比如只打印前10页等等)。

因此,您需要最初删除两个值,执行代码并返回一个布尔值。非常琐碎:

<<
   /EndPage
   { pop pop %% *BEFORE* gsave as that puts a gsave object on the stack
     gsave
     /Helvetica_Bold 120 selectfont
     .85 setgray 130 70 moveto 50 rotate (Sample) show
     grestore
     true %% transmit the page, set to false to not transmit the page
   } bind
>> setpagedevice

答案 1 :(得分:5)

接受的答案是为我插入页面。除水印外,这些页面都是空白的。如果遇到这种情况,请尝试在此处添加2eq位

<<
   /EndPage
   {
     2 eq { pop false }
     {
         gsave      
         /Helvetica_Bold 120 selectfont
         .85 setgray 130 70 moveto 50 rotate (Sample) show
         grestore
         true
     } ifelse
   } bind
>> setpagedevice

我发现以下网站指出了我正确的方向

http://habjan.blogspot.com/2013/10/how-to-programmatically-add-watermark.html

这里是调用语法,上面的文件保存为watermark.ps,gswin32c引用ghostscript exe

gswin32c -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=watermarked.pdf watermark.ps original.pdf

答案 2 :(得分:1)

我不知道你的意思直接&#39;。正如您所发现的那样,使用PostScript解释器可以在每页上执行多种操作。毕竟PostScript是一种编程语言。

我建议页面设备字典中的/ BeginPage和/或/ EndPage过程是开始的地方。这些允许您在每个页面的开头或结尾执行任意PostScript。

如果你定义一个/ BeginPage程序,那么它将在输入程序的任何标记操作之前执行,如果你定义一个/ EndPage,它将在之后执行来自输入程序的标记操作(基于页面逐页(。

这可以让你自己的标记在&#39;下面。或者&#39; over&#39;该计划的标志。