简体中文

文档 · PDF 工具包

在浏览器中合并 PDF 时会发生什么

· 工作原理

pdf 文件格式 浏览器处理

两个 PDF 页面树馈入新的 PDF 文档
原始 ToolAcre 矢量图

合并 PDF 看起来像装订,但该工具实际上是将页面对象、字体和图像从一个对象图中复制到另一个对象图中,并编写一个新的交叉引用表。这篇文章将介绍在浏览器选项卡中发生的整个过程。

事实并非如此——为什么两个 PDF 不能简单地连接为字节以及合并工具必须重建什么

两个 PDF 都有自己的标题、对象编号、页面树和交叉引用信息。在第一个文件之后附加第二个文件的字节不会将其页面添加到第一个文档的页面树中。合并必须编写一个新的 PDF 并引用指向其自己的对象。

将每个文件读入内存 - 浏览器如何通过文件 API 将 PDF 作为字节数组加载,而无需任何上传

文件选择器向浏览器提供 File 对象,而不是服务器 URL。 PDF 接口使用 file.arrayBuffer() 读取每个选定的文件,并将 Uint8Array 字节传递给处理操作。合并不会上传文件。这与声称访问网站从不发出网络请求不同:加载网站本身需要连接。

解析对象图——解析器必须重建的标头、编号对象、页面树和交叉引用表

PDF 库加载每个源文档并解析其页面索引。页面指​​的是文件中其他位置的对象,包括字体、图像和图形状态。交叉引用部分或流可以帮助读者定位间接对象;它不是一个可以粘合在一起的页面列表。损坏或加密的输入可能会阻止解析。

复制页面及其资源——为什么每个字体、图像和图形都声明页面引用必须随之移动

该实现按顺序为每个输入调用 PDFDocument.create(),然后调用 out.copyPages(source, source.getPageIndices()),并将每个复制的页面添加到输出。库传递每个页面所需的引用结构;它不制作位图屏幕截图。不要假设每个文档级功能都会随页面移动。

编写合并文件 - 重新编号对象,构建新的页面树和交叉引用表,然后给您下载

添加页面后,库会保存一个新的 PDF 字节数组。它的编写器处理对象引用和序列化,而不是连接原始文件。该应用程序提供结果下载。由于这是一个新文档,因此字节大小不需要等于输入的总和。

工作示例 - 合并三页求职信和十二页扫描协议,以及结果的页面顺序和大小告诉您什么

假设办公室管理员首先选择三页的求职信,然后选择十二页的协议。结果应有 15 页:封面 1-3 页,然后是协议页 4-15。发送文件前检查第一页和最后一页以及总数。扫描的协议可能会导致输出较大,因为其页面包含图像资源。

这不包括书签、表单字段和文档元数据,其处理取决于工具自身的规则并记录在其页面上

页面复制不保证书签、表单字段、元数据或签名的保存。特别是,永远不要假设加密签名在结构重写后仍然有效。保留原件并单独核实任何法律签名要求;新文件不是经过签名的原始文件。

要点 — 合并是结构重写,而不是串联,并且 PDF 工具包在选项卡中执行重写,文件永远不会离开您的设备

PDF 合并是结构重写。 PDF 工具包读取选项卡中选定的字节,按选定文件顺序复制页面并写入新文件。要在会话期间检查本地处理边界,请在合并时检查浏览器网络面板;将网站资产负载与文档的任何上传区分开来。