从 linux 命令行将 PDF 转换为打印机的灰度格式
Posted
技术标签:
【中文标题】从 linux 命令行将 PDF 转换为打印机的灰度格式【英文标题】:Convert PDF to GRAYSCALE format for printer from linux command line 【发布时间】:2015-02-04 13:00:49 【问题描述】:我正在尝试将 PDF 文档转换为灰度,因为我需要打印机识别是否包含颜色的每一页。
我正在使用来自 linux 命令行的 ghostscript。
我将 PDF 转换为 PS 以 grep 所有信息:
pdftops -level3sep input.pdf
它生成一个.ps文件:input.ps
我再次将此 PS 文件转换为 PDF,并使用 ghostscript 将其转换为灰度:
gs -o output.pdf -sDEVICE=pdfwrite -dColorConversionStrategy=/Gray -dProcessColorModel=/DeviceGray input.ps
此命令生成一个 PDF 文件。
当我打开最后一个文件时,我看到所有页面都是灰度的。测试彩色页面的命令说它也是灰度的:
gs -o - -sDEVICE=inkcov output.pdf
对于每一页,它都返回给我 CMYK 值:
Page 1
0.00000 0.00000 0.00000 0.92538 CMYK OK
Page 2
0.00000 0.00000 0.00000 0.06737 CMYK OK
Page 3
0.00000 0.00000 0.00000 0.63738 CMYK OK
Page 4
0.00000 0.00000 0.00000 0.75010 CMYK OK
等等... CMYK: 0,0,0,[something] -> 每个页面都是灰度的。
但是当我去打印文档时,打印机会将每一页识别为 sRGB,并将它们计为彩色页面,而不是灰度页面。
如果我用这个脚本检查每个页面,它会返回所有页面也是 sRGB:
#!/bin/bash
FILE=$1
PAGES=$(pdfinfo $FILE | grep 'Pages:' | sed 's/Pages:\s*//')
GRAYPAGES=""
COLORPAGES=""
DOUBLECOLORPAGES=""
echo "Pages: $PAGES"
N=1
while (test "$N" -le "$PAGES")
do
COLORSPACE=$( identify -format "%[colorspace]" "$FILE[$((N-1))]" )
echo "$N: $COLORSPACE"
if [[ $COLORSPACE == "Gray" ]]
then
GRAYPAGES="$GRAYPAGES $N"
else
COLORPAGES="$COLORPAGES $N"
# For double sided documents also list the page on the other side of the sheet:
if [[ $((N%2)) -eq 1 ]]
then
DOUBLECOLORPAGES="$DOUBLECOLORPAGES $N $((N+1))"
#N=$((N+1))
else
DOUBLECOLORPAGES="$DOUBLECOLORPAGES $((N-1)) $N"
fi
fi
N=$((N+1))
done
echo $DOUBLECOLORPAGES
echo $COLORPAGES
echo $GRAYPAGES
结果是:
andrea@release:~/fotocopia$ ./script.sh output.pdf
Pages: 4
1: sRGB
2: sRGB
3: sRGB
4: sRGB
1 2 1 2 3 4 3 4
1 2 3 4
所以问题是:如何让打印机(而不是脚本)将页面识别为灰度?有没有通过linux命令行的方法可以让我这样做?
提前致谢
【问题讨论】:
【参考方案1】:我忘记发布解决方案了。真的很抱歉。
问题与 GhostScript 转换无关,而与打开 PDF 文件的软件有关。
使用 Chrome 嵌入式 PDF 阅读器时我遇到了这个问题,而使用原始 Adobe Reader 插件(通过 chrome 扩展在 chrome 上覆盖)我能够以灰度正确打印并让打印机识别格式。
希望对遇到同样问题的人有所帮助
【讨论】:
【参考方案2】:首先,inkcov 设备总是返回 CMYK 值,无论输入的颜色空间如何。所以它返回 K 通道值的事实是正确的。
几乎不可能在没有看到 PDF 文件的情况下猜测为什么您的打印机或脚本认为页面是 sRGB。
您不应该对 PDF 文件进行双重转换,那样更容易出现问题!你没有说你用 grep 提取什么样的信息,但很可能它可以直接从 PDF 文件中获得。如果您想要灰度 PDF,只需将原始 PDF 转换为新 PDF。
你也没有说你使用什么版本的 Ghostscript 来做这个转换,我似乎记得 9.15 中有一个错误可能有这个效果。您可能需要考虑查看当前代码。
【讨论】:
我的 GhostScript 版本是 9.10。即使我直接转换文件,而不使用 ps 文件步骤,同样的问题仍然存在。 旧版本的 GS 无法使用您提供的命令行正确地将颜色重新映射到您想要的颜色空间。至少您必须添加 -dUseCIEColor。我强烈建议升级。 我将ghostscript升级到了9.14版本,但似乎也有同样的问题。 -dUseCIEColor 也不行。有什么想法吗? 当前发布的版本是9.15,9.16将在几周内发布。我建议您使用当前代码,因为我相信它可以工作(当然,您必须从 git 存储库中克隆代码并自己构建它)。如果没有看到您的输入文件,我不可能给出更好的建议。如果您认为输出 PDF 文件确实不是以灰度创建的,那么您可以随时打开错误报告。不过,您仍然需要提供该文件。以上是关于从 linux 命令行将 PDF 转换为打印机的灰度格式的主要内容,如果未能解决你的问题,请参考以下文章
通过 Windows 命令行将 TIFF 转换为 PDF [关闭]
在linux环境下,java怎么实现从word格式转换为pdf格式