如果确实包含颜色,我需要转换灰度的pdf。 为此,我找到了一个脚本,可以确定pdf是否已经是灰度级。
convert "source.pdf" -colorspace RGB -unique-colors txt:- 2> /dev/null \
| egrep -m 2 -v "#([0-9|A-F][0-9|A-F])\1{3}" \
| wc -l
这会计算文档中存在多少种具有不同RGB值的颜色(因此它们不是灰色的)。
如果pdf不是灰度文档,我继续使用ghostscript进行转换
gs \
-sOutputFile=temp.pdf \
-sDEVICE=pdfwrite \
-sColorConversionStrategy=Gray \
-dProcessColorModel=/DeviceGray \
-dCompatibilityLevel=1.4 \
-dNOPAUSE \
-dBATCH \
source.pdf < /dev/null
如果我用PDF查看器打开输出文档,它会正确显示没有颜色。但是如果我在新生成的文档上尝试第一个脚本,结果证明它仍然包含一些颜色。如何将文档转换为精确灰度?我需要这个,因为如果我用彩色打印机打印这个文件,打印机将使用颜色而不是黑色打印灰色。
答案 0 :(得分:9)
我非常重视ImageMagick - 但是不要相信convert
使用你正在使用的命令正确计算颜色......
我可以建议一种不同的方法来发现PDF页面是否使用颜色?它基于一个名为inkcov
的(相对较新的)Ghostscript设备(您需要Ghostscript v9.05或更新版本)。它显示每个页面的CMYK墨水覆盖率(对于RGB颜色,它在内部进行静默转换为CMYK)。
首先,在Ghostscript的帮助下生成示例PDF:
gs \
-o test.pdf \
-sDEVICE=pdfwrite \
-g5950x2105 \
-c "/F1 {100 100 moveto /Helvetica findfont 42 scalefont setfont} def" \
-c "F1 (100% 'pure' black) show showpage" \
-c "F1 .5 .5 .5 setrgbcolor (50% 'rich' rgbgray) show showpage" \
-c "F1 .5 .5 .5 0 setcmykcolor (50% 'rich' cmykgray) show showpage" \
-c "F1 .5 setgray (50% 'pure' gray) show showpage"
虽然所有页面确实在人眼看来根本不使用任何颜色,但第2页和第3页确实会将它们的明显灰度值与颜色混合。
现在检查每个页面的墨水覆盖率:
gs -o - -sDEVICE=inkcov test.pdf
[...]
Page 1
0.00000 0.00000 0.00000 0.02230 CMYK OK
Page 2
0.02360 0.02360 0.02360 0.02360 CMYK OK
Page 3
0.02525 0.02525 0.02525 0.00000 CMYK OK
Page 4
0.00000 0.00000 0.00000 0.01982 CMYK OK
(值为1.00000会映射到相应颜色通道的100%墨水覆盖率。因此,结果第一行中的0.02230
表示页面区域的2.23 %
被黑色墨水覆盖。)因此,Ghostscript的inkcov
给出的结果正是预期的结果:
现在让我们将原始PDF的所有页面转换为使用DeviceGray
色彩空间:
gs \
-o temp.pdf \
-sDEVICE=pdfwrite \
-sColorConversionStrategy=Gray \
-sProcessColorModel=DeviceGray \
test.pdf
...并再次检查墨水覆盖率:
gs -q -o - -sDEVICE=inkcov temp.pdf
0.00000 0.00000 0.00000 0.02230 CMYK OK
0.00000 0.00000 0.00000 0.02360 CMYK OK
0.00000 0.00000 0.00000 0.02525 CMYK OK
0.00000 0.00000 0.00000 0.01982 CMYK OK
同样,在成功的色彩转换的情况下,完全是预期的结果! ( BTW,你的convert
命令为我返回2
这两个文件,[原始] test.pdf
以及[灰色转换] temp.pdf
- 所以这个命令不对......)
答案 1 :(得分:5)
也许您的文档包含透明图。尝试传递选项
-dHaveTransparency=false
到你的ghostscript转换命令。可以在http://ghostscript.com/doc/current/Ps2pdf.htm#Options
找到pdfwrite设备的完整选项列表