使用 Ghostscript 更改 PDF 不透明度

Posted

技术标签:

【中文标题】使用 Ghostscript 更改 PDF 不透明度【英文标题】:Changing PDF opacity with Ghostscript 【发布时间】:2020-06-26 02:06:11 【问题描述】:

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

我发现了很多关于为 PDF 添加水印的内容,我认为这更容易,因为内容已添加到 PDF,在我的情况下,我想修改 PDF 内容。我为 Ghostscript 找到了 these 惊人的透明度运算符,但我无法让它们工作!我创建了一个非常简单的 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 没有区别。我显然是在盲目地尝试一些东西,因为我找不到太多关于这方面的信息,而且我也不完全确定这是否可能。

是否有人对此或任何文章/论文/书籍有任何经验,我可以用作指南?

【问题讨论】:

【参考方案1】:

更改 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 的设置。

【讨论】:

以上是关于使用 Ghostscript 更改 PDF 不透明度的主要内容,如果未能解决你的问题,请参考以下文章

Ghostscript Pdf Transparant Objects删除

使用 GhostScript 将 PDF 转换为透明 PNG

使用 Ghostscript 将 PDF 转换为 PDF/X1a 时透明度丢失

ghostscript 命令行参数输出文件名更改

GHOSTSCRIPT - PS 到 PDF 转换纸张大小

来自 Ghostscript 的页面超出范围错误的 PDF 尺寸