2

我想使用 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%
    

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 文件。根据-sProcessColorModel值 (DEVICERGB) 打印出正确的值。

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

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

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


更新

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

为了更明确,我将使用一个示例。有两个文件:(input1.pdf似乎使用RGB)和input2.pdf(似乎使用CMYK)。我想将它们都转换为 PDF/A-1。感谢您的提示,我已经放弃了上述批处理脚本,而是直接在命令行中测试了该命令。阅读Ps2pdf.htm#PDFA后,我调整了(官方)PDFA_def.ps以便使用 Adob ​​eRGB1998.icc。然后我对两个输入文件调用了以下命令(将 output1.pdf 替换output2.pdf 和 input1.pdf 由input2.pdf替换第二文件):

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

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

"output2.pdf", 1, 40, 0x03418614, "A device-specific color space (DeviceCMYK) without an appropriate output intent is used.", 1
"output2.pdf", 20, 0, 0x83410612, "The document does not conform to the requested standard.", 1

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

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

我在上面的命令中缺少什么?

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

4

1 回答 1

1

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

我不确定你在这里要求什么。您必须创建一个 RGB 或 CMYK 格式的 PDF/A 文件(无论如何,在级别 1 或 2,我还没有阅读修订版 3 规范),因为您不能同时使用这两种格式(您可以将所有内容转换为设备当然是独立的颜色)。输入中使用的色彩空间无关紧要,只是决定是否需要转换。

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

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

更新了答案,因为这开始变得太长而无法发表评论:

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

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

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

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

于 2014-09-25T16:03:05.797 回答