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查看器打开输出文档,它会正确显示没有颜色.但是如果我在新生成的文档上尝试第一个脚本,结果证明它仍然包含一些颜色.如何将文档转换为精确灰度?我需要这个,因为如果我用彩色打印机打印这个文件,打印机将使用颜色而不是黑色打印灰色.
我非常重视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正是预期的结果:
现在让我们将原始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