【问题标题】:Ghostscript grayscale conversion still contains colors?Ghostscript灰度转换仍然包含颜色?
【发布时间】:2012-05-15 11:56:41
【问题描述】:

如果 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 查看器打开输出文档,它会正确显示没有颜色。但是,如果我在新生成的文档上尝试第一个脚本,结果发现它仍然包含一些颜色。如何将文档转换为精确的灰度?我需要这个,因为如果我使用彩色打印机打印此文档,打印机将使用彩色而不是黑色来打印灰色。

【问题讨论】:

  • 你能解释一下你的egrep声明的意图是什么吗?
  • 我多次使用这个 ghostscript 开关将 RGB 颜色空间转换为 GRAYSCALE,然后用 Callas preflight 软件检查。不要相信 imagemagick,这些开关可以毫无痛苦地工作

标签: pdf imagemagick ghostscript grayscale


【解决方案1】:

总的来说,我非常重视 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 - 所以这个命令不能是对的......)

【讨论】:

    【解决方案2】:

    也许您的文档包含透明数字。尝试传递选项

    -dHaveTransparency=false
    

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

    【讨论】:

    • @KurtPfeifle 我不完全同意你的看法。虽然我知道这个问题已经好几个月没有活跃了,而且你的回答也很充分,但我最终还是选择了这个问题,因为我自己的问题就是它的确切标题。转换后,一些页面仍然包含颜色。感谢您的回答,我能够确定哪些页面,并将问题缩小到某些数字包含透明度的事实,这导致了彩色页面。通过我提供的选项解决了这个问题。因此,我将这个答案发布在我很乐意找到它的地方。
    • @VincentNivoliers:好吧,你可能是对的。只要有时间,我就会尝试使用适当的输入样本对此进行测试。感谢您提供额外的提示。
    • 举一个最小的例子,一个解决方案是使用乳胶创建一个最小的pdf,并包括一个带有透明层的png(即使没有像素是透明的)。在不使用上述选项的情况下转换为灰度会导致墨水覆盖率(使用您的工具测量)显示颜色。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 2012-04-29
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    相关资源
    最近更新 更多