通过 GhostScript CLI 将 RGB PDF 转换为 CMYK PDF / Python(质量问题)

Converting RGB PDFs to CMYK PDFs via GhostScript CLI / Python (quality problem)

我正在尝试使用 python 脚本实现以下目标:

  1. 读入 SVG 设计文件(带图像)
  2. 处理 SVG 文件
  3. 将其转换为可用于网络的 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