我似乎无法找到 Ghostscript 是否能够简单地检测作业是彩色还是灰度。我使用 Ghostscript 将打印作业转换为 PNG,但我还需要有关作业颜色的信息,因此我不必再次逐个像素地搜索它。
2 回答
称为inkcov
(您需要 Ghostscript v9.05 或更高版本)的(相对较新的)Ghostscript 设备可以可靠地检测 PDF 页面是否使用颜色。
它显示 CMYK 墨水的墨水覆盖率,分别针对每一页(对于 RGB 颜色,它在内部进行到 CMYK 颜色空间的静默转换)。
为了研究和演示它的功能,首先在 Ghostscript 的帮助下生成一个示例 PDF:
gs \
-o color-or-grayscale-test.pdf \
-sDEVICE=pdfwrite \
-g5950x2105 \
-c "/F1 {10 80 moveto /Helvetica findfont 64 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 页确实将它们的明显灰度值与颜色混合在一起。但是没有一种颜色是直接可见的(除非您的显示器严重错误调整)。
查看生成的 PDF 页面(转换为 PNG 以便于通过网络显示):
在印前行业,经常使用“丰富”的黑色或灰色阴影。成语“丰富的”黑色或灰色用于表示这些色调不是由纯黑色墨粉或墨水制成,而是混合了颜色成分,使它们看起来更鲜艳、更饱和。
现在检查每一页的墨水覆盖率:
gs -o - -sDEVICE=inkcov color-or-grayscale-test.pdf
[...]
Page 1
0.00000 0.00000 0.00000 0.05040 CMYK OK
Page 2
0.05401 0.05401 0.05401 0.05401 CMYK OK
Page 3
0.05799 0.05799 0.05799 0.00000 CMYK OK
Page 4
0.00000 0.00000 0.00000 0.04541 CMYK OK
(值 1.00000 对应于相应颜色通道的 100% 墨水覆盖率。因此0.05040
,在结果的第一行中5.04 %
,页面区域被黑色墨水覆盖。)因此 Ghostscript 给出的结果inkcov
正是预期的结果:
- 第 1 + 4 页不使用任何 C(青色)、M(洋红色)、Y(黄色)颜色,而仅使用 K(黑色)。
- 第 2 + 3 页确实使用 C(青色)、M(洋红色)、Y(黄色)颜色的墨水,但根本没有使用 K(黑色)。
现在让我们转换原始 PDF 的所有页面以使用DeviceGray
颜色空间:
gs \
-o only-black-ink.pdf \
-sDEVICE=pdfwrite \
-dColorConversionStrategy=/Gray \
-dProcessColorModel=/DeviceGray \
color-or-grayscale-test.pdf
...并再次检查墨水覆盖率:
gs -q -o - -sDEVICE=inkcov only-black-ink.pdf | grep -v Page
0.00000 0.00000 0.00000 0.05040 CMYK OK
0.00000 0.00000 0.00000 0.05401 CMYK OK
0.00000 0.00000 0.00000 0.05799 CMYK OK
0.00000 0.00000 0.00000 0.04541 CMYK OK
同样,在颜色转换成功的情况下,这正是预期的结果!
新的输出设备已使此答案过时,请参阅已接受的答案。
在 2011 年之前,需要对文件进行光栅化才能看到输出。由于 PDF/PS 是对文件外观的描述,该文件在光栅化时被渲染。即使您可以使用 ghostscipt 执行此操作,我确信它需要先光栅化/解释文件然后查看输出,因此如果您有 png 文件,您也可以自己执行此操作,这将比处理再次向 GS 提交文件。