将PDF转换为PDF / A以使用ghostscript

最后发布: 2019-11-12 07:29:30


问题

我尝试使用以下参数:

          '-dPDFA=2 ' +
          '-dBATCH ' +
          '-DNOSAFER ' +
          '-dNOPAUSE ' +
          '-sColorConversionStrategy=UseDeviceIndependentColor ' +
          '-sDEVICE=pdfwrite ' +
          '-dPDFACompatibilityPolicy=1 ' +
          '-o ./temp.pdf' +
          './PDFA_def.ps' +
          './out/temp.pdf'

我的PDFA_def.ps看起来像这样:

%!
% This is a sample prefix file for creating a PDF/A document.
% Users should modify entries marked with "Customize".
% This assumes an ICC profile resides in the file (srgb.icc),
% in the current directory unless the user modifies the corresponding line below.

% Define entries in the document Info dictionary :


% Define an ICC profile :
/ICCProfile (/Users/user/nestjs/ISOcoated_v2_300_eci.icc) % Customise
def

[/_objdef {icc_PDFA} /type /stream /OBJ pdfmark

%% This code attempts to set the /N (number of components) key for the ICC colour space.
%% To do this it checks the ColorConversionStrategy or the device ProcessColorModel if
%% ColorConversionStrategy is not set.
%% This is not 100% reliable. A better solution is for the user to edit this and replace
%% the code between the ---8<--- lines with a simple declaration like:
%%   /N 3
%% where the value of N is the number of components from the profile defined in /ICCProfile above.
%%
[{icc_PDFA}
<<
>> /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 (ISO Coated v2 300% (ECI)) % Customize
>> /PUT pdfmark
[{Catalog} <</OutputIntents [ {OutputIntent_PDFA} ]>> /PUT pdfmark

寻找解决方案时下载的ISOcoated_v2_300_eci.icc。 我尝试使用来自gs / lib / iccprofiles /的默认iccs /我尝试使用-sColorConversionStrategy RGB,CMYK,灰色而不是UseDeviceIndependentColor,它没有帮助。 对话成功结束,并且Ghostscript不会引发任何错误。 但是,当我在veraPDF中验证结果文件时,会得到以下报告 (html文件)。

你有什么主意吗?

更新

源文件

恢复文件

pdf ghostscript pdfa
回答

一个直接的问题是,您已将Ghostscript设置为生成PDF / A-2文件,并且正在测试是否符合更早,更严格的标准PDF / A-1。 您需要设置PDFA = 1或测试PDF / A-2的一致性

如果使用DeviceIndependentColor,则无需指定OutputIntent。 如果您使用RGB,CMYK或Gray,则必须使用OutptuIntent,其中包含适当数量的组件。 我怀疑您在此过程中未正确解决此问题。

您尚未提供输入文件或输出文件,因此无法对HTML文件中的许多错误报告进行注释,并且无法遵循html文件中的链接。 我建议您提供源文件和输出文件,以及那些特定文件的一致性报告。

[编辑]

使用上面的原始文件和srgb.icc配置文件(您不能使用Ghostscript配置文件,因为它们是版本4配置文件,并且与PDF / A-1不兼容)以及-sColorConversionStrategy = RGB我生成了这个 PFD / A-1b文件。 使用当前版本的VeraPDF,该版本使用PDF / A-1b一致性测试进行无误验证。

[另一个编辑]

使用当前代码和此命令行:

gs -dNOSAFER -sDEVICE=pdfwrite -dPDFA=2 -sColorConversionStrategy=RGB -dPDFACompatibilityPolicy=1 -sOutputFile=pdfa2.pdf pdfa_def.ps "vertrag.pdf"

其中vertrag.pdf是原始输入文件,而pdfa_def.ps包含:

%!
% This is a sample prefix file for creating a PDF/A document.
% Users should modify entries marked with "Customize".
% This assumes an ICC profile resides in the file (srgb.icc),
% in the current directory unless the user modifies the corresponding line below.

% Define entries in the document Info dictionary :
[ /Title (Title)       % Customise
  /DOCINFO pdfmark

% Define an ICC profile :
/ICCProfile (/temp/srgb.icc) % Customise
def

[/_objdef {icc_PDFA} /type /stream /OBJ pdfmark

%% This code attempts to set the /N (number of components) key for the ICC colour space.
%% To do this it checks the ColorConversionStrategy or the device ProcessColorModel if
%% ColorConversionStrategy is not set.
%% This is not 100% reliable. A better solution is for the user to edit this and replace
%% the code between the ---8<--- lines with a simple declaration like:
%%   /N 3
%% where the value of N is the number of components from the profile defined in /ICCProfile above.
%%
[{icc_PDFA}
<<
%% ----------8<--------------8<-------------8<--------------8<----------
  systemdict /ColorConversionStrategy known {
    systemdict /ColorConversionStrategy get cvn dup /Gray eq {
      pop /N 1 false
    }{
      dup /RGB eq {
        pop /N 3 false
      }{
        /CMYK eq {
          /N 4 false
        }{
          (ColorConversionStrategy not a device space, falling back to ProcessColorModel, output may not be valid PDF/A.)=
          true
        } ifelse
      } ifelse
    } ifelse
  } {
    (ColorConversionStrategy not set, falling back to ProcessColorModel, output may not be valid PDF/A.)=
    true
  } ifelse

  {
    currentpagedevice /ProcessColorModel get
    dup /DeviceGray eq {
      pop /N 1
    }{
      dup /DeviceRGB eq {
        pop /N 3
      }{
        dup /DeviceCMYK eq {
          pop /N 4
        } {
          (ProcessColorModel not a device space.)=
          /ProcessColorModel cvx /rangecheck signalerror
        } ifelse
      } ifelse
    } ifelse
  } if
%% ----------8<--------------8<-------------8<--------------8<----------

>> /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 (sRGB) % Customize
>> /PUT pdfmark
[{Catalog} <</OutputIntents [ {OutputIntent_PDFA} ]>> /PUT pdfmark

(以下是Ghostscript 9.50附带的示例,该示例已修改为使用srgb ICC配置文件)

我得到这个文件。 执行VeraPDF(版本1.14.8 Greenfield解析器)的PDF / A-2b配置文件会显示绿色文本“ PDF符合Validation Profile要求”

我注意到你剪了剪线在你pdfa_def.ps的版本,但haev 添加像/ N 3线,作为指示告诉你。 该值必须正确,它必须是ICC配置文件中的组件数,这就是为什么必须自己添加它的原因。 或者,当然,只需保留尝试为您完成任务的行。 如果将它们删除,则由您自己来替换为正确的值。

请注意,Ghostscript将发出多个警告,因为原始文件包含设置为1的套印模式,这在PDF / A-2中是不允许的,并且具有非打印注释,在PDF / A-2中是不允许的,并且在字符串中是文档信息为UTF16BE,在PDF / A-2(或A-1)中也不允许。 由于选择了PDFACompatibilityPolicy,所有这些都将被删除,这可能导致生成的PDF文件无法正确呈现。

作为另一个实验,我使用了以下命令行:

gs -dNOSAFER -sDEVICE=pdfwrite -dPDFA=2 -sColorConversionStrategy=UseDeviceIndependentColor -dPDFACompatibilityPolicy=1 -sOutputFile=pdfa2.pdf "vertrag.pdf"

因为它使用DeviceIndependentColor,所以无需执行pdfa_def.ps(我们在PDF文件中不需要OutputIntent),并且该文件可以使用相同版本的VeraPDF进行验证。

为了进行其他的完整性检查,我使用了Acrobat Pro Preflight工具来检查文件,这些文件也验证了它们的兼容性。