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

rad*_*tao 8 pdf jpeg watermark postscript ghostscript

我转换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
Run Code Online (Sandbox Code Playgroud)

如果我使用/EndPage而不是/BeginPage- 它说不setpagedevice适用...

如何重新制作此脚本/EndPage

Ken*_*enS 8

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

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

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

最后,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
Run Code Online (Sandbox Code Playgroud)


Rei*_*ans 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
Run Code Online (Sandbox Code Playgroud)

我找到了以下指向我正确方向的网站

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
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这会产生“标记”(前景上的文本),而不是水印(背景上的文本)。将`/EndPage`替换为`/BeginPage`以获取水印 (2认同)