【问题标题】:Converting RGB PDFs to CMYK PDFs via GhostScript CLI / Python (quality problem)通过 GhostScript CLI / Python 将 RGB PDF 转换为 CMYK PDF(质量问题)
【发布时间】:2022-01-09 10:52:24
【问题描述】:

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

  1. 读入 SVG 设计文件(带图像)
  2. 处理 SVG 文件
  3. 将其转换为可用于网络的 PDF 和可打印的 PDF

我的问题是将 RGB PDF 转换为 CMYK PDF。包含 15MB 照片的 SVG 将导出为 15MB RGB PDF,然后转换(使用 GhostScript)为 3MB CMYK PDF。尝试 ImageMagic 时,输出 PDF 的分辨率由密度决定,我找不到如何在设置密度时保持 PDF 的画布大小。

到目前为止,我有一个脚本可以读取 SVG 文件并进行一些操作(使用 svgutils 添加徽标,通过扫描 SVG 文本文件来更改一些文本)。然后它使用 Inkscape 导出可用于 Web 的 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

【问题讨论】:

  • 它可能没有什么区别,但我从 rgb 2 cmyk 开始。无论哪种方式,我在 Acrobat 中打开转换后的 PDF 并进行打印生产分析,并将色彩空间注册为 cmyk。所以,我相信这方面工作正常。

标签: python pdf ghostscript


【解决方案1】:

我发现了一些 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。 它仍然需要一些调整,但现在正处于正确的轨道上(如果我得到更好的过程,我会更新这个答案)。

感谢这篇文章,我找到了信息:http://zeroset.mnim.org/2014/07/14/save-a-pdf-to-cmyk-with-inkscape/

文档在这里(不要忘记删除要搜索的前导字母(“dColorImageFilter”到“ColorImageFilter”):https://www.ghostscript.com/doc/current/VectorDevices.htm

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 2017-02-21
    • 2016-06-15
    相关资源
    最近更新 更多