可以交给审计员的合规证据
Spec: ISO 19005-4 (PDF/A-4)ISO 19005-4 (PDF/A-4)Spec: ISO 32000-2ISO 32000-2Spec: ETSI EN 319 142-1ETSI EN 319 142-1Spec: EN 16931-1EN 16931-1
审计员并不想听到一份文件“合规”。他们想要拿到两样东西:这份文件,以及一份说它确实合规的检查结果。本页讲的就是如何用 NextPDF 同时产出这两者——符合规范的输出,以及一份你可以摆在提问者面前的验证结果。
开源核心产出归档 PDF/A 输出与 PAdES 基准签名,并且验证符合性——PDF/A、PDF/UA 以及签名。高级版本则将能力延伸到长期验证与电子发票。贯穿始终的,是一条不变的规则:符合性是检核工具给出的裁定,而不是生成器有权做出的承诺。
为什么这很重要
标题为“为什么这很重要”的章节合规工作有一个破绽。有人说“是的,它符合规范”,随后整个房间陷入沉默,因为没有人能拿出证明这一点的东西。文件看起来没问题。这个库声誉良好。但这些都不是证据。
这道缺口的代价是不对称的。一份仅仅看起来符合规范的文件,今天能通过评审,几个月后却会在某个外部检查中失败——在税务机关、在长期归档库中,或在法庭上——届时原始的上下文已不复存在,而要解释这次失败的代价高昂。标准恰恰预见到了这一点。一份 PDF/A 文件会在其元数据中记录目标配置文件,但这项标识陈述的是生成器的意图;符合性的判定,是由生成软件之外的某个验证流程做出的(Spec: ISO 19005-4 (PDF/A-4), §6.7.3ISO 19005-4 (PDF/A-4) §6.7.3)。格式本身就告诉你,生成器并没有最终的话语权。
精简版
标题为“精简版”的章节- 你既能产出符合规范的输出,又能产出一份说它符合规范的结果。 这不是一句声明——而是一件产物外加一次检查。
- 核心覆盖了常见场景。 它产出 PDF/A 归档输出与 PAdES B-B / B-T 签名,并针对 PDF/A、PDF/UA 以及签名验证符合性。
- 符合性是验证器给出的裁定,限定于某个标准、条款与等级。 NextPDF 陈述它所针对的配置文件与等级,绝不会给出一个不加限定的“合规”(Spec: ETSI EN 319 142-1, §6.1ETSI EN 319 142-1 §6.1)。
- 高级版本延伸了覆盖范围。 长期验证(PAdES B-LT / B-LTA)与电子发票(依 EN 16931 的 ZUGFeRD / Factur-X)属于商业层级的能力。
- 引擎拒绝伪造裁定。 它产出一个候选档并运行检查;它绝不会凭自己的权威把一份文件盖章认定为符合规范。
NextPDF 如何处理它
标题为“NextPDF 如何处理它”的章节这套方法只有一道干净的分离,并将其贯彻到每一处:产出某个标准所定义的产物是一项能力;判定该产物符合规范则是一项裁定。NextPDF 给你前者,并让你从检核工具那里获得后者。它绝不会把两者混为一谈。
正是这道分离,让输出变得“可交付”。签名就是最清晰的例子。它的值是在一段经过声明的字节范围上计算得出的,而这段范围刻意排除了签名本身(Spec: ISO 32000-2, §12.8ISO 32000-2 §12.8),这正是为什么有效性是第三方能够从文件中重新计算出来、而非凭信任接受的东西。生成器的工作,是正确地写出这套结构。验证器的工作,是确认它。两项工作,两个当事方,而审计员信任的是后者。
所以你交出去的工作流有四步,而第三步正是把“应当符合”变成“确实符合”的那一步。
- Produce a candidateGenerate PDF/A archival output or a PAdES signature with the conformance-relevant structure in place — embedded fonts, declared profile, a signature over a correct byte range.
- Refuse the impossibleThe engine rejects conformance-breaking combinations (an encrypted PDF/A, a signature level it cannot honor) rather than emitting a file that silently does not conform.
- Validate independentlyRun a conformance checker — PDF/A, PDF/UA, signature. A passing report is the evidence; the producing library is not.
- Hand over bothGive the auditor the document and the validation result together. The verdict travels with the artifact.
中间这一步不是装饰。当归档模式已开启,却又尝试执行不兼容的操作时——例如开启加密——引擎会抛出一个具类型的错误,而不是把文件降级成一份不符合规范的“归档”文件。大声拒绝,正是让候选档保持足够诚实、得以通过随后那次检查的关键。
而这次检查是分级的,绝不是单一的一位标志。PAdES 在设计上就是分级的:B-B、B-T、B-LT 与 B-LTA,每一级都在前一级的基础上有所增加(Spec: ETSI EN 319 142-1, §6.1ETSI EN 319 142-1 §6.1)。一个 B-T 签名携带着 B-B 所没有的可信时间戳。一项指明等级的声明是诚实的声明;一句光秃秃的“已签名”则不是。NextPDF 强制你指明等级,于是你交出去的结果会准确地说明到底达成了什么。
实践示例
标题为“实践示例”的章节一段简短而完整的形态。它产出一个候选档、验证它,并把验证器的答案当作证据——而绝不是那个生成调用。
<?php
declare(strict_types=1);
use NextPDF\Contracts\PdfDocumentInterface;use NextPDF\Conformance\ConformanceValidator;use NextPDF\Conformance\ConformanceTarget;use NextPDF\Conformance\ValidationReport;
/** * Produce a candidate, then prove it with an independent check. * * The producing call returns bytes that SHOULD conform. Only the * validator's report turns "should" into something an auditor accepts. * * @param PdfDocumentInterface $candidate A document composed for archival * (fonts embedded, profile declared) */function archivalEvidence( PdfDocumentInterface $candidate, ConformanceValidator $validator,): ValidationReport { // 1. The producing call states intent; it does not certify. $bytes = $candidate->getPdfData();
// 2. The check is the verdict. Conformance is decided here, by the // validator, against the named target — not by the line above. $report = $validator->validate($bytes, ConformanceTarget::PdfA);
// 3. Hand BOTH over: the bytes plus the report. The report names the // target, the level, and every requirement that was checked. return $report;}变量取名为 $candidate 是有意为之,报告作为返回值也是有意为之。文件是你产出的东西;报告是证明它的东西。审计员要你演示符合性——所以你给他们的是这场演示,而不是生成器的一面之词。
常见误解
标题为“常见误解”的章节那个让归档库塞满未被保存的文件、让收件箱塞满被退回的发票的误解很简单:“库说它是 PDF/A,所以这份文件就是 PDF/A。” 这并非库有权做出的裁定。一个生成器可以产出一份意图符合规范的文件,却仍然漏掉某项规范性要求;只有验证流程,才能把意图变成判定。把生成调用当成证明,是这里的核心错误,而这恰恰是审计员受过训练要抓出来的错误。
第二个更隐蔽的陷阱,是把“NextPDF 符合标准”听成一项总括的保证。世上没有这种东西,也没有任何诚实的引擎会提供它。符合性是逐标准、逐条款、逐等级的。正确的声明会指明是哪个配置文件、哪个等级,并展示那次检查。一项缺了这些的声明就是营销话术,而 Insider_ 不会印出它。
限制与边界
标题为“限制与边界”的章节- NextPDF 产出一个符合规范的候选档并验证它;它并不认证符合性。 验证器的报告才是证据。生成库绝不会签发它自己的证书。
- 验证是检核工具的结果,而不是绝对的保证。 一次干净的运行,意味着文件满足了该验证器所检查的那些要求,针对的是它所实现的那一版标准。这是现有最强的证据,而不是某种形而上的证明。
- 核心的覆盖范围是 PDF/A 归档输出与 PAdES B-B / B-T 签名,外加针对 PDF/A、PDF/UA 以及签名的符合性验证。 它不会悄无声息地提供高级版本的能力。
- 长期验证(B-LT / B-LTA)与电子发票(依 EN 16931 的 ZUGFeRD / Factur-X)属于高级版本的能力。 EN 16931-1 定义了载体所要据以验证的语义发票模型(Spec: EN 16931-1, ScopeEN 16931-1 Scope);满足它属于商业层级,而非核心。
- 法律效力是一个与技术符合性相互独立的问题。 一个签名在某个司法管辖区是否具有法律效力,是由法律与接收机关裁定的,而不是由验证器。NextPDF 谈的是技术结果;你的合规团队谈的才是它的法律分量。
| Edition | Availability |
|---|---|
| Core | Produces PDF/A archival output and PAdES B-B / B-T signatures, and validates conformance for PDF/A, PDF/UA, and signatures. The output and the validation result are both available to hand over. |
| Pro | Adds long-term validation — PAdES B-LT / B-LTA — embedding the revocation evidence and document timestamps that keep a signature verifiable after the certificate expires. |
| Enterprise | Adds e-invoicing (ZUGFeRD / Factur-X against EN 16931) and a structural conformance policy and report — still a structure check, with the final determination belonging to a validator and your compliance team. |
更深入的合规工具,以及每一项高级版本能力所引用的符合性边界,都收录在合规与符合性页面上。当你需要运行这项检查时,PDF/A 与 PDF/UA 验证疑难排解指南会带你走一遍如何读懂并修复一份失败的报告。
相关文件
标题为“相关文件”的章节- 归档与 PDF/A — PDF/A 保证什么,以及为什么证明符合性是与产出它相互独立的工作。
- 正确验证签名 — “签名有效”背后那一整套检查。
- 标准全貌 — 各标准化机构的版图,以及一项条款如何变成被测试的行为。
- PAdES 基准配置文件 — B-B、B-T、B-LT 与 B-LTA 作为一条递进路径,以及如何挑选你的义务所需要的等级。
- 发票与电子发票 — 依 EN 16931 的混合式 PDF/结构化数据发票,从头到尾。
词汇表
标题为“词汇表”的章节- 符合性(Conformance) — 一份文件与某标准的规范性要求相一致,由一个验证流程判定,并限定于某个特定的标准、条款与等级。
- 候选档(Candidate) — 一份意图符合规范、但尚未经独立验证器确认确实符合的文件。
- 验证器/符合性检核工具(Validator / conformance checker) — 依据某标准的要求评判一份文件、并产出审计员所依赖之结果的独立软件。
- PDF/A — ISO 19005 系列:一套用于长期保存的受限 PDF 配置文件,设计用来随时间推移重现一份文件的静态外观。
- PDF/UA — ISO 14289 系列:定义一份带标签的 PDF 如何向辅助技术传达结构的无障碍配置文件。
- PAdES — PDF Advanced Electronic Signatures(PDF 高级电子签名),即 ETSI EN 319 142 的签名配置文件系列(B-B、B-T、B-LT、B-LTA),ISO 32000-2 在 PDF 签名中引用了它。
- EN 16931 — 定义核心电子发票语义数据模型的欧洲标准,即混合式电子发票载体所要据以检查的义务。