Ghostscript PDF/A 转换验证失败

Ghostscript PDF/A 转换验证失败

我正在开发“无纸化”工作流程,并计划将所有文件保存为 PDF/A-1b 格式。

我正在尝试开发一个简单的批处理文件,用于将我创建或接收的 PDF 文件转换为 PDF/A-1b。从这个答案,我有以下批处理文件:

gswin32c ^
   -dPDFA ^
   -dNOOUTERSAVE ^
   -sProcessColorModel=DeviceCMYK ^
   -dUseCIEColor ^
   -sDEVICE=pdfwrite ^
   -o %2 ^
   -dPDFACompatibilityPolicy=1 ^
    "C:\Program Files (x86)\gs\gs9.07\mylib\PDFA_def.ps" ^
    %1

在 PDFA_def.ps 中,我尝试了几个不同的 ICC 配置文件,包括我在系统上找到的一个

C:/Windows/System32/spool/drivers/color/CalibratedDisplayProfile-5.icc

以及sRGB_IEC61966-2-1_no_black_scaling.icc来自颜色网站

我的测试输入文件是一封使用 CutePDF 2.8(使用 Ghostscript 8.15)从 Microsoft Outlook 2010 打印的 1 页电子邮件。

使用批处理文件和 Ghostscript 9.07 进行转换后,Adobe Reader 认为输出是 PDF/A,但 PDF/A-1b 验证pdf-tools.com失败并显示消息“键 N 的值为 4 但必须为 3。”

我已将其追溯到 PDF 输出文件中的以下构造:

<</Filter/FlateDecode
/N 4/Length 2595>>stream

如果我更改/N 4/N 3,则“键 N 的值”消息会消失。/N显然表示此标头后面的流中的对象数。我不知道如何读取编码流,所以我不明白它包含什么,也不明白为什么 pdf-tools 认为它​​只能包含 3 个对象。

使用 Bullzip 打印的 PDF/A(也使用 Ghostscript)也验证失败,并显示“键 N 是 4 但必须为 3”消息。

这和颜色空间有关吗?我对此一头雾水。我想我对“普通”的 sRGB 空间很满意。Ghostscipt 文档说 PDF/A 编码必须是 CMYK.Adobe 暗示RGB 或 CMYK 均可适用于 PDF/A。所以我不清楚如何找到合适的 .icc 配置文件。

或者验证器可能是错误的,一切都很好?

答案1

在 GhostScript 开发人员的帮助下错误报告,我能够解决这个/N问题。经验教训:

  • 我的问题中引用的 GhostScript 文档已过期。当前文档这里,表示 ProcessColorModel=DeviceRGB 是可以的。
  • ICC 配置文件描述了色彩空间。一些有效的色彩空间包括 GRAY、RGB 和 CMYK。您可以使用免费的ICC 配置文件检查器
  • 在 PDF 文件中导致验证错误的部分,/N表示着色剂的数量。
  • PDFA_def.ps 文件发出该/N值。Ghostscript 9.07 附带的示例仅发出/N 1(对于 ProcessColorModel=DeviceGray)或/N 4(对于任何其他 ProcessColorModel)。
  • 我最初的测试指定了 ProcessColorModel=DeviceCMYK,这导致了/N 4,但使用了描述 RGB 颜色空间的 ICC 配置文件。验证器正确地发现了这个差异:我承诺了 4 种颜色,但只描述了 3 种。

我发现的大多数用于显示器和办公打印机的 ICC 配置文件都描述了 RGB 颜色空间。(CMYK 似乎更适用于高端印刷机和某些类型的纸张。)就我的目的而言,RGB 更可取。以下批处理文件使用 RGB 颜色空间将 PDF 文件转换为 PDF/A-1b:

gswin32c ^
   -dPDFA ^
   -dNOOUTERSAVE ^
   -sProcessColorModel=DeviceRGB ^
   -dUseCIEColor ^
   -sDEVICE=pdfwrite ^
   -o %2 ^
   -dPDFACompatibilityPolicy=1 ^
    "C:\Program Files (x86)\gs\gs9.07\mylib\PDFA_def.ps" ^
    %1

在 PDFA_def.ps 中,指定描述 RGB 颜色空间的 ICC 配置文件,并更改定义 ICC 配置文件的部分,如下所示:

% 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

长行包含一个嵌套ifelse语句,它将检测 ProcessColorModel=DeviceRGB 并发出适当的/N 3。生成的文件应该通过验证pdf-tools.com

更新:我创建了一个功能更强大的批处理程序并将其发布在博客文章中: 批量将 PDF 转换为 PDF/A

答案2

我建议首先在最新的版本 9.07ghostscript,以防万一这个问题已经修复。

如果这没有帮助,就需要真正的 PDF 专家来解决这个问题。我怀疑问题与 .ps 文件的内容和 gswin32c 命令的参数之间的冲突有关。

但是,由于有问题的文件是由 ghostscript 生成的,因此您有权在ghostscript Bugzilla 页面(需要注册),开发人员将回答您的问题。如果这是 ghostscript 中的错误,则很可能会在下一版本中修复。

除了帖子中的问题描述外,您还应附加示例输入 .ps 文件和生成的 .pdf 文件。尽量减小它们的大小。

过去我曾在该论坛上报告过几个疑似 ghostscript 错误,并且总是能得到很好的答复,而且我发现的真正的错误都已得到修复。

相关内容