繁体   English   中英

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

[英]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 ZBCD1B68617759B1DFCFF0403A6ZB5。 尝试 ImageMagic 时,output PDF 的分辨率由密度决定,我在设置密度时找不到如何保持 PDF 的 canvas 大小。

到目前为止,我有一个脚本可以读取 SVG 文件并进行一些操作(使用 svgutils 添加徽标,通过扫描 SVG 文本文件来更改一些文本)。 然后它使用 Inkscape 导出网络就绪的 PDF(使用“--export-area-page”并将文本转换为路径)和临时 PDF(使用“--export-margin=X”,其中 X 是出血大小,还将文本转换为路径)。 临时的 PDF 是我需要的,除了它是 RGB 而不是 CMYK。 所以,然后我想转换这个文件(Inkscape 不适用于 CMYK)。

这是我用来转换文件的 function(它是用 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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM