通过 GhostScript CLI 将 RGB PDF 转换为 CMYK PDF / Python(质量问题)
Converting RGB PDFs to CMYK PDFs via GhostScript CLI / Python (quality problem)
我正在尝试使用 python 脚本实现以下目标:
- 读入 SVG 设计文件(带图像)
- 处理 SVG 文件
- 将其转换为可用于网络的 PDF 和可用于打印的 PDF
我的问题是将 RGB PDF 转换为 CMYK PDF。包含 15MB 照片的 SVG 将导出为 15MB RGB PDF,但随后(使用 GhostScript)转换为 3MB CMYK PDF。尝试使用 ImageMagic 时,输出 PDF 的分辨率由密度决定,我找不到如何在设置密度时保持 PDF 的 canvas 大小。
到目前为止,我有一个脚本可以读取 SVG 文件并进行一些操作(使用 svgutils 添加徽标,通过扫描 SVG 文本文件来更改一些文本)。然后使用 Inkscape 导出可用于网络的 PDF(使用“--export-area-page”并将文本转换为路径)和临时 PDF(使用“--export-margin=X”,其中 X 是出血大小,还将文本转换为路径)。临时 PDF 是我需要的,除了它是 RGB 而不是 CMYK。所以,然后我想转换这个文件(Inkscape 不适用于 CMYK)。
这是我用来转换文件的函数(它是用 GhostScript 设置的,我也在试用 ImageMagick):
converter_program = "GHOSTSCRIPT"
def convertPDFtoPrintReadyPDF(pdf_in, new_filename=None, output_location=None):
global converter_program
if (new_filename == None):
new_filename = os.path.basename(pdf_in).replace(".svg", ".pdf")
if (output_location == None):
output_location = os.path.dirname(pdf_in)
output_file = output_location + "\" + new_filename
argument_list = []
if (converter_program == "GHOSTSCRIPT"):
pdf_tool_loc = r'"C:\Program Files\gs\gs9.55.0\bin\gswin64c.exe"' # Added "c" at end for non-window version (command line)
argument_list.append('-o "' + output_file + '"')
argument_list.append(r"-sDEVICE=pdfwrite")
argument_list.append(r"-dUseBleedBox")
argument_list.append(r"-dQUIET")
argument_list.append(r"-dPDFSETTINGS=/printer")
argument_list.append(r"-dCompressPages=false")
argument_list.append(r"-dMaxInlineImageSize=200000")
argument_list.append(r"-dDetectDuplicateImages")
#argument_list.append(r"-dJPEGQ=100")
argument_list.append(r"-dAutoFilterColorImages=false")
argument_list.append(r"-dAutoFilterGrayImages=false")
#argument_list.append(r"-sCompression=Flate")
#breaks the code: argument_list.append(r"-sColorImageFilter=/Flate")
#argument_list.append(r"-r600")
argument_list.append(r"-dColorImageResolution=600")
argument_list.append(r"-dGrayImageResolution=300")
argument_list.append(r"-dMonoImageResolution=1200")
argument_list.append(r"-dDownsampleColorImages=false")
argument_list.append(r"-sProcessColorModel=DeviceCMYK")
argument_list.append(r"-sColorConversionStrategy=CMYK")
argument_list.append(r"-sColorConversionStrategyForImages=CMYK")
argument_list.append('"' + pdf_in + '"')
elif (converter_program == "IMAGEMAGICK"):
pdf_tool_loc = 'magick'
argument_list.append(r'convert "' + pdf_in + '"')
argument_list.append(r"-density 300")
argument_list.append(r"-resize 100%")
argument_list.append(r"-colorspace CMYK")
argument_list.append('"' + output_file + '"')
#convert tp_rgb.pdf -verbose -density 300 -colorspace CMYK tp_cmyk.pdf
argument_string = " ".join(argument_list)
subprocess.run(pdf_tool_loc + " " + argument_string, shell=True, check=True)
return output_file
版本:
Python 3.8.10
GhostScript 9.55.0
ImageMagick 7.1.0-16
我找到了一些要添加到转换过程中的 GhostScript 参数:
argument_list.append(r"-dAutoFilterColorImages=false")
argument_list.append(r"-dAutoFilterGrayImages=false")
argument_list.append(r"-dColorImageFilter=/FlateEncode")
argument_list.append(r"-dGrayImageFilter=/FlateEncode")
argument_list.append(r"-dDownsampleMonoImages=false")
argument_list.append(r"-dDownsampleGrayImages=false")
因此,完整的参数列表如下所示:
argument_list.append('-o "' + output_file + '"')
argument_list.append(r"-sDEVICE=pdfwrite")
argument_list.append(r"-dUseBleedBox")
argument_list.append(r"-dQUIET")
argument_list.append(r"-dDetectDuplicateImages")
argument_list.append(r"-dAutoFilterColorImages=false")
argument_list.append(r"-dAutoFilterGrayImages=false")
argument_list.append(r"-dColorImageFilter=/FlateEncode")
argument_list.append(r"-dGrayImageFilter=/FlateEncode")
argument_list.append(r"-dDownsampleMonoImages=false")
argument_list.append(r"-dDownsampleGrayImages=false")
argument_list.append(r"-dColorImageResolution=300")
argument_list.append(r"-dGrayImageResolution=300")
argument_list.append(r"-sProcessColorModel=DeviceCMYK")
argument_list.append(r"-sColorConversionStrategy=CMYK")
argument_list.append(r"-sColorConversionStrategyForImages=CMYK")
argument_list.append('"' + pdf_in + '"')
这将 15MB->3MB 转换为 15MB->53MB。
它仍然需要一些调整,但现在正处于正确的轨道上(如果我的过程更好,我会更新这个答案)。
感谢这个 post 我找到了信息:http://zeroset.mnim.org/2014/07/14/save-a-pdf-to-cmyk-with-inkscape/
文档在这里(不要忘记删除要搜索的前导字母(“dColorImageFilter”到“ColorImageFilter”):https://www.ghostscript.com/doc/current/VectorDevices.htm
我正在尝试使用 python 脚本实现以下目标:
- 读入 SVG 设计文件(带图像)
- 处理 SVG 文件
- 将其转换为可用于网络的 PDF 和可用于打印的 PDF
我的问题是将 RGB PDF 转换为 CMYK PDF。包含 15MB 照片的 SVG 将导出为 15MB RGB PDF,但随后(使用 GhostScript)转换为 3MB CMYK PDF。尝试使用 ImageMagic 时,输出 PDF 的分辨率由密度决定,我找不到如何在设置密度时保持 PDF 的 canvas 大小。
到目前为止,我有一个脚本可以读取 SVG 文件并进行一些操作(使用 svgutils 添加徽标,通过扫描 SVG 文本文件来更改一些文本)。然后使用 Inkscape 导出可用于网络的 PDF(使用“--export-area-page”并将文本转换为路径)和临时 PDF(使用“--export-margin=X”,其中 X 是出血大小,还将文本转换为路径)。临时 PDF 是我需要的,除了它是 RGB 而不是 CMYK。所以,然后我想转换这个文件(Inkscape 不适用于 CMYK)。
这是我用来转换文件的函数(它是用 GhostScript 设置的,我也在试用 ImageMagick):
converter_program = "GHOSTSCRIPT"
def convertPDFtoPrintReadyPDF(pdf_in, new_filename=None, output_location=None):
global converter_program
if (new_filename == None):
new_filename = os.path.basename(pdf_in).replace(".svg", ".pdf")
if (output_location == None):
output_location = os.path.dirname(pdf_in)
output_file = output_location + "\" + new_filename
argument_list = []
if (converter_program == "GHOSTSCRIPT"):
pdf_tool_loc = r'"C:\Program Files\gs\gs9.55.0\bin\gswin64c.exe"' # Added "c" at end for non-window version (command line)
argument_list.append('-o "' + output_file + '"')
argument_list.append(r"-sDEVICE=pdfwrite")
argument_list.append(r"-dUseBleedBox")
argument_list.append(r"-dQUIET")
argument_list.append(r"-dPDFSETTINGS=/printer")
argument_list.append(r"-dCompressPages=false")
argument_list.append(r"-dMaxInlineImageSize=200000")
argument_list.append(r"-dDetectDuplicateImages")
#argument_list.append(r"-dJPEGQ=100")
argument_list.append(r"-dAutoFilterColorImages=false")
argument_list.append(r"-dAutoFilterGrayImages=false")
#argument_list.append(r"-sCompression=Flate")
#breaks the code: argument_list.append(r"-sColorImageFilter=/Flate")
#argument_list.append(r"-r600")
argument_list.append(r"-dColorImageResolution=600")
argument_list.append(r"-dGrayImageResolution=300")
argument_list.append(r"-dMonoImageResolution=1200")
argument_list.append(r"-dDownsampleColorImages=false")
argument_list.append(r"-sProcessColorModel=DeviceCMYK")
argument_list.append(r"-sColorConversionStrategy=CMYK")
argument_list.append(r"-sColorConversionStrategyForImages=CMYK")
argument_list.append('"' + pdf_in + '"')
elif (converter_program == "IMAGEMAGICK"):
pdf_tool_loc = 'magick'
argument_list.append(r'convert "' + pdf_in + '"')
argument_list.append(r"-density 300")
argument_list.append(r"-resize 100%")
argument_list.append(r"-colorspace CMYK")
argument_list.append('"' + output_file + '"')
#convert tp_rgb.pdf -verbose -density 300 -colorspace CMYK tp_cmyk.pdf
argument_string = " ".join(argument_list)
subprocess.run(pdf_tool_loc + " " + argument_string, shell=True, check=True)
return output_file
版本:
Python 3.8.10
GhostScript 9.55.0
ImageMagick 7.1.0-16
我找到了一些要添加到转换过程中的 GhostScript 参数:
argument_list.append(r"-dAutoFilterColorImages=false")
argument_list.append(r"-dAutoFilterGrayImages=false")
argument_list.append(r"-dColorImageFilter=/FlateEncode")
argument_list.append(r"-dGrayImageFilter=/FlateEncode")
argument_list.append(r"-dDownsampleMonoImages=false")
argument_list.append(r"-dDownsampleGrayImages=false")
因此,完整的参数列表如下所示:
argument_list.append('-o "' + output_file + '"')
argument_list.append(r"-sDEVICE=pdfwrite")
argument_list.append(r"-dUseBleedBox")
argument_list.append(r"-dQUIET")
argument_list.append(r"-dDetectDuplicateImages")
argument_list.append(r"-dAutoFilterColorImages=false")
argument_list.append(r"-dAutoFilterGrayImages=false")
argument_list.append(r"-dColorImageFilter=/FlateEncode")
argument_list.append(r"-dGrayImageFilter=/FlateEncode")
argument_list.append(r"-dDownsampleMonoImages=false")
argument_list.append(r"-dDownsampleGrayImages=false")
argument_list.append(r"-dColorImageResolution=300")
argument_list.append(r"-dGrayImageResolution=300")
argument_list.append(r"-sProcessColorModel=DeviceCMYK")
argument_list.append(r"-sColorConversionStrategy=CMYK")
argument_list.append(r"-sColorConversionStrategyForImages=CMYK")
argument_list.append('"' + pdf_in + '"')
这将 15MB->3MB 转换为 15MB->53MB。 它仍然需要一些调整,但现在正处于正确的轨道上(如果我的过程更好,我会更新这个答案)。
感谢这个 post 我找到了信息:http://zeroset.mnim.org/2014/07/14/save-a-pdf-to-cmyk-with-inkscape/
文档在这里(不要忘记删除要搜索的前导字母(“dColorImageFilter”到“ColorImageFilter”):https://www.ghostscript.com/doc/current/VectorDevices.htm