KillerPDF 内置 PDF 2.0 引擎:免费生成 PDF/A-4 归档与 PDF/UA-2 无障碍文档的完整指南
【免费下载链接】KillerPDFFree and open-source PDF editor for Windows with a built-in PDF 2.0 engine. View, annotate, OCR, merge, split, crop, rotate, compare, edit text, draw, sign, fill forms, print, flatten, and open password-protected PDFs without a subscription.项目地址: https://gitcode.com/gh_mirrors/ki/KillerPDF
KillerPDF 是一款免费开源的 Windows PDF 编辑器,内置自研的KillerPDF.Engine(PDF 2.0 引擎),在创建文档时就原生支持PDF/A-4 长期归档与PDF/UA-2 无障碍两大国际标准的合规校验——包括结构树、输出意图(ICC 色彩配置)与无障碍标签。无需订阅,也不需要额外的付费验证服务,就能让文档"存得久、读得懂、验得过"。
为什么需要归档级 PDF?一份文档的"身份证"
普通 PDF 只保证"现在能打开",而PDF/A(Archival,归档级)则要求文档未来十年、五十年依然可被准确渲染:
- 自包含:字体必须嵌入,不依赖系统环境
- 色彩明确:必须携带 ICC 输出意图,保证颜色可重现
- 元数据完整:XMP 中写入
pdfaid命名空间标识
与之互补的是PDF/UA(Universal Accessibility,通用无障碍),它要求文档带上逻辑结构树和标签,让屏幕阅读器等辅助技术能够"读懂"文档的标题、段落、表格层次。
KillerPDF.Engine 在 engine/README.md 中明确写道:引擎内置PDF/A-4、PDF/A-4e、PDF/A-4f、tagged PDF 与 PDF/UA-2的创建防护,"结构树、父树、语义角色、替代描述、输出意图、嵌入字体、元数据、注释、表单和关联文件都作为协同的文档特性进行校验"。
PDF/A-4 的三大支柱:一个都不能少
引擎将 PDF/A-4 的合规要求浓缩为几条硬性规则,调用 PdfDocumentBuilder.EnablePdfA4Conformance() 开启后,构建文档时会自动逐条把关:
| 检查项 | 规则 | 源码位置 |
|---|---|---|
| 版本基线 | 必须是 PDF 2.0 或更高 | PdfDocumentBuilder.cs |
| XMP 元数据 | 必须写入 XMP 文档信息(含pdfaid标识) | PdfDocumentBuilder.cs |
| ICC 输出意图 | 必须提供并嵌入目标 ICC 配置 | PdfDocumentBuilder.cs |
| 字体嵌入 | 14 个内置 PDF 标准字体不得用于归档文档,正文必须嵌入 TrueType 字体 | PdfDocumentBuilder.cs |
| 加密限制 | PDF/A 文档禁止加密(归档可读性是底线) | PdfDocumentBuilder.cs |
| 附件限制 | 普通 PDF/A-4 不允许附件;EnablePdfA4fConformance()变体可携带关联嵌入文件 | PdfDocumentBuilder.cs |
除了"通用型" PDF/A-4,引擎还提供两种细分变体:
EnablePdfA4fConformance()(源码):允许携带关联嵌入文件,适合"文档 + 附件"整体归档EnablePdfA4eConformance()(源码):面向工程文档(CAD 图纸等)的合规变体
所有通过校验的文档,XMP 中都会自动写入pdfaid:part = 4、pdfaid:rev = 2020等标识(见 PdfDocumentBuilder.cs),这是验证器识别归档文档的关键"身份证"。
输出意图(Output Intent):让色彩"可追溯"的完整机制
输出意图是 PDF/A 的核心构件:它告诉阅读器和打印机"这份文档的色彩目标是什么"。KillerPDF 的实现由两个类协作完成:
1️⃣ PdfOutputIntentFactory.cs—— 输出意图工厂,负责生成标准字典对象。写入 PDF 目录(Catalog)时,意图字典固定包含:
S = GTS_PDFA1:声明这是一个 PDF/A 输出意图OutputConditionIdentifier:输出条件标识(如sRGB IEC61966-2.1)DestOutputProfile:指向嵌入文档内的 ICC 配置文件流- 可选的
OutputCondition、RegistryName(如http://www.color.org)、Info三个补充字段(工厂源码)
2️⃣ PdfIccProfile.cs—— ICC 配置文件对象。它不是"塞进去就算数",而是会逐字节校验:检查 ICC 签名(acsp)、色彩空间头(RGB、CMYK、Gray 等)、标签表范围与唯一性。损坏或不支持的配置文件会在加载时直接抛出异常,而不是被静默写入。测试用例覆盖了 GRAY、RGB、CMYK、XYZ、Lab 等十余种色彩空间头部(见 PdfOutputIntentTests.cs)。
如何启用?只需一行链式调用:
new PdfDocumentBuilder() .SetOutputIntent(PdfIccProfile.Load(iccBytes), "sRGB IEC61966-2.1") .EnablePdfA4Conformance() .Build();其中SetOutputIntent()的完整签名支持指定输出条件、注册表名称和附加说明(API 源码)。最终这些对象被写入文档目录的OutputIntents数组(序列化源码),配置文件作为独立流对象嵌入(源码),保证文档完全自包含。
💡 还有一个细节校验:PDF/A-4 禁止使用"与输出意图配置文件完全相同的 ICCBased CMYK 色彩空间"作为内容色彩空间,以避免冗余歧义(校验源码)。
结构树(Structure Tree):PDF/UA-2 无障碍的骨架
结构树是标签化 PDF 的"逻辑骨架":它把页面上零散的文本、图片按文档语义(章、节、段落、表格、图注)组织成一棵树。屏幕阅读器正是依靠它来播报"这是二级标题"、"这是一个 3 行 4 列的表格"。
30 种标准结构类型
引擎用枚举 PdfStructureType 完整覆盖了 PDF 标准定义的结构角色:
- 文档级:
Document(Document)、Part(Part)、Section(Sect) - 文本级:
Heading~Heading6(H1–H6)、Paragraph(P)、Span - 列表级:
List、ListItem、Label、ListBody - 表格级:
Table、TableRow、TableHeaderCell(TH)、TableDataCell(TD) - 内容级:
Figure(插图)、Formula(公式)、Link、Form(表单)等
值得注意的是 PdfStructureTypeNames 中的命名空间处理:Article、Quote、Note、Reference、Code这几类角色来自 PDF 1.7 扩展命名空间(如pdf:Art、pdf:Code),而启用 PDF/UA-2 后Note会被自动改写为FENote——引擎会自动处理这些标准差异,开发者无需关心。
结构树如何"长"在文档上
构建 API 提供两个方法(PdfDocumentBuilder.cs):
AddStructureContainer():添加不直接绑定页面内容的逻辑容器(如Document根节点、Section章节)AddStructureElement():将页面内容流中的标记内容(BDC/EMC)ID关联到结构元素,让逻辑树与视觉内容精确对应
两个方法都支持alternateDescription(替代文本,供屏幕阅读器播报)和actualText(实际文本,用于手写体/图形化文字的无障碍提取)两个关键参数,这正是 PDF/UA 无障碍标签的落点。
生成时,引擎会写入目录级的StructTreeRoot(结构树根)和MarkInfo { Marked: true }(标签化标记),以及文档语言Lang(序列化源码)。
PDF/UA-2 合规清单:引擎替你逐项把关
调用 PdfDocumentBuilder.EnablePdfUa2Conformance() 后,Build()会执行一整套闭环校验(完整校验逻辑),任何一项不满足都会明确报错并拒绝生成:
| 合规要求 | 引擎的把关方式 |
|---|---|
| 必须 PDF 2.0+ | 版本低于 2.0 直接报错(源码) |
| 元数据必须含标题 + 语言 | 语言必须是合法的 BCP 47 标签(如zh-CN),由 PdfLanguageTag 校验 |
| 页面导航必须按阅读顺序 | 要求 structure-order page tabs(源码) |
| 结构树必须有唯一的 Document 根 | 且根节点必须是最顶层唯一元素(源码) |
| 插图/公式必须有替代文本 | Figure、Formula缺alternateDescription即拒绝(源码) |
| 页面所有内容必须已标签或标记为装饰物 | 未标记内容无法进入结构树(源码) |
| 链接/注释/表单必须带描述性文字 | 链接、文本注释、表单 tooltip 缺描述即报错(源码) |
| 加密必须允许无障碍提取 | 禁止剥夺提取权限(源码) |
除了"有没有",引擎还校验结构树的语法正确性(结构树校验):
- 标题必须使用 H1–H6,禁止使用无级别的
Heading(源码) - 层级不能跳级:二级节点不能直接挂在文档根下(源码)
Span、Quote、Code等内联角色必须处于Paragraph或Span父节点内(源码)- 表格的每行列数必须一致(源码)
- 带
Label子项的列表必须配置编号方式(源码)
同时,XMP 中会自动写入pdfuaid:part = 2、pdfuaid:rev = 2024标识(源码),与 PDF/A 的pdfaid标识并列共存。
如何验证:让独立工具"背书"
KillerPDF 团队对"合规"的定义非常严格:合规必须是验证器背书的行为,而不是在文件头写个版本号(engine/README.md)。
在 KillerPdf.Engine.Corpus 中,引擎批量生成带 PDF/A-4 / PDF/UA-2 标识的文档语料,再用独立工具复核:
- qpdf:结构性验证
- verapDF:PDF/A-4 与 PDF/UA-2 冒烟验证
配套脚本还包括 validation/QpdfSweep.ps1 与 validation/Compare-VeraPDF.ps1,验证结果沉淀在 validation/RESULTS.md 和分版本基准数据 validation/benchmarks/ 中。相关测试文件(如 PdfOutputIntentTests.cs、PdfStructureTests.cs、PdfIccColorSpaceTests.cs)则覆盖了从 ICC 解析到结构树序列化的完整回归路径。
常见问题(FAQ)
Q1:PDF/A-4 和 PDF/UA-2 可以同时启用吗?可以。两者互补:前者解决"存得久",后者解决"读得懂"。引擎中EnablePdfA4Conformance()与EnablePdfUa2Conformance()相互独立、可叠加,共同构成一份既归档又无障碍的完整文档。
Q2:为什么 PDF/A-4 要求 PDF 2.0?KillerPDF 满足吗?ISO 32005-4 标准基于 PDF 2.0 规范制定。KillerPDF 的引擎正是以PDF 2.0为基线(见 docs/engine-publishing.md),版本检查在 Build() 入口 强制执行。
Q3:我已经有加密的表单文档,能做成 PDF/UA-2 吗?只有当加密权限允许无障碍提取时才合规;而 PDF/A 则一律禁止加密。这是引擎的硬性红线([源码](https://link.gitcode.com/i/2c2469bd7c4bf621cd4ce2cb7c4bdcfb, L1629))。
Q4:普通 Windows 用户不写代码也能受益吗?能。KillerPDF 桌面端(GPL-3.0 免费开源,无需订阅)在保存、导出文档时复用引擎的同一套合规防护,结构编辑、色彩管理、表单处理都受同一标准约束。
写在最后
KillerPDF.Engine 把 PDF/A-4 与 PDF/UA-2 从"事后验证的麻烦事"变成了"生成时的自动防护":输出意图保证色彩可追溯,结构树保证语义可导航,无障碍标签保证内容可提取——三者协同,且每一条都有明确的源码校验和独立工具背书。如果你需要长期归档的文档、或面向所有用户的无障碍 PDF,这套免费、开源、无订阅的完整方案值得尝试。
📚 延伸阅读:engine/README.md、engine/docs/architecture/ADR-001-pdf-engine-boundary.md
【免费下载链接】KillerPDFFree and open-source PDF editor for Windows with a built-in PDF 2.0 engine. View, annotate, OCR, merge, split, crop, rotate, compare, edit text, draw, sign, fill forms, print, flatten, and open password-protected PDFs without a subscription.项目地址: https://gitcode.com/gh_mirrors/ki/KillerPDF
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考