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

在Ghostscript中是否可以将水印添加到PDF中的每个页面,pdf,jpeg,ghostscript,watermark,postscript,Pdf,Jpeg,Ghostscript,Watermark,Postscript,我使用ghostscript转换PDF->many JPEG和many JPEG->many PDF。我需要在每个转换的JPEG(PDF)页面上添加水印文本。是否可以只使用Ghostscript和PostScript 我找到的唯一方法是: gswin32c-q-sDEVICE=pdfwrite-dBATCH-dNOPAUSE-sOutputFile=output.pdf watermark.ps input.pdf 但这将在output.pdf中的第一个单独页面上插入watermark.ps水印

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

我找到的唯一方法是:

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

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

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

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

<<
   /BeginPage
   { gsave
       /Helvetica_Bold 120 selectfont
       .85 setgray 130 70 moveto 50 rotate (Sample) show
     grestore
   } bind
>> setpagedevice
>设置页面设备
如果我使用
/EndPage
而不是
/BeginPage
,则表示
设置页面设备
不适用


如何为
/EndPage
重新生成此脚本

我不知道你说的“直接”是什么意思。正如您所发现的,有可能让PostScript解释器在每页的基础上做很多事情。PostScript毕竟是一种编程语言

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

如果定义了/BeginPage过程,则该过程将在输入程序的任何标记操作之前执行;如果定义了/EndPage,则该过程将在输入程序的标记操作之后执行(逐页()


这允许您将自己的标记放在程序标记的“下方”或“上方”。

对于注释来说太大了,因此我添加了一个新的答案。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
>设置页面设备

接受的答案是为我插入页面。除了水印之外,页面是空白的。如果遇到此问题,请尝试在此处添加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

我用代码示例更新了问题。你能看一下吗?它几乎正确,不包括每一个带水印的页面,它还添加了带水印的空页面,并且输出PDF有两倍多的页面。可能是“原因”代码造成的问题。请尝试以下操作:/EndPage{exch pop 2 lt{gsave…grestore true}{false}ifelse}bindI这样做了:>setpagedevice,它导致了错误:
错误:/typecheck in--.endpage--
操作数堆栈:--nostringval--2.2
哦,我找到了。我用了
if
而不是
lt
。很好!请注意,这会产生一个“戳记”(前台的文本),而不是水印(后台的文本)。将
/EndPage
替换为
/BeginPage
,以获取水印
gswin32c -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=watermarked.pdf watermark.ps original.pdf