首页 > 解决方案 > 使用 Ghostscript 更改 PDF 不透明度

问题描述

我正在尝试获取 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

将运算符更改为.setfillconstantalphaand.setstrokeconstantalpha没有任何区别。我显然是在盲目地尝试一些东西,因为我找不到太多关于这方面的信息,而且我也不完全确定这是否可能。

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

标签: pdfghostscriptpostscript

解决方案


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

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

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

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

[编辑]

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


推荐阅读