使用重影脚本更改PDF不透明度

使用重影脚本更改PDF不透明度,pdf,ghostscript,postscript,Pdf,Ghostscript,Postscript,我正在尝试获取一个PDF文件,并为整个文档或页面设置不透明度级别。PDF始终是一个页面,包含矢量,但没有像PDF文件那样的光栅图像,可以有RGB或CMYK颜色。在本例中,我尝试将不透明度级别设置为0.5,以便所有内容都是半透明的 我发现了很多关于PDF水印的内容,我认为这更容易,因为内容被添加到PDF中,在我的例子中,我想修改PDF内容。我为Ghostscript找到了惊人的透明度操作符,但我无法让它们工作!我创建了一个非常简单的postscript程序,并将其命名为program.ps: 0

我正在尝试获取一个PDF文件,并为整个文档或页面设置不透明度级别。PDF始终是一个页面,包含矢量,但没有像PDF文件那样的光栅图像,可以有RGB或CMYK颜色。在本例中,我尝试将不透明度级别设置为0.5,以便所有内容都是半透明的

我发现了很多关于PDF水印的内容,我认为这更容易,因为内容被添加到PDF中,在我的例子中,我想修改PDF内容。我为Ghostscript找到了惊人的透明度操作符,但我无法让它们工作!我创建了一个非常简单的postscript程序,并将其命名为
program.ps

0 .pushpdf14devicefilter
0.5 .setopacityalpha 0.5 .setshapealpha
然后我运行Ghostscript:

gswin64c.exe -dNOCACHE -dNOPAUSE -dBATCH -dNOSAFER -dALLOWPSTRANSPARENCY -sDEVICE=pdfwrite -o "opacity.pdf" program.ps circles.pdf
但输出完全相同,没有应用透明度。这将导致出现空白页:

<<
/EndPage {
    2 eq { pop false }
    {
        0 .pushpdf14devicefilter
        0.5 .setopacityalpha 0.5 .setshapealpha
        true
    } ifelse
} bind
>> setpagedevice
>设置页面设备
这根本没有区别:

<<
/EndPage {
    2 eq { pop false }
    {
        0.5 .setopacityalpha 0.5 .setshapealpha
        true
    } ifelse
} bind
>> setpagedevice
>设置页面设备
将运算符更改为
.setfillconstantalpha
没有区别。我显然是在盲目地尝试,因为我找不到太多关于这方面的信息,我也不完全确定这是否可能


有没有人对这篇文章或任何我可以用作指导的文章/论文/书籍有任何经验?

更改EndPage中的不透明度不会有任何作用,因为在呈现页面(或在您的情况下,以新PDF格式发布)后,EndPage被称为。您需要在BeginPage过程而不是EndPage中进行这些更改

此外,您还没有创建透明度组,所以您所做的只是在图形状态下更改当前透明度的值。一旦PDF解释器在输入PDF文件中遇到影响不透明度的任何操作符,它就会将图形状态设置为该新值,只需覆盖您已经设置的内容。我可以合理地确定,在开始解释PDF文件之前,在解释开始时初始化图形状态将覆盖您在PostScript中设置的任何值,这就是为什么您的第一次尝试也不起作用

恐怕PDF透明度比简单地设置alpha混合值要复杂得多。PDF参考手册中对其进行了详细描述,并定义了Ghostscript扩展

但是,这些扩展实际上是用于PostScript标记操作,以便您可以在PostScript中获得透明操作。除了可能添加额外的透明对象(如水印)之外,它们并不是用来修改现有PDF文件的方法,我认为您无法通过这种方式实现目标。你需要成立一个透明小组,将页面内容包含在内,坦率地说,我认为你做不到这一点

[编辑]

好的,这里有一个.begintransparencygroup和.endtransparencygroup操作符,所以您可以潜在地创建一个组。但是,您可能应该查看ghostpdl/examples/transparency_example.ps,以了解为使其正常工作所需的一些其他事项。请特别注意PageUseTransparency的设置