GraphicsMagick 无法识别 PDF 的背景透明度

Posted

技术标签:

【中文标题】GraphicsMagick 无法识别 PDF 的背景透明度【英文标题】:GraphicsMagic is unable to identify background transparency of PDF 【发布时间】:2014-09-01 10:09:45 【问题描述】:

GM 无法识别 PDF 的背景透明度,使用“gm convert”创建的 PNG 获得白色背景,而同一 PDF 被 IM 转换为具有透明背景的 PNG。

$convert -verbose /var/tmp/abc.pdf /var/tmp/abc.png
/var/tmp/magick-16370Tq7WYv5U54Pa1 PNG 288x720 288x720+0+0 8 位 sRGB 20.7KB 0.000u 0:00.009
/var/tmp/abc.pdf PDF 288x720 288x720+0+0 16 位 sRGB 20.7KB 0.000u 0:00.000
/var/tmp/abc.pdf=>/var/tmp/abc.png PDF 288x720 288x720+0+0 8 位 sRGB 17c 16.6KB 0.010u 0:00.009
[ghostscript 库] -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=pngalpha" -dTextAlphaBits=4 -dGraphicsAlphaBits=4 "-r72x72" "-sOutputFile= /var/tmp/magick-16370Tq7WYv5U54Pa%d" "-f/var/tmp/magick-16370CVWmPbzBmjpF" "-f/var/tmp/magick-16370khy6Y-G3TgtO"
$gm convert -verbose /var/tmp/abc.pdf /var/tmp/abc.png
gm 转换:“gs”“-q”“-dBATCH”“-dMaxBitmap=50000000”“-dNOPAUSE”“-sDEVICE=pnmraw”“-dTextAlphaBits=4”“-dGraphicsAlphaBits=4”“-r72x72”“ -sOutputFile=/var/folders/6d/n_hv45rs1jv17nxwfjwj776cspn_3c/T/gmoCp6rG""--""/var/folders/6d/n_hv45rs1jv17nxwfjwj776cspn_3c/T/gmBEgWnK""-c""退出"。
/var/tmp/abc.pdf PDF 288x720+0+0 DirectClass 8 位 607.6K 0.000u 0:01
/var/tmp/abc.pdf=>/var/tmp/abc.png PNG 288x720+0+0 DirectClass 8 位 0.000u 0:01
经过进一步调查,IM 的“识别”似乎可以正确识别 PDF 中的背景,而 GM 的“gm 识别”则不能。
$identify -verbose abc.pdf
图片:abc.pdf
格式:PDF(便携式文档格式)
类型:双层
色彩空间:灰色
深度:16/4 位
通道深度:
灰色:1 位
阿尔法:4位
阿尔法:graya(255,0)#FFFFFFFFFFFF0000
颜色:16
背景颜色:graya(255,1)
透明色:graya(0,0)
版本:ImageMagick 6.8.9-1 Q16 x86_64 2014-07-01 http://www.imagemagick.org
$gm identify -verbose abc.pdf
gm 识别:“gs”“-q”“-dBATCH”“-dMaxBitmap=50000000”“-dNOPAUSE”“-sDEVICE=pnmraw”“-dTextAlphaBits=4”“-dGraphicsAlphaBits=4”“-r72x72”“ -sOutputFile=/var/folders/6d/n_hv45rs1jv17nxwfjwj776cspn_3c/T/gmzhBEIk""--""/var/folders/6d/n_hv45rs1jv17nxwfjwj776cspn_3c/T/gmAPm2Po""-c""退出"。
图片:abc.pdf
格式:PDF(便携式文档格式)
类型:灰度
深度:每像素 4 位分量
渠道深度:
灰色:4 位
背景颜色:白色
评论:GPL Ghostscript 生成的图像(device=pnmraw)
签名:215f1c08ec575526ce398d193c4df22faaea100c10255e0db747641bdaaeac49
污染:错误

【问题讨论】:

sourceforge 链接:sourceforge.net/p/graphicsmagick/discussion/250738/thread/… 【参考方案1】:

您的 (ImageMagick) convert 和您的 (GraphicsMagick) gm convert 命令产生不同输出的原因是:

    这两个实用程序能够直接处理 PDF 输入文件,都只能处理评估图像格式。

    为了处理 PDF 输入文件,这两个实用程序都求助于 'delegate' 程序:在这两种情况下,这都是 Ghostscript(CAN 处理 PDF 输入文件)。

    然而,这两个实用程序都使用 不同 'delegate command lines'(可以在引用的 -verbose 命令行输出中直接看到:

    我。 convert 使用作为其 Ghostscript 输出设备 pngalpha

    二。 gm convertemploys 作为其 Ghostscript 输出设备 pnmraw.

    然后,两个实用程序都将其委托命令的输出处理为最终(光栅)格式文件。

问题是:光栅格式 'pnmraw' 不支持透明度(alpha 通道),但 'pngalpha' 支持。因此,首先将 PDF 输入转换为 pnmraw 的实用程序丢失了透明页面背景,并用(不透明)白色背景替换了它们。

除非您修改 GraphicsMagick 设置以使其在其委托命令中使用 pngalpha(与 ImageMagick 使用的相同),否则您的 gm convert 将不会显示透明背景。

【讨论】:

【参考方案2】:

只是想添加到Kurt Pfeifle 答案,因为它为我指出了这个解决方案。他所指的配置可在 delegates.mgk 文件 (graphicsmagick/1.3.19_1/lib/GraphicsMagick/config) 中找到。

对我来说,问题是这一行:

<!-- Read color Postscript, EPS, and PDF  -->
<delegate decode="gs-color" stealth="True" command='"gs" -q -dBATCH -dMaxBitmap=50000000 -dNOPAUSE -sDEVICE=ppmraw -dTextAlphaBits=%u -dGraphicsAlphaBits=%u -r%s %s "-sOutputFile=%s" -- "%s" -c quit' />

我改成:

  <delegate decode="gs-color+alpha" stealth="True" command='"gs" -q -dBATCH -dMaxBitmap=50000000 -dNOPAUSE -sDEVICE=pngalpha -dTextAlphaBits=%u -dGraphicsAlphaBits=%u -r%s %s "-sOutputFile=%s" -- "%s" -c quit' />

而且我的 png 会带有透明背景!

【讨论】:

以上是关于GraphicsMagick 无法识别 PDF 的背景透明度的主要内容,如果未能解决你的问题,请参考以下文章

缩略图来自 GraphicsMagick 中流的 pdf 的第一页

将 ImageMagick 命令转换为 GraphicsMagick

验证码识别工具GraphicsMagick1.3.25和Tesseract-OCR4.0.0 Linux安装部署过程记录

进行OCR识别文本的时候提示PDF文档无法识别

itext pdf文件打印中文无法识别问题

python实现PDF文档间对比(百度文本识别接口)