如何将CMYK格式的PDF转换为RGB格式,以在iPad上显示?

4
根据这个问题:
一些PDF文档在iOS设备上显示不正常,因为颜色不是RGB格式。文章还提到使用ghostscript可以自动将PDF从CMYK转换为RGB。有人知道实际命令应该是什么吗?
4个回答

5
我们使用Ghostscript将Postscript文件转换为PDF时,进行CMYK到RGB的转换。同样适用于PDF到PDF的转换。
以下命令行用于操作:
gs -sDEVICE=pdfwrite -dBATCH -dNOPAUSE -dCompatibilityLevel=1.4 -dColorConversionStrategy=/sRGB -dProcessColorModel=/DeviceRGB -dUseCIEColor=true -sOutputFile=output.pdf input.ps

1
是的,这应该可以工作。然而,由于pdfwrite设备默认使用-dColorConversionStrategy=/sRGB-dProcessColorModel=/DeviceRGB,因此在命令行上不需要声明它(尽管也不会有害)。如果您想要将PDF颜色转换为CMYK,则需要使用-dColorConversionStrategy=/CMYK-dProcessColorModel=/DeviceCMYK... - Kurt Pfeifle
我正在使用上述代码处理一个19MB的PDF输入文件,但输出结果是一个128KB的PDF文件。结果图像质量下降了,这是由于压缩导致的吗?如何避免任何压缩?谢谢! - Gerard Bosch
@GerardBosch 这是一个不太简单的问题。你最好在StackOverflow上提出一个新问题。 - Codo
1
谢谢@Codo。我使用以下命令成功实现了我想要的功能(并进行了正确的压缩):gs -sDEVICE=pdfwrite -dPDFX -dPDFSETTINGS=/prepress -dColorConversionStrategy=/sRGB -o output.pdf input.pdf。我认为/prepress选项为我提供了正确的设置。供参考,我还发现这个回答讨论GS图像处理/压缩非常有用:https://superuser.com/a/373740/684037 - Gerard Bosch

2
在Mac上,您可以使用sips命令。例如,
sips --matchTo '/System/Library/ColorSync/Profiles/Generic RGB Profile.icc' CMYKinput.pdf --out RGBoutput.pdf

RGB PDF可以通过相同的方式转换为CMYK(将'Generic RGB Profile.icc'更改为'Generic CMYK Profile.icc')。在OSX 10.12上测试过。

2
我通过将-dCompatibilityLevel从v1.4降级到v1.3来解决了同样的问题。
更新:v1.3会将PDF中的所有内容转换成一个对象,这意味着最终用户将无法在其查看器中选择文本或提取图像。
为了继续使用v1.4,我发现了一种在ghostscript上的技巧,可以帮助保持颜色的准确性,即禁用PDF透明度,因为RGB没有alpha通道,所以信息会丢失。
因此,如果您使用:-dNOTRANSPARENCY,您仍然可以使用:-dCompatibilityLevel=1.4,并且它将起作用。
精确命令:
gs -sDEVICE=pdfwrite -dBATCH -dNOPAUSE -dCompatibilityLevel=1.4 -dNOTRANSPARENCY -dColorConversionStrategy=/sRGB -dProcessColorModel=/DeviceRGB -dColorConversionStrategyForImages=/DeviceRGB -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -dUseCIEColor=true -sOutputFile=output.pdf input.pdf

由于我在使用PHP处理它,因此我编写了一个简单的类:

/**
 * Convert color profiles - PDF to PDF
 * Class Conversor
 */
class Conversor
{
    /**
     * Convert CMYK to RGB
     *
     * @param $input
     * @param $output
     * @return string
     */
    public static function gsCmykToRgb($input, $output)
    {
        $gsScript = ('gs -sDEVICE=pdfwrite \
                         -dBATCH -dNOPAUSE \
                         -dCompatibilityLevel=1.4 \
                         -dNOTRANSPARENCY \
                         -dColorConversionStrategy=/sRGB \
                         -dProcessColorModel=/DeviceRGB \
                         -dColorConversionStrategyForImages=/DeviceRGB \
                         -dTextAlphaBits=4 \
                         -dGraphicsAlphaBits=4 \
                         -dUseCIEColor=true \
                         -sOutputFile='."$output".' '."$input");
        exec($gsScript);

        return realpath($output);
    }
}

你可以在这里找到关于Ghostscript的所有信息: http://www.ghostscript.com/doc/9.05/Use.htm

开发人员表示 (1,2,3),没有 -dColorConversionStrategyForImages 开关。 - Igor

1
据我所知,ghostscript 只能够转换栅格图像中的色彩空间

podofocolor

http://podofo.sourceforge.net/

能够转换矢量对象

您可以尝试以这种方式将CMYK转换为灰度(适用于黑白非彩色页面):

podofocolor grayscale input.pdf output.pdf

如果二进制文件不在存储库中,不幸的是您需要自己构建。但是,我刚刚尝试使用

将PDF转换为灰度。
gs -sOutputFile=output.pdf -sDEVICE=pdfwrite -sColorConversionStrategy=Gray -dProcessColorModel=/DeviceGray -dCompatibilityLevel=1.4 input.pdf < /dev/null

预处理检查显示已将其转换为灰度,所以,也许我之前说gs只能转换pdf中光栅内容的颜色空间是错误的(因为我的pdf是矢量化的)。


谢谢,我想尝试一下,但是我使用的是Ubuntu 10.04,它没有podofo软件包。你知道在哪里可以找到它吗? - Robert Kovačević
我更新了我的答案,尝试将包含矢量元素的PDF的颜色空间转换为灰度。 - Dingo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接