如果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 查看器打开输出文档,它会正确显示没有颜色。但是,如果我在新生成的文档上尝试第一个脚本,结果发现它仍然包含一些颜色。如何将文档转换为精确的灰度?我需要这个,因为如果我使用彩色打印机打印此文档,打印机将使用颜色而不是黑色来打印灰色。
我总体上非常看重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
给出的结果正是预期的:
- 第 1 + 4 页不使用任何 C(青色(、M(洋红色(、Y(黄色(颜色,而只使用 K(黑色(。
- 第 2 + 3 页确实使用了 C(青色(、M(品红色(、Y(黄色(颜色的墨水,但根本没有 K(黑色(。
现在让我们将原始 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
同样,在颜色转换成功的情况下,正是预期的结果!(顺便说一句,您的convert
命令为我返回两个文件2
,[原始]test.pdf
以及[灰色转换]temp.pdf
- 所以这个命令不能是正确的......
也许您的文档包含透明数字。尝试传递选项
-dHaveTransparency=false
到您的 ghostscript 转换命令。pdfwrite设备的完整选项列表可以在 http://ghostscript.com/doc/current/Ps2pdf.htm#Options