PDF/A-4 一致性:NextPDF 会为 ISO 19005-4 输出哪些内容
快速概览
标题为“快速概览”的章节边界声明。 NextPDF 生成的输出以符合 PDF/A-4 为目标;库本身并不声明一致性——这由验证器(例如 veraPDF)决定。
PDF/A-4 即 ISO 19005-4:2020,是基于 PDF 2.0 的归档配置文件。NextPDF Core 提供 ConformanceMode 判别器(PdfA4、PdfA4e、PdfA4f)。Premium 的 nextpdf/pro 引擎会在 save() 期间输出 OutputIntent、嵌入的 ICC 配置文件,以及 XMP pdfaid 标识结构描述。库负责生成这些产物;一致性由 veraPDF 判定。ISO 19005-4 §6.7.3 明确指出:pdfaid:part/pdfaid:rev 属性「本身并不能决定一致性」。
composer require nextpdf/core:^3composer require nextpdf/pro # OutputIntent + ICC + XMP authoringCore 的 security.pdfa 能力已注册,但缺少 nextpdf/pro 时会报告为不可用。此时 enablePdfA() 会抛出 InvalidConfigException 并提示升级路径,而不会输出不符合规范的文件。
概念总览
标题为“概念总览”的章节Document::enablePdfA(?object $version = null) 会把 PdfAVersion 枚举输入映射到某个 ConformanceMode case。遇到无法识别的输入时,它会默认使用 ConformanceMode::PdfA4('4e' → PdfA4e、'4f' → PdfA4f)。这个模式会驱动标准对符合规范文件所要求的三项输出义务:
- OutputIntent + ICC ——§6.2.3 允许符合规范的文件,通过引用
DestOutputProfileICC 流的 PDF/A-4 OutputIntent 来指定其颜色特性。依 §6.2.4.1,这是实现设备无关颜色的两条允许路径之一(另一条是直接指定设备无关颜色空间)。因此,OutputIntent 是 NextPDF 选择的路径,而不是标准的无条件要求。 pdfaid标识 ——§6.7.3 要求在文档级 XMP 中提供 PDF/A 标识结构描述(AIIMpdfaid命名空间),并带有pdfaid:part/pdfaid:rev。PDF/A-4e 与 PDF/A-4f 还会额外设置pdfa:conformance(E / F)。§6.7.3 也指出,两者均不符合的文件不得提供pdfa:conformance值。- 字体嵌入 ——§6.2.10 要求用于绘制的所有字体都必须嵌入。
NextPDF 负责输出这些内容;它并不执行 §5 的一致性判定。那是 veraPDF 的工作,而 §6.7.3 将这项判定留给该流程。
API
标题为“API”的章节| 方法 | 作用 |
|---|---|
enablePdfA(?object $version = null): static | 路由到 ConformanceMode::PdfA4/PdfA4e/PdfA4f;并在 save() 时安排 OutputIntent + ICC + XMP。缺少 nextpdf/pro 时会抛出 InvalidConfigException|PageLayoutException|CompressionException。 |
ConformanceMode::pdfaPart(): ?int | 返回当前模式对应的 ISO 19005 部分(PdfA4* 为 4)。 |
ConformanceMode::pdfaConformanceLetter(): string | 返回 pdfa:conformance 字母(E / F)或空字符串。 |
代码示例——快速开始
标题为“代码示例——快速开始”的章节<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;use NextPDF\Exception\InvalidConfigException;use NextPDF\Support\CapabilityRegistry;
$out = getenv('NEXTPDF_COOKBOOK_OUTPUT') ?: __DIR__ . '/archival.pdf';
$registry = CapabilityRegistry::getInstance();if (!$registry->get('security.pdfa')->isAvailable()) { fwrite(STDERR, "PDF/A-4 requires nextpdf/pro.\n"); exit(1);}
try { $doc = Document::createStandalone(); $doc->enablePdfA(); // ConformanceMode::PdfA4 $doc->setTitle('Archival Record 2026-0042'); $doc->setLanguage('en'); $doc->writeHtml('<h1>Archival record</h1><p>Body.</p>'); $doc->save($out); // OutputIntent + ICC + XMP scheduled here} catch (InvalidConfigException $e) { fwrite(STDERR, $e->getMessage() . "\n"); exit(1);}
echo "Wrote {$out} — validate: verapdf --flavour 4 {$out}\n";代码示例——生产环境
标题为“代码示例——生产环境”的章节把验证器的裁决包装成构建 gate(门槛)。对输出执行 verapdf --flavour 4,并在退出码非零时让构建失败。验证器的裁决才是 gate——库的输出只是它的输入,本身永远不是裁决。完整的 gated 流水线请见 PDF/A-4 一致性 gate 示例 /cookbook/php/pdfa4-conformance-gate/。
边界情况与陷阱
标题为“边界情况与陷阱”的章节- 先启用再添加内容。 在添加内容之前先调用
enablePdfA();事后再启用并不会重新处理已写入的对象。 - 不加密。 PDF/A 禁止使用
Encrypt键。不要对 PDF/A 文件调用setEncryption()。加密属于机密性范畴,而非归档完整性;两者在此互斥。 pdfa:conformance是有条件的。 只有 PDF/A-4e 与 PDF/A-4f 会设置它。在纯 PDF/A-4 文件上输出它,本身就是一种一致性违规(§6.7.3)——ConformanceModecase 从设计上就杜绝了这种情况。- PDF/A-4f 附件。 依 §6.7.5,PDF/A-4f 文件中的嵌入文件必须带有
F与UF键(建议加上 Desc)。这是 ZUGFeRD/Factur-X 混合路径的基础。
OutputIntent + ICC 嵌入会在 save() 时加入一段固定大小的 ICC 流(工作颜色空间配置文件)与 XMP 包。对典型文档而言,预算为墙钟时间 ≤ 1500 ms、峰值内存 ≤ 128 MB。
安全注意事项
标题为“安全注意事项”的章节PDF/A-4 禁止加密。这个配置文件是一种 archival/longevity 归档/长期保存约束,而非安全控制。密钥保管与验证者策略不在此配置文件范围内;请见 信任中心。
数据落地与 PII 缓解措施
标题为“数据落地与 PII 缓解措施”的章节PDF/A-4 输出在处理进程内完成,只会写出文件本身、嵌入的 ICC 配置文件,以及 XMP 包。没有任何内容会离开处理进程。原始内容中的 PII 由集成方负责——此配置文件不会进行遮蔽。
安全遥测与日志清理
标题为“安全遥测与日志清理”的章节此示例只会把输出路径与验证器命令写到 STDERR。不会记录任何文件字节。此示例会遵循 NEXTPDF_COOKBOOK_OUTPUT,且绝不会把 PDF 输出到 STDOUT。
威胁模型
标题为“威胁模型”的章节PDF/A-4 文件不受访问控制保护。任何持有文件的人都能读取它;这个配置文件保证的是绘制结果的长期可用性,而非机密性。请把 OutputIntent ICC 流视为公开内容。
FIPS 模式行为
标题为“FIPS 模式行为”的章节PDF/A-4 输出不执行任何密码学运算。在 PDF/A-4 文件上添加数字签名(PDF/A-4 §6.5 允许 PAdES 配置文件)属于另一个独立的签名示例议题,并继承该示例的 FIPS 状态。本页不作任何关于签名的主张。
一致性
标题为“一致性”的章节| 主张 | 规范 | 条号 | 参考 ID |
|---|---|---|---|
| PDF/A-4 文件 可以 通过引用 DestOutputProfile ICC 配置文件的 PDF/A OutputIntent 来指定其颜色特性。 | ISO 19005-4 | §6.2.3 | |
| 设备无关颜色可直接指定,或通过 OutputIntent 的 DestOutputProfile 间接指定(两条允许路径之一)。 | ISO 19005-4 | §6.2.4.1 | |
| PDF/A 版本通过文档 XMP 中的 PDF/A 标识(pdfaid)结构描述来标示。 | ISO 19005-4 | §6.7.3 | |
| pdfaid:part / pdfaid:rev 本身并不能决定一致性;判定依据 Clause 5 进行。 | ISO 19005-4 | §6.7.3 | |
| 既不符合 PDF/A-4e 也不符合 PDF/A-4f 的文件,不得提供 pdfa:conformance 值。 | ISO 19005-4 | §6.7.3 | |
| PDF/A-4f 的嵌入文件需要 F 与 UF 键(建议加上 Desc)。 | ISO 19005-4 | §6.7.5 | |
| 用于绘制的所有字体都必须嵌入。 | ISO 19005-4 | §6.2.10 | |
| 透明度/颜色的使用取决于已声明的 OutputIntent。 | ISO 19005-4 | §6.2.9 |
引用以条号加 reference_id 指针指向验证语料库。不复现任何标准原文;条号均以 NextPDF 自己的话摘要。