簡體   English   中英

使用 ghostscripts sOutputICCProfile 將 RGB PDF 轉換為純黑色的 CMYK

[英]Converting RGB PDF in CMYK with plain black using ghostscripts sOutputICCProfile

目前我正在使用 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 渲染為我不想要的 bitmap。

現在,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。推薦的配置文件是:PS0coated_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)中實現的function

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

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

使用由 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 行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM