currently i am generating a pdf using weasyprint version 52.5. The pdf generated is in RGB but i need it in CMYK for printing. Now i tried converting it using ghostscript version 9.50 which works just fine, but my generated PDF always consists of texts in rich black.
I did find a solution to convert the RGB(0,0,0) to plain black(K=100%). I tried the hack described in this issue: Converting (any) PDF to black (K)-only CMYK. But this only worked if my pdf didn't consists any transparent objects which i have, else ghostscript would render my PDF to a bitmap which i don't want.
Now instead of using the hack, the ghostscript support recommended using ICC profiles to accomplish the same result: https://bugs.ghostscript.com/show_bug.cgi?id=704872.
So i had to consult my printer to provide me with an icc profiles which i should use instead of the hack. And here is the problem, i can't get to make ghostscript use and embedd the ICC profile into the pdf. It seems ghostscript converts the pdf to cmyk but i think its using the defaul_cmyk.icc profile and not my specified icc profle.
Also i don't realy think that the ICC profile from my printer is the right one. I tried inspecting my PDF and the CMYK black generated was never plain K. The recommended profile was: PS0coated_v3.icc
Here is my ghostscript command:
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
Also here is my function implemented in 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
Would appreciate any ideas in how to solve this? :)