Mar*_*rry 5 pdf ghostscript cutepdf
我正在开发一个“无纸化”工作流程,并计划以 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
Run Code Online (Sandbox Code Playgroud)
在 PDFA_def.ps 中,我尝试了几种不同的 ICC 配置文件,包括我在系统上找到的一个
C:/Windows/System32/spool/drivers/color/CalibratedDisplayProfile-5.icc
Run Code Online (Sandbox Code Playgroud)
和sRGB_IEC61966-2-1_no_black_scaling.icc
来自color.org。
我的测试输入文件是使用CutePDF 2.8(使用Ghostscript 8.15)从Microsoft Outlook 2010 打印的一页电子邮件。
使用我的批处理文件和 Ghostscript 9.07 进行转换后,Adobe Reader 认为输出是 PDF/A,但pdf-tools.com 的PDF/A-1b 验证失败并显示消息“密钥 N 的值是 4 但必须是 3 .”
我已经将其追溯到 PDF 输出文件中的以下结构:
<</Filter/FlateDecode
/N 4/Length 2595>>stream
Run Code Online (Sandbox Code Playgroud)
如果我更改/N 4
为/N 3
,“键 N 的值”消息就会消失。/N
显然表示此标头后面的流中的对象数。我不知道如何读取编码流,所以我不明白它包含什么,也不明白为什么 pdf-tools 认为它必须只包含 3 个对象。
使用同样使用 Ghostscript 的 Bullzip 打印的 PDF/A 也无法通过“密钥 N 为 4 但必须为 3”消息的验证。
这与色彩空间有关系吗?我在那里超出了我的深度。我想我会对“普通”sRGB 空间感到满意。Ghostscipt 文档说 PDF/A 编码必须是 CMYK。Adobe 暗示RGB 或 CMYK 适用于 PDF/A。所以我不清楚如何找到合适的 .icc 配置文件。
或者也许验证器是错误的,一切都很好?
在此错误报告中的 GhostScript 开发人员的帮助下,我能够解决/N
问题。得到教训:
/N
表示着色剂的数量。/N
值。Ghostscript 9.07 中包含的示例仅发出/N 1
(对于 ProcessColorModel=DeviceGray)或/N 4
(对于任何其他 ProcessColorModel)。/N 4
,但使用了描述 RGB 颜色空间的 ICC 配置文件。验证器正确地发现了这种差异:我承诺了 4 种颜色,但只描述了 3 种颜色。我为显示器和办公打印机找到的大多数 ICC 配置文件都描述了 RGB 色彩空间。(CMYK 似乎更专用于高端印刷机和某些类型的纸张。)就我而言,RGB 更可取。以下批处理文件将 PDF 文件转换为具有 RGB 颜色空间的 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
Run Code Online (Sandbox Code Playgroud)
在 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
Run Code Online (Sandbox Code Playgroud)
长行包含一个嵌套ifelse
语句,它将检测 ProcessColorModel=DeviceRGB 并发出适当的/N 3
. 生成的文件应通过pdf-tools.com 上的验证。
更新:我创建了一个功能更强大的批处理程序并将其发布在博客文章中: Batch Convert PDF to PDF/A。