Ghostscript灰度转换仍然包含颜色?

Pao*_*rio 4 pdf imagemagick ghostscript grayscale

如果它包含颜色,我需要转换灰度的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
Run Code Online (Sandbox Code Playgroud)

这会计算文档中存在多少种具有不同RGB值的颜色(因此它们不是灰色的).

如果pdf不是灰度文档,我继续使用ghostscript进行转换

gs \
  -sOutputFile=temp.pdf \
  -sDEVICE=pdfwrite \
  -sColorConversionStrategy=Gray \
  -dProcessColorModel=/DeviceGray \
  -dCompatibilityLevel=1.4 \
  -dNOPAUSE \
  -dBATCH \
   source.pdf < /dev/null
Run Code Online (Sandbox Code Playgroud)

如果我用PDF查看器打开输出文档,它会正确显示没有颜色.但是如果我在新生成的文档上尝试第一个脚本,结果证明它仍然包含一些颜色.如何将文档转换为精确灰度?我需要这个,因为如果我用彩色打印机打印这个文件,打印机将使用颜色而不是黑色打印灰色.

Kur*_*fle 9

我非常重视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"
Run Code Online (Sandbox Code Playgroud)

虽然所有页面在人眼看来根本不使用任何颜色,但第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
Run Code Online (Sandbox Code Playgroud)

(值为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
Run Code Online (Sandbox Code Playgroud)

...并再次检查墨水覆盖范围:

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
Run Code Online (Sandbox Code Playgroud)

再次,在成功的颜色转换的情况下,完全是预期的结果!(顺便说一句,你的convert命令2为我返回两个文件,[原始] test.pdf以及[灰色转换]temp.pdf - 所以这个命令不能正确......)


小智 5

也许您的文档包含透明图.尝试传递选项

-dHaveTransparency=false
Run Code Online (Sandbox Code Playgroud)

你的ghostscript转换命令.有关pdfwrite设备的完整选项列表,请访问http://ghostscript.com/doc/current/Ps2pdf.htm#Options

  • @KurtPfeifle我不完全同意你的看法.虽然我知道这个问题几个月来一直没有激活,而且你的答案完全足够,但我最终还是提出了这个问题,因为我自己的问题就是它的确切标题.转换后,几页仍然包含颜色.感谢您的回答,我能够确定哪些页面,并将问题缩小到一些数字包含透明度,从而产生彩色页面的事实.通过我提供的选项解决了这个问题.所以我发布了这个答案,我很乐意找到它. (2认同)