【发布时间】: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