我转换 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
重新制作此脚本?
答案 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;该计划的标志。