Ghostscript的灰度转换仍然包含颜色?(Ghostscript grayscale conv

2019-06-24 05:14发布

我需要一个转换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查看器中打开的输出文档就说明不正常的颜色。 但如果我尝试在新生成的文件的第一个脚本事实证明,它仍然包含一些颜色。 我怎样才能将文档转换到精确的灰度? 我需要这个,因为如果我打印该文档与彩色打印机,打印机将使用颜色和不是黑色打印灰色。

Answer 1:

我看重的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 -所以这个命令不可能是正确的......)



Answer 2:

也许你的文档中包含透明的数字。 尝试通过选项

-dHaveTransparency=false

您ghostscript的转换命令。 为pdfwrite设备选项的完整列表,可以发现http://ghostscript.com/doc/current/Ps2pdf.htm#Options



文章来源: Ghostscript grayscale conversion still contains colors?