Linux中的Ghostscript:CMYK PDF到CMYK EPS

时间:2017-02-21 04:25:20

标签: pdf ghostscript eps

我有一些sRGB PDF数据,我正在尝试将其转换为CMYK EPS以获取已接受的论文。由于我没有看到任何帖子一步解释整个过程,我决定先做sRGB PDF - > CMYK PDF和CMYK PDF - > CMYK EPS。第二步是我遇到困难的地方,但我会将完整程序包括在内。

我使用下面的图来说明我的问题,其中第一个是输入。这三个数字位于zip文件https://www.dropbox.com/s/7wr84bqhp3rzagg/figs.zip?dl=0

  1. 'figure.pdf',sRGB PDF输入文件
  2. 'figure_cmyk.pdf',CMYK PDF中间文件
  3. 'figure_cmyk.eps',最终的EPS文件应该是CMYK但不是。
  4. 我将使用这些数字以方便其他问题。几个小时后,我终于能够通过组合Converting PDF to CMYK (with identify recognizing CMYK)的答案将sRGB PDF(1)转换为CMYK PDF(2)。最难的部分是让'识别'检测到新的PDF实际上是CMYK。我使用Chris Hecker的hacky技巧让这个转换步骤起作用。然后我用命令调用识别:

    identify -format '%[colorspace]' figure_1_cmyk.pdf
    

    它说CMYK,到目前为止一直很好。我认为下一步应该很简单,只需将CMYK PDF转换为CMYK EPS即可。但这是我真正陷入困境的地方。我在(2)上使用以下bash脚本'pdf2eps.sh'来获取(3)。

    #!/bin/bash
    
    gs \
    -dNOPAUSE \
    -dNOCACHE \
    -dBATCH \
    -dNOSUBSTDEVICECOLORS \
    -sDEVICE=eps2write \
    -sOutputFile="${1%%.pdf}.eps" \
    "$1"
    

    无论是否带有'-dNOSUBSTDEVICECOLORS'标志,生成的.eps文件(3)都会以某种方式恢复为'识别'检测到的sRGB。您可以使用提供的数字自行检查。我真的不知道我能尝试什么,但我对ghostscript也很新。如果有比我更多知识的人能告诉我如何获得(3)成为CMYK,我将非常感激。

    难道识别只是错误吗?我不知道使用linux工具检查(3)实际上是否是CMYK的其他方法。如果有更简单的方法可以获得高质量的sRGB PDF到CMYK EPS,我当然会感兴趣。命令行工具'convert'对我没有好处。

    此致 BRAM

    --------------------

    P.S。自从其中一个答案中提出请求后,我用于第一步的代码(RGB PDF - > CMYK PDF)如下:

    bash脚本

    #!/bin/bash
    
    gs \
    -dPDFX \
    -dBATCH \
    -dNOPAUSE \
    -dNOOUTERSAVE \
    -dPDFSETTINGS=/prepress \
    -dCompatibilityLevel=1.5 \
    -sDEVICE=pdfwrite \
    -sColorConversionStrategy=CMYK \
    -sProcessColorModel=DeviceCMYK \
    -dHaveTransparency=false \
    -sOutputFile="${1%%.pdf}_cmyk.pdf" \
    PDFX_def_fogra39_trickcmyk.ps \
    "$1"
    

    添加了文件'PDFX_def_fogra39_trickcmyk.ps'

    %!
    % $Id$
    % This is a sample prefix file for creating a PDF/X-3 document.
    % Feel free to modify entries marked with "Customize".
    
    % This assumes an ICC profile to reside in the file (ISO Coated sb.icc),
    % unless the user modifies the corresponding line below.
    
    systemdict /ProcessColorModel known {
      systemdict /ProcessColorModel get dup /DeviceGray ne exch /DeviceCMYK ne and
    } {
      true
    } ifelse
    { (ERROR: ProcessColorModel must be /DeviceGray or DeviceCMYK.)=
      /ProcessColorModel cvx /rangecheck signalerror
    } if
    
    % Define entries to the document Info dictionary :
    
    % /ICCProfile (/usr/share/color/icc/ISOcoated_v2_300_eci.icc) def  % Customize or remove.
    
    [ /GTS_PDFXVersion (PDF/X-3:2002) % Must be so (the standard requires).
      /Title (Title)                  % Customize.
      /Trapped /False                 % Must be so (Ghostscript doesn't provide other).
      /DOCINFO pdfmark
    
    % Define an ICC profile :
    
    currentdict /ICCProfile known {
      [/_objdef {icc_PDFX} /type /stream /OBJ pdfmark
      [{icc_PDFX} <</N systemdict /ProcessColorModel get /DeviceGray eq {1} {4} ifelse >> /PUT pdfmark
      [{icc_PDFX} ICCProfile (r) file /PUT pdfmark
    } if
    
    % Define the output intent dictionary :
    
    [/_objdef {OutputIntent_PDFX} /type /dict /OBJ pdfmark
    [{OutputIntent_PDFX} <<
      /Type /OutputIntent              % Must be so (the standard requires).
      /S /GTS_PDFX                     % Must be so (the standard requires).
      /OutputCondition (Commercial and specialty printing) % Customize
      /Info (none)                     % Customize
      /OutputConditionIdentifier (FOGRA39)      % Customize
      /RegistryName (http://www.color.org)   % Must be so (the standard requires).
      currentdict /ICCProfile known {
        /DestOutputProfile {icc_PDFX}  % Must be so (see above).
      } if
    >> /PUT pdfmark
    [{Catalog} <</OutputIntents [ {OutputIntent_PDFX} ]>> /PUT pdfmark
    
    [/_objdef {OutputIntent_PDFX} /type /dict /OBJ pdfmark
    [{OutputIntent_PDFX} <<
      /ColorSpace /DeviceCMYK          % convince ImageMagick's identify that it's CMYK
      /Type /OutputIntent              % Must be so (the standard requires).
      /S /GTS_PDFX                     % Must be so (the standard requires).
      /OutputCondition (Commercial and specialty printing) % Customize
      /Info (none)                     % Customize
      /OutputConditionIdentifier (CGATS TR 003)      % Customize
      /RegistryName (http://www.color.org)   % Must be so (the standard requires).
      currentdict /ICCProfile known {
        /DestOutputProfile {icc_PDFX}  % Must be so (see above).
      } if
    >> /PUT pdfmark
    [{Catalog} <</OutputIntents [ {OutputIntent_PDFX} ]>> /PUT pdfmark
    

1 个答案:

答案 0 :(得分:0)

好的,首先你使用稍微旧版本的Ghostscript(9.18),当前版本是9.20,9.21将很快发布。

其次;你可以一步完成整个工作。您还没有说明用于创建CMYK PDF的命令行,但如果在该命令行中使用eps2write而不是pdfwrite,则应该获得CMYK EPS而不是CMYK PDF。这两个设备实际上共享99%以上的代码,大多数命令行交换机与这两个设备的工作方式相同。

NOSUBSTDEVICECOLORS开关基本上是合法的,现在根本就不应该使用。

最后;您还没有充分的理由认为EPS文件 CMYK。我找不到&#39;识别&#39;在这里成为一个有用的工具。检测PostScript程序中使用的颜色空间的唯一方法是完全解释它,并且识别不是PostScript解释器!我猜它会使用Ghostscript来渲染EPS,而图像的颜色空间将取决于Ghostscript设备用于渲染。

查看输出文件,我看到颜色是使用:

指定的
0.875 0.765625 0 0 k
0.875 0.765625 0 0 K

/ k和/ K定义为:

/k/setcmykcolor load def
/K/setcmykcolor load def

如果文件使用的是RGB颜色,那么您可能希望看到&#34; r g b rg&#34;或者&#34; r g b RG&#34;,它们都不存在于EPS文件的正文中。

所以是的,它的识别是错误的,虽然我并不特别责怪它,我相信它的用途实际上是用于位图图像,而不是高级页面描述语言。如上所述,如果您使用命令行来创建CMYK PDF并将设备设置为eps2write,您应该只需一步即可获得CMYK EPS。请注意,由于EPS旨在包含在其他程序中,因此它不能包含多个页面,因此如果您从多页输入开始,则应使用&#39;%d&#39; filename语法,用于获取多个EPS文件,每页一个。

修改 这里的大部分内容都是多余的,或者在创建中间文件时可能有害:

gs \
-dPDFX \
-dBATCH \
-dNOPAUSE \
-dNOOUTERSAVE \
-dPDFSETTINGS=/prepress \
-dCompatibilityLevel=1.5 \
-sDEVICE=pdfwrite \
-sColorConversionStrategy=CMYK \
-sProcessColorModel=DeviceCMYK \
-dHaveTransparency=false \
-sOutputFile="${1%%.pdf}_cmyk.pdf" \
PDFX_def_fogra39_trickcmyk.ps \
"$1"

制作PDF / X限制了PDF文件的允许构造,这意味着当您不必要时,您将回到较低级别的默认值。如果您没有设置PDF / X,那么您不需要PDF / X_def.ps文件,因为所有操作都设置为默认值。

你不需要设置-dHaveTransparency = false,首先是因为它包含在PDF / X代码中,其次是因为PostScript不支持透明度,所以如果你直接去也为你照顾的EPS。

你不应该使用任何 PDFSETTINGS,除非你有充分的理由(并且可以向我解释; - )

限制PDF级别(并且pdfwrite无法使用大于1.5的功能创建PDF)

不要使用NOOUTERSAVE,在这种情况下所做的一切都会让你失去性能....

使用当前代码,如果您设置ColorConversionStrategy,那么它会为您设置ProcessColorModel,因此您也不需要这样做。

我建议:

gs \
-dBATCH \
-dNOPAUSE \
-sDEVICE=eps2write \
-sColorConversionStrategy=CMYK \
-sOutputFile="${1%%.pdf}_cmyk.eps" \
"$1"