Tips & Tricks

如何将 PDF 与不同 PDF 创建库生成的冲突内部交叉引用表合并

How to Merge PDFs With Conflicting Internal Cross-Reference Tables Generated by Different PDF Creation Libraries

PDF 交叉引用表的作用以及它为何因图书馆而异

每个 PDF 文件都包含一个交叉引用表,该表将对象编号映射到文件内的字节偏移量。当阅读器打开 PDF 时,它会首先读取此表来定位页面、字体、图像和元数据,而无需按顺序扫描整个文件。 PDF 标准规范定义了两种交叉引用表格式:PDF 1.0 中基于 ASCII 的原始格式和 PDF 1.5 中引入的压缩交叉引用流。这两种格式具有相同的目的,但在二进制级别上结构上彼此不兼容。

格式之间的差异会产生实际后果。

这一步可以防止大多数合并失败。

不同的 PDF 创建库默认采用不同的格式,这是大多数合并时间冲突的根本原因。以最大兼容性为目标的库,例如 LibreOffice 等办公套件和旧版本的 Microsoft Office 使用的库,倾向于使用原始的 ASCII 表格格式,因为它可以被曾经编写的每个 PDF 阅读器解析。注重文件大小效率的库(包括 iText、Adobe SDK 和 Apple Quartz)默认采用压缩交叉引用流,可将文件开销减少 30% 到 50%。当您对使用不同表格格式的文件执行合并 PDF操作时,合并工具必须将这些根本不同的数据结构协调成每个读者都可以正确解析的单个统一表格。

每个库所针对的 PDF 规范版本也至关重要。针对 PDF 1.4 的库无法生成 PDF 1.5 中引入的压缩交叉引用流。如果合并工具收到一个包含 ASCII 表的 PDF 1.4 文件和一个包含压缩流的 PDF 1.7 文件,则该工具必须升级旧文件的表格式(这会更改其 PDF 版本声明),或者降级新文件的格式(这可能会丢失存储在仅流字段中的信息)。选择不正确可能会生成一个文件,其标头中声明的 PDF 版本与其内部结构不匹配,从而使使用版本检测来决定如何解释该表的解析器感到困惑。一些读者会信任标头版本并尝试对 ASCII 表进行流解析,从而产生解析错误,而其他读者则会检查实际的表格式并正确呈现。

WukongPDF

尝试合并 PDF

无需安装。直接在您的浏览器中工作。

立即开始 →

合并的 PDF 存在交叉引用表问题的迹象

交叉引用损坏会产生一组可识别的症状,经验丰富的 PDF 用户学会快速识别这些症状。最明显的迹象是合并的 PDF 在一个查看器中正确打开,但在另一个查看器中显示错误或空白页。出现这种不一致的原因是不同的观看者对结构错误的容忍程度截然不同。 Adobe Acrobat 是最宽容的,它会尝试即时重建损坏的交叉引用表,通常会成功地渲染文档。基于浏览器的查看器(例如 Chrome 的 PDFium 和 Firefox 的 PDF.js)是更严格的解析器,当遇到 Acrobat 默默纠正的表不一致时,它们根本拒绝渲染文件。

页面级症状是下一个诊断线索。如果特定页面对象的交叉引用条目指向错误的字节偏移量,则查看器无法找到正确的页面内容流,并且呈现空白页面或重复来自不同页面的内容。用户可能还会注意到特定页面上的图像丢失或被空白灰色矩形替换。这些图像失败对应于交叉引用表中的 XObject 条目,当图像流移动到合并文件中的新位置时,这些条目不会重新计算。在特定页面上出现乱码或使用错误字体的文本表示字体描述符条目的字节偏移量不正确,导致查看者替换以不同方式映射字符的默认字体。

一个不太明显但同样重要的标志是文件通过了快速目视检查,但未通过正式的PDF 版本控制 验证或预检检查。印刷店和监管机构对每个提交的文件运行自动 PDF/A 或 PDF/X 验证。交叉引用表错误即使不会在屏幕上导致可见的渲染问题,也会使这些验证失败并导致文件在任何人查看之前被拒绝。对于向法院提交法律文件或向监管机构提交财务报告的组织来说,预检拒绝可能意味着错过法定期限和重新提交处罚,从而带来真正的财务后果。

交叉引用表格式及其合并行为

格式引入结构兼容性合并风险
ASCII 交叉引用表PDF 1.0具有人类可读字节偏移量的纯文本最大限度;每个读者都支持低的;直接重新计算
交叉引用流PDF 1.5具有可变宽度字段的压缩二进制文件适合现代读者; 2010年之前可能会失败中等的;字段宽度需要精确重新计算
混合(两个表)PDF 1.5+流加 ASCII 预告片以实现传统回退好的;现代读者使用流,传统的回退高的;两者必须保持一致

