使用 Ghostscript 更改 PDF 的不透明度

Changing PDF opacity with Ghostscript

我正在尝试获取 PDF 文件并为整个文档或页面设置不透明度级别。 PDF 始终是单页并且包含矢量但不包含像 this PDF 文件那样的光栅图像并且可以具有 RGB 或 CMYK 颜色。在这种情况下,我尝试将不透明度级别设置为 0.5,这样一切都是半透明的。

我发现了很多关于给 PDF 加水印的信息,我认为这更容易,因为内容已添加到 PDF 中,在我的情况下,我想修改 PDF 内容。我发现 these 令人惊叹的 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.setstrokeconstantalpha 没有任何区别。我显然是在盲目地尝试一些东西,因为我找不到太多关于这方面的信息,而且我也不完全确定这是否可能。

有没有人对此有任何经验或任何articles/papers/books我可以作为指导?

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

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

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

但是,这些扩展实际上是为了与 PostScript 标记操作一起应用,以便您可以在 PostScript 中进行透明操作。它们不打算作为修改现有 PDF 文件的方法,除了可能添加额外的透明对象(例如水印)之外,我认为您无法通过这种方式实现您的目标。您需要启动一个包含页面内容的透明组,坦率地说,我认为您做不到。

[编辑]

好的,现在有 .begintransparencygroup 和 .endtransparencygroup 运算符,因此您可以创建一个组。但是,您可能应该查看 ghostpdl/examples/transparency_example.ps 以了解您需要正确执行此操作的其他一些内容。请特别注意 PageUsesTransparency 的设置。