我正在开发“无纸化”工作流程,并计划将所有文件保存为 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 错误,并且总是能得到很好的答复,而且我发现的真正的错误都已得到修复。