不同的 PDF 库如何处理交叉引用表

库/工具默认表增量保存合并行为
LibreOffice / OpenOffice 导出ASCII 表不;总是写入完整的新表平面 ASCII 表;轻松合并,更大的文件
报告实验室 (Python)ASCII 表结构简单;有利于自动合并
iText / iTextSharp流(PDF 1.5+)是的;支持增量保存需要正确的 API 调用来协调格式
虾(红宝石)仅 ASCII 表简单合并友好;功能有限
微软打印到PDF交叉引用流可以产生与库输出不同的结构
苹果石英 (macOS/iOS)交叉引用流是的可能携带 macOS 特定的元数据

当您知道合并批次中每个文件的源库时,您可以在兼容性问题出现之前预测它们。来自 ReportLab 和 Prawn 的文件均使用 ASCII 表,可以将交叉引用冲突的风险降至最低。将 ReportLab 文件与使用压缩流的 iText 文件组合需要一个合并工具,该工具能够理解这两种格式并可以将它们规范化为单个一致的表示形式。最可靠的合并工具会在开始合并之前检查每个输入文件的交叉引用格式,并选择所有输入都可以转换为的统一输出格式而不会丢失数据。

用于合并具有冲突表格格式的 PDF 的安全工作流程

来自不同来源的 PDF 的系统合并工作流程首先是在合并开始之前检查每个输入文件的交叉引用表格式。随着时间的推移,交叉引用错误会加剧。大多数 PDF 元数据查看器和命令行检查工具都可以报告文件是否使用 ASCII 表、压缩流或混合方法。如果所有输入文件共享相同的表格式,则合并操作的结构风险较低,可以直接进行。如果输入集的格式不同,则需要额外的准备步骤来在合并之前创建统一的基线。

当存在格式冲突时,最安全的预合并步骤是将所有输入文件标准化为通用格式。使用支持显式格式降级的 PDF 优化工具将使用压缩流的文件转换为 ASCII 表。这种规范化会暂时将每个文件的大小增加 20% 到 40%,但会为合并操作创建完全统一的基线。合并成功完成后,如果需要考虑文件大小,请运行合并后优化过程,将统一 ASCII 表转换回最终输出中的压缩流。这种两遍方法(规范化、合并、然后重新优化)增加了处理时间,但消除了交叉引用表损坏的最常见来源。

使用规范化输入执行合并后,至少使用两个不同的 PDF 查看器验证输出,其中一个应该是严格的验证器,如 VeraPDF 或 Adobe Acrobat Pro 中的内置预检检查器。在宽容的桌面查看器和严格的标准验证器中打开且没有错误的文件很有可能在所有阅读器软件、操作系统和嵌入式查看上下文中正常工作。对于任务关键型合并文档,请使用基于浏览器的查看器添加第三次验证,因为浏览器引擎对交叉引用表不一致最敏感。

能够很好地处理交叉引用协调的工具,包括WukongPDF的合并引擎,在合并过程本身期间自动进行表格式检测和规范化。通过理解两种表格式的合并工具的单次传递消除了手动规范化步骤,并生成在第一次尝试时通过验证检查的合并文件,从而节省了多步骤手动协调工作流程的时间和不确定性。

防止重复合并工作流程中的交叉引用冲突

定期合并多个来源的 PDF 的组织可以从整个文档工具链中标准化 PDF 生成设置中获益匪浅。配置组织中的每个 PDF 导出工具以使用相同的交叉引用表格式、相同的目标 PDF 版本和相同的色彩空间处理。这种标准化工作需要配置时间的初始投资,但通过消除与合并文档中的交叉引用冲突相关的故障排除开销,可以得到数倍的回报。当每个输入文件使用相同的表格式时,合并操作变得确定且可靠。

如果您无法控制所有源工具的 PDF 生成设置(这在从外部合作伙伴和客户接收文件时很常见),请在文档处理工作流程中建立强制的合并前规范化步骤。在允许任何合并操作之前,使用批处理工具将每个传入的 PDF 转换为统一格式。此标准化步骤会增加每个文件几秒钟的处理时间,但会避免花费数小时调试下游渲染问题。在标准操作程序中记录准确的标准化设置,以便每个处理 PDF 的团队成员在所有合并批次中一致地应用相同的转换参数。

WukongPDF

尝试合并 PDF

无需安装。直接在您的浏览器中工作。

立即开始 →