【问题标题】:Converting RGB PDF in CMYK with plain black using ghostscripts sOutputICCProfile使用 ghostscripts sOutputICCProfile 将 CMYK 中的 RGB PDF 转换为纯黑色
【发布时间】:2022-08-15 21:48:42
【问题描述】:

目前我正在使用 weasyprint 52.5 版生成 pdf。生成的 pdf 格式为 RGB,但我需要使用 CMYK 格式进行打印。现在我尝试使用 Ghostscript 9.50 版进行转换,它工作得很好,但我生成的 PDF 总是包含深黑色的文本。

我确实找到了将 RGB(0,0,0)转换为纯黑色(K=100%)的解决方案。我尝试了这个问题中描述的黑客: Converting (any) PDF to black (K)-only CMYK。 但这仅在我的 pdf 不包含我拥有的任何透明对象时才有效,否则 ghostscript 会将我的 PDF 呈现为我不想要的位图。

现在,ghostscript 支持建议使用 ICC 配置文件来完成相同的结果,而不是使用 hack:https://bugs.ghostscript.com/show_bug.cgi?id=704872

所以我不得不咨询我的打印机,为我提供一个 icc 配置文件,我应该使用它来代替 hack。这就是问题所在,我无法使用 ghostscript 并将 ICC 配置文件嵌入到 pdf 中。似乎ghostscript将pdf转换为cmyk,但我认为它使用的是defaul_cmyk.icc配置文件而不是我指定的icc配置文件。

此外,我真的不认为我打印机的 ICC 配置文件是正确的。我尝试检查我的 PDF,生成的 CMYK 黑色从来都不是纯 K。推荐的配置文件是:PS0 coating v3.icc

这是我的ghostscript命令:

gs -q -o weasyprint_rgb.pdf -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -sProcessColorModel=DeviceCMYK -sColorConversionStrategy=CMYK -sColorConversionStrategyForImages=CMYK -dOverrideICC=true -dEncodeColorImages=true -sOutputICCProfile=PS0coated_v3.icc converted_cmyk.pdf

这也是我在 python(django) 中实现的函数

def convert_pdf_to_cmyk(pdf_bytes: bytes) -> bytes:
    if pdf_bytes is not None:
        with NamedTemporaryFile(prefix=\"weasyprint_rgb\", suffix=\".pdf\") as rgb_pdf_file:
            rgb_pdf_file.write(pdf_bytes)
            rgb_pdf_file.seek(0)
            # Converting pdf from RGB to CMYK
            # https://stackoverflow.com/questions/6241282/converting-pdf-to-cmyk-with-identify-recognizing-cmyk
            # HACK to convert rich black to plain CMYK black we need to convert it to ghostscript than to pdf
            # using a colour conversion script.
            # By default RGB->CMYK will create rich black instead plain K black
            # https://stackoverflow.com/questions/6248563/converting-any-pdf-to-black-k-only-cmyk/9024346#9024346).
            # with NamedTemporaryFile(prefix=\"ghostscript_\", suffix=\".ps\") as ghostscript_file:
            #     command = [
            #         \"gs\",
            #         \"-q\",
            #         \"-o\",
            #         ghostscript_file.name,
            #         \"-dNOPAUSE\",
            #         \"-dBATCH\",
            #         \"-sDEVICE=ps2write\",
            #         rgb_pdf_file.name,
            #     ]
            #     subprocess.check_call(command)
            with NamedTemporaryFile(prefix=\"converted_cmyk\", suffix=\".pdf\") as converted_pdf_file:
                command = [
                    \"gs\",
                    \"-q\",
                    \"-o\",
                    converted_pdf_file.name,
                    \"-sDEVICE=pdfwrite\",
                    \"-dNOPAUSE\",
                    \"-dBATCH\",
                    \"-sProcessColorModel=DeviceCMYK\",
                    \"-sColorConversionStrategy=CMYK\",
                    \"-sColorConversionStrategyForImages=CMYK\",
                    \"-dOverrideICC=true\",
                    \"-dEncodeColorImages=true\",
                    f\"-sDefaultCMYKProfile = {os.path.join(DOCUMENT_DATA_DIR, \'PSOcoated_v3.icc\')}\",
                    f\"-sOutputICCProfile = {os.path.join(DOCUMENT_DATA_DIR, \'PS0coated_v3.icc\')}\",
                    #os.path.join(DOCUMENT_DATA_DIR, \"rgb_to_plain_cmyk_black.ps\"),
                    rgb_pdf_file.name #ghostscript_file.name,
                ]
                subprocess.check_call(command)
                pdf_bytes = converted_pdf_file.read()
    return pdf_bytes

希望有任何解决方法的想法? :)

    标签: django pdf ghostscript cmyk


    【解决方案1】:

    使用由 argyll 的 collink 工具生成的 DeviceLink ICC 配置文件,方法是使用 -f 参数将源 RGB icc 绑定到目标 CMYK icc,以强制仅在 K 板上对中性色和黑色进行编码。

    如果生成的 DeviceLink ICC 命名为“sRGB_to_eciCMYK_v2.icc(我使用 sRGB 作为源,FOGRA59/eciCMYK_v2 作为目标)”添加如下行

    Image_RGB   sRGB_to_eciCMYK_v2.icc  0   1   0
    Graphic_RGB sRGB_to_eciCMYK_v2.icc  0   1   0
    Text_RGB    sRGB_to_eciCMYK_v2.icc  0   1   0
    

    到 control.txt 文件

    并使用带参数的 Ghostscript

    -sDEVICE=pdfwrite \
    -sColorConversionStrategy=CMYK \
    -sSourceObjectICC=control.txt \
    

    其中 sSourceObjectICC 是 txt 文件,用于定义图像、图形和文本 RGB 对象应使用的 ICC 配置文件和意图。对于通常不希望仅将中性点强制为 K 的更好图像,请使用 collink 但不带 -f 参数制作另一个 ICC DeviceLink 配置文件,并将此配置文件用于 control.txt 文件中的 Image_RGB 行。

    【讨论】:

      猜你喜欢
      • 2020-01-23
      • 1970-01-01
      • 2016-06-06
      • 2014-03-12
      • 1970-01-01
      • 2011-01-26
      • 2020-05-31
      • 2011-09-09
      • 1970-01-01
      相关资源
      最近更新 更多