用ghostscript检查PDF是不是有透明对象

Posted

技术标签:

【中文标题】用ghostscript检查PDF是不是有透明对象【英文标题】:Check with ghostscript whether a PDF has transparent objects用ghostscript检查PDF是否有透明对象 【发布时间】:2014-01-08 21:11:17 【问题描述】:

PDF 可以定义多个部分的透明度(参见例如here):

作为图形样式属性:

填充不透明度 (/ca) 或描边不透明度 (/CA) 低于 1.0 的值 软掩码的定义 (\SMask)

或使用透明页面组的定义 (/S /Transparency)。

以下grep 表达式是对此的快速(且肮脏)检查:

grep -aE -e '/[Cc][Aa] +0?\.[0-9]' -e '/SMask' -e '/S /Transparency' *.pdf

可以用gs查看是否有透明物体吗?

【问题讨论】:

【参考方案1】:

我相信 pdf_info.ps (gs/toolbin) 会告诉你这一点。 Ghostscript 想提前知道页面是否使用透明度,因为如果知道没有透明度,它可以对性能和内存进行优化。

请注意,大量浮动的 PDF 文件声明“虚假”透明度,其中透明度结果是 100% 不透明 :-(

【讨论】:

如何使用 pdf_info.ps ?能否请您指导。我想列出pdf文档中的所有透明对象。 来自 pdf_info.ps 的标题:“% 转储 PDF 文件中的一些信息 % 用法:gs -dNODISPLAY -q -sFile=____.pdf [-dDumpMediaSizes] [-dDumpFontsUsed [-dShowEmbeddedFonts] ] toolbin/pdf_info.ps " 显然 -sFile= 应该是您感兴趣的 PDF 文件的完整路径和文件规范。根据您运行 GS 的位置,您可能需要修改 pdf_info.ps 的路径 2 年来一直在寻找检查 PDF 透明度的解决方案。这非常完美gs -dNODISPLAY -q -sFile=input.pdf /var/bin/ghostscript-9.16/toolbin/pdf_info.ps:D @KenS 可以更新 pdf_info.ps 代码以检测不是 100% 不透明的透明度对象吗?基本上消除误报,因为一些 pdfwriter 很草率但不受用户控制? 理论上可以,实际上不行。需要检查的“东西”数量太大。例如,您必须查看软掩模图像的每个样本,以查看它是否不是完全不透明的。必须跟踪每个 ExtGState 以查看它是否被使用或只是无意义地撒谎。每个页面都必须检查每个标记操作以查看它是否使用透明度,以验证页面组是否毫无意义,对于 Form XObjects 也是如此。等等等等。进行检查所需的时间比不进行透明度所节省的时间要长。

以上是关于用ghostscript检查PDF是不是有透明对象的主要内容,如果未能解决你的问题,请参考以下文章

使用 GhostScript 将 PDF 转换为透明 PNG

使用 Ghostscript 更改 PDF 不透明度

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

是否可以使用ghostscript检查pdf是否受密码保护?

从PS中创建PDF时,用Ghostscript去除白色背景。

Ghostscript:获取用于从 PDF 渲染的 CMYK 值