用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 转换为 PDF/X1a 时透明度丢失
是否可以使用ghostscript检查pdf是否受密码保护?