【问题标题】:Convert PDF files to PDF/A via Ghostscript通过 Ghostscript 将 PDF 文件转换为 PDF/A
【发布时间】:2014-11-20 08:51:33
【问题描述】:

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

所以,我使用 AdobeRGB1998.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,以便使用 AdobeRGB1998.icc。然后我对两个输入文件调用了以下命令(将 output1.pdf 替换为 output2.pdfinput1.pdfinput2. 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 文件。有可能实现吗?

【问题讨论】:

    标签: ghostscript pdfa


    【解决方案1】:

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

    中找到该参数

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

    这是您需要决定的事情,我们无法为您决定。一个重要原因是OutputIntent 必须either RGB或CMYK一致,而pdfwrite设备不检查它,它假定您选择了与设备空间匹配的一个您正在使用 PDF 文件(顺便说一下,不要设置 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 配置文件以供选择) )。我们从来没有客户要求这样做,所以我们不太可能把它作为一个项目。当然,如果您确实完成了这项工作,如果您将其提供给我们,我们很可能会将其合并到代码库中。

    【讨论】:

    • 我也更新了我的答案,它不适合评论。
    • 关于示例文件:有一个 Bavaria Testsuite,其中包含许多 pdf 文件。您可以在这里下载所有文件:pdflib.com/fileadmin/pdflib/Bavaria/2009-04-03-Bavaria-pdfa.zip 我测试的文件是“conforming\Real world\jmbl-2009-01.pdf”。提前致谢!
    • 只下载一个文件需要 40Mb 的下载量,你能找到一个更小且单独可用的文件吗?
    • @KenS:Bavaria Testsuite(以及相关的 Isartor Testsuite)应该由 GS 开发人员查看:文件其中包含的可能是要集成到标准 GS 自动化测试设置中的候选...
    • 我们的测试套件中已经有大约 80,000 个测试,包括几个行业标准的完整测试集。我们现在倾向于添加显示问题的文件,尤其是在它们被简化之后,至少部分是因为如果我们继续添加文件,不管我们的测试开始花费太长时间。
    猜你喜欢
    • 2016-06-15
    • 2020-03-07
    • 1970-01-01
    • 2010-12-12
    • 2023-04-08
    • 1970-01-01
    • 2022-01-19
    • 2017-02-21
    • 1970-01-01
    相关资源
    最近更新 更多