[英]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.