pdf - 使用 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
将运算符更改为.setfillconstantalpha
and.setstrokeconstantalpha
没有任何区别。我显然是在盲目地尝试一些东西,因为我找不到太多关于这方面的信息,而且我也不完全确定这是否可能。
有没有人有这方面的经验或我可以用作指导的任何文章/论文/书籍?
解决方案
更改 EndPage 中的不透明度不会做任何事情,因为 EndPage在页面呈现后被调用(或者在您的情况下作为新的 PDF 发出)。您需要在 BeginPage 过程而不是 EndPage 中进行这些更改。
另外,您还没有创建透明度组,所以您所做的只是更改图形状态下当前透明度的值。一旦 PDF 解释器遇到输入 PDF 文件中影响不透明度的任何运算符,它就会将图形状态设置为该新值,只需覆盖您已经设置的内容。我有理由确定在解释开始时对图形状态的初始化将覆盖您在开始解释 PDF 文件之前在 PostScript 中设置的任何值,这就是为什么您的第一次尝试也不起作用的原因。
恐怕 PDF 透明度比简单地设置 alpha 混合值要复杂得多。它在 PDF 参考手册中有详细描述,这里定义了 Ghostscript 扩展
但是,这些扩展实际上是为了与 PostScript 标记操作一起应用,以便您可以在 PostScript 中进行透明度操作。除了可能添加额外的透明对象(例如水印)之外,它们不打算用作修改现有 PDF 文件的方法,而且我认为您无法通过这种方式实现目标。您需要启动一个包含页面内容的透明度组,坦率地说,我认为您不能这样做。
[编辑]
好的,所以有一个 .begintransparencygroup 和 .endtransparencygroup 运算符,因此您可以创建一个组。但是,您可能应该查看 ghostpdl/examples/transparency_example.ps 以了解您需要正确执行此操作的其他一些内容。特别注意 PageUsesTransparency 的设置。
推荐阅读
- react-native - Sinch 服务在 react-native
- microservices - 如何在 Consul 中同一服务的实例之间交换数据?
- ios - 完成数据获取后如何在tableView中使用UIActivityIndicatorView
- mysql - 将 Sql Server 查询转换为 MySql Server 查询
- android - Android 构建失败:无法为项目获取未知属性“assembleDebug”
- cordova - 如何使用 cordova-plugin-camera (ALLMEDIA) 启用视频和图片
- reactjs - 将 html 网站与 react 应用程序合并
- sql-server-2012 - 从一个表中获取一行并检查另一个表中的相应行是否存在,将此行添加到第一个表行的下一个
- javascript - 练习 一个范围的总和 eloqent java
- javascript - 填充 React 下拉列表出现错误 #31