我需要一个转换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页面使用颜色? 它是基于称为(比较新)Ghostscript的设备上inkcov
(你需要的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
(用于各个颜色信道A的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