通过Ghostscript将PDF文件转换为PDF / A.

时间:2014-09-25 14:21:01

标签: ghostscript pdfa

我希望使用Ghostscript 9.15将任意PDF文件转换为PDF / A.

  1. Ghostscript是否能够创建符合PDF / A-3b标准的PDF?没有表示PDF / A一致性级别的参数,因此我假设没有可能性。还是有什么我忽略的?

  2. 我正在关注一篇博客文章,其中使用Windows批处理文件将PDF转换为PDF / A(请参阅http://www.mcbsys.com/techblog/2013/04/batch-convert-pdf-to-pdfa/)。批处理中的gs调用是:

    "%gs_path%\gswin64c" ^
     -dPDFA ^
     -dNOOUTERSAVE ^
     -sProcessColorModel=DeviceRGB ^
     -sDEVICE=pdfwrite ^
     -o "GS_%file1%" ^
     -dPDFACompatibilityPolicy=1 ^
      "%currentdir%\PDFA_def.ps" ^
      %inputfilelist%
    
  3. PDFA_def.ps 是官方版本的调整版本:

    %!
    % This prefix file for creating a PDF/A document is derived from
    % the sample included with Ghostscript 9.07, released under the
    % GNU Affero General Public License. 
    % Modified 4/15/2013 by MCB Systems.
    
    % Feel free to modify entries marked with "Customize".
    
    % This assumes an ICC profile to reside in the file (AdobeRGB1998.icc),
    % unless the user modifies the corresponding line below.
    
    % The color space described by the ICC profile must correspond to the
    % ProcessColorModel specified when using this prefix file (GRAY with
    % DeviceGray, RGB with DeviceRGB, and CMYK with DeviceCMYK).
    
    % Define entries in the document Info dictionary :
    
    /ICCProfile (... PATH TO ... AdobeRGB1998.icc)   % Customize.
    def
    
    [ /Title (Title)                  % Customize.
      /DOCINFO pdfmark
    
    % Define an ICC profile :
    
    [/_objdef {icc_PDFA} /type /stream /OBJ pdfmark
    [{icc_PDFA} <</N systemdict /ProcessColorModel get /DeviceGray eq {1} {systemdict /ProcessColorModel get /DeviceRGB eq {3} {4} ifelse} ifelse >> /PUT pdfmark
    [{icc_PDFA} ICCProfile (r) file /PUT pdfmark
    
    % Define the output intent dictionary :
    
    [/_objdef {OutputIntent_PDFA} /type /dict /OBJ pdfmark
    [{OutputIntent_PDFA} <<
      /Type /OutputIntent             % Must be so (the standard requires).
      /S /GTS_PDFA1                   % Must be so (the standard requires).
      /DestOutputProfile {icc_PDFA}            % Must be so (see above).
      /OutputConditionIdentifier (AdobeRGB1998)      % Customize
    >> /PUT pdfmark
    [{Catalog} <</OutputIntents [ {OutputIntent_PDFA} ]>> /PUT pdfmark
    

    因此,我使用 Adob​​eRGB1998.icc ,这显然可用于具有RGB色彩空间的PDF文件。根据{{​​1}}值(DEVICERGB),打印出正确的值。

    转换适用于所有文件。但是当我根据PDF / A-1b验证创建的PDF文件时,根据输入文件是否具有RGB颜色空间(例如CMYK),我会得到不同的结果。因此,当我有一个使用CMYK颜色空间的输入PDF文件时,该文件由脚本转换,但验证器说的是这样的:

    -sProcessColorModel

    我的问题:有没有办法让任意文件完成转换(即独立于输入文件中使用的颜色空间)?


    更新

    @KenS感谢您的回答。我已经更新了我的初始帖子,以澄清我想要实现的目标。

    为了使其更明确,我将使用一个例子。有两个文件:input.pdf", 1, 38, 0x03418614, "A device-specific color space (DeviceCMYK) without an appropriate output intent is used.", 1 "output.pdf", 20, 0, 0x83410612, "The document does not conform to the requested standard.", 1 (似乎使用RGB)和input1.pdf(似乎使用CMYK)。我想将它们都转换为PDF / A-1。感谢您的提示,我已经放弃了上面提到的批处理脚本,而是直接在命令行中测试了该命令。阅读Ps2pdf.htm#PDFA后,我调整了(官方) PDFA_def.ps ,以便使用 Adob​​eRGB1998.icc 。然后我在两个输入文件上调用了以下命令(由 output2.pdf 替换 output1.pdf ,用 input2替换 input1.pdf 。 pdf 为第二个文件):

    input2.pdf

    转换完成没有任何错误。 output1.pdf似乎有效,但output2.pdf仍然无效(使用3heights Validator进行测试):

    gswin64c.exe -dPDFA=1 -dBATCH -dNOPAUSE -dNOOUTERSAVE \
                 -sColorConversionStrategy=/RGB \
                 -sOutputICCProfile=AdobeRGB1998.icc -sDEVICE=pdfwrite \
                 -sOutputFile=output1.pdf -dPDFACompatibilityPolicy=1 \
                  "PATH/TO/OFFICIAL/PDFA_def.ps" input1.pdf
    

    因此,当我正确理解您的答案时,上面的命令应该生成一个使用RGB颜色空间的pdf文件 - 与输入文件的颜色空间无关。如果输入文件使用CMYK,则必须使用上述命令将颜色转换为RGB。

    当我正确解释第一个错误消息时,output2.pdf中使用的颜色空间仍然是CMYK(尽管命令参数如ColorConversionStrategy = / RGB)。由于我使用的是AdobeRGB1998.icc,因此会出现验证错误。

    上述命令中缺少什么?

    回到我原来的问题(更进一步):我不想总是转换为RGB(或CMYK),而是想以某种方式检测输入文件中使用的颜色空间,然后动态切换到RGB或CMYK icc文件。是否有可能实现这一目标?

1 个答案:

答案 0 :(得分:1)

Ghostscript不支持PDF / A-3。您要查找的一致性参数是-dPDFA =其中有效值为空(默认为1),1或2.您可以在ghostpdl / gs / doc / ps2pdf / htm#PDFA中找到此文件

我不确定你在这里要求的是什么。您必须创建一个PDF / A文件(无论如何,我还没有阅读第3版或第2版),这是RGB或CMYK,因为您不能同时使用它们(您可以将所有内容转换为设备)当然是独立的颜色)。除了决定是否需要转换之外,输入中使用的颜色空间不相关。

这是你需要决定的事情,我们无法为你决定。一个重要原因是OutputIntent 必须 RGB或CMYK一致,并且pdfwrite设备不检查它,它假设您选择了一个与设备空间匹配的设备您正在使用PDF文件(顺便说一句,不要设置ProcessColorModel,而是使用ColorConversionStrategy)在您的情况下,您已将OutputIntent设置为AdobeRGB1988,因此您的颜色必须以设备无关颜色指定或RGB。

鉴于您引用的错误,我建议问题是您没有指定-sColorConversionStrategy,因此输入颜色不会转换为所需的设备空间。我会进一步猜测你从set -dUseCIEColor中复制了这个脚本,而你没有复制那个位。不要设置-dUseCIEColor,它是一个可怕的古老的PostScript hackery。而是设置ColorConversionStrategy,它将根据需要以更好的方式转换颜色。

更新回答,因为评论开始时间过长:

我无法立即看到您的命令行出现任何问题,您可以共享示例PDF文件吗?用一个可靠的例子来研究这些事情要容易得多。我从客户和其他免费用户那里了解到,pdfwrite能够生成符合标准的PDF / A-1b文件。

关于第二个问题;它不可能这样做,因为目前你需要在开始之前将OutputIntentProfile设置为CMYK或RGB。在进行颜色操作然后决定之前,您不能只运行输入PDF文件。如果您觉得某些编程可以通过修改pdfwrite来完成,因为在输出关闭之前实际上并未使用该配置文件。

一个问题是,为了进行颜色转换,您需要设置底层的ProcessColorModel(这是由ColorConversionStategy自动完成的)。更改ProcessColorModel的唯一方法是执行setpagedevice,这会导致擦除。现在我认为实际上可以用pdfwrite修复,它所做的只是在页面上写一个白色矩形,所以你应该能够截取它而不是发出它。否则,在遇到RGB或CMYK操作之前所做的任何标记都将位于白色矩形下面.....

所以基本上没有,你现在不能这样做,如果它对你很重要那么你可以修改代码来做到这一点(不要忘记你还需要提供2个OutputIntent配置文件以便在它们之间进行选择)。我们从来没有客户要求这样做,因此我们不太可能将其作为一个项目。当然,如果你确实如此工作,我们可以很好地将它合并到代码库中,如果你要将它提供给我们。