PDF 合并不上传:浏览器里到底做了什么,哪些内容会丢

更新于 6 分钟阅读

合同、报税材料、身份证扫描件,正是人们最常想合并成一个 PDF 的文件,而不少免费的在线合并网站是在服务器上处理的:你上传文件,等一会儿,再下载结果,中间文件在对方那里放多久,取决于对方的留存政策。合并其实不需要这样。PDF 是有结构的文件,浏览器标签页里运行的程序完全可以把一份文档的页面复制到另一份里。

怎么判断一个网站有没有上传你的文件

不要只看网页上怎么写,让浏览器自己告诉你。按 F12 打开开发者工具,切到「网络(Network)」标签页,清空列表,然后添加一个文件。在本地处理的工具里,看不到任何携带你文件的请求;会上传的工具则会出现一个 POST 或 PUT 请求,载荷大小和你的 PDF 差不多。

有两点容易看错。第一,本地工具也会发请求,比如下载它自己的代码。本站的 PDF 合并工具在你第一次添加文件时才会载入 PDF 库(压缩后约 200 KB),载入完成时页面会显示「PDF 引擎已就绪」,这个请求里没有任何文档内容。第二,你还可以更进一步:看到这条提示之后,直接断开网络。离线状态下还能正常工作的工具,不可能把你的页面发到任何地方。

合并工具对文件做了什么

文件在标签页里读取,用 pdf-lib 这个 JavaScript PDF 库解析。合并的过程,就是把每个源文档的页面对象按你设定的顺序复制进一个新文档,再保存。提供下载之前,工具会把结果重新打开一遍,核对页数是否和预期相同;两者不一致时,它不会提供这个文件。

顺序规则很简单:先按列表里文件的顺序,每个文件内部再按页面自己的顺序。文件可以用「上移」「下移」按钮或拖动来调整,文件内部的页面也能调整。页面不能在文件之间移动,想把两份文档交叉着排,只能先合并一次,再处理结果。

每一页显示为一个带编号的小方块。点一下就把这一页排除出合并结果,编号会被划掉。页数多的文件先显示前 48 个,需要时再一次展开 48 个。

按页码选页

范围框接受 1-4, 7 这样的写法。这里的页码指的是合并后的顺序,不是页面原来的页码,被排除的页也不占编号。比如两个文件各 10 页,你排除了第一个文件的第 3 页,合并结果就是 19 页,此时「11」指的是第二个文件的第 2 页。像 5-2 这样倒过来的区间会按 2-5 处理。超出范围或不是数字的内容会被报告出来,而不是悄悄截断,所以输错了你能看得到。

同一份选择也供「提取所选页面」使用,它只输出选中的页面。要从一份长报告里抽出第 4 到 6 页,这是最快的办法。

一个典型的操作过程

假设要把一份申请表、一份扫描件和一份说明合成一个文件,并且去掉说明里的封面。

  1. 点「添加 PDF 文件」,或者把三个文件拖进虚线框。第一次添加时会先载入 PDF 引擎,每个文件的那一行会显示大小和页数。
  2. 用「上移」「下移」或拖动手柄调整文件顺序。顺序就是最终合并的顺序。
  3. 在说明文件那一行,点封面那一页的编号,它会被划掉,表示这一页不参与合并。
  4. 看状态栏:它会写明有几个文件、共多少页参与合并。数字对得上,就点「合并为一个 PDF」。
  5. 下载开始后,状态栏会给出页数以及前后的文件大小。再用阅读器打开结果翻一遍。

只想取其中几页时,流程差不多:在范围框里输入 3-5, 9 并点「选中」,被选中的页面会高亮,再点「提取所选页面」,输出里只有这些页。需要先把几页排除、再提取时,页码要按排除之后的顺序重新数,这也是为什么范围框旁边专门写了说明。

哪些东西不会保留

pdf-lib 复制的是页面对象,并不会把它们画出来。由此带来的限制要如实说明:

项目结果
缩略图没有。因为这里不渲染内容,所以只显示编号方块
带密码的 PDF被拒绝,在该文件那一行显示错误
文档标题、作者、主题、关键词不保留
书签、页码标签(如罗马数字)不保留
表单域、批注、内嵌 JavaScript复制页面后可能失效
数字签名可能失效;输出只适合阅读,不是认证副本

元数据和书签是最容易事后才发现的:一份带可点击目录的 200 页报告,合并后变成 200 张没有目录的普通页面。合并后的文件还会有新的创建时间,生成器记为 pdf-lib。如果目录要紧,请在合并之后用 PDF 编辑器重新建一份。

带签名的 PDF 是特殊情况。签名覆盖的是原文件的确切字节,把页面复制进新文件,签名就无法继续有效。如果一份包里必须有已签名的文档,请把原件和合并后的文件一起附上。

加密文件

PDF 有不同的加密保护方式,这个工具走的是最简单的路线:只要文件是加密的就拒绝,因为 pdf-lib 不肯打开它。该文件那一行会显示提示,其余文件照常处理。请用当初设置密码的软件去掉密码;如果文档的权限允许,也可以把它打开后打印成一个新的 PDF,再把新文件加进来。

大文件与内存

所有内容都保存在这个标签页的内存里。pdf-lib 会保留每个解析过的文档,以及它复制出来的每一页。工具接受任意大小的文件,但总量超过 60 MB 或页数超过 2000 页时,它会先停下,要求你再点一次按钮。再点一次就是决定承担这个风险:内存耗尽的标签页可能崩溃,里面的工作就丢了。遇到这种情况,请分批合并,比如先把 10 个文件合成 1 个,再把 4 个结果合成一个。

流程开头还有几道较小的检查:只读取类型为 application/pdf 或文件名以 .pdf 结尾的文件;空文件会被拒绝;没有可读页面的文件会在自己那一行说明原因。某个文件失败,不会挡住其他文件。

检查能证明什么,不能证明什么

工具会报告结果的页数,以及前后的文件大小。这能说明文件能打开、页数和预期一致,却不能说明第 7 页显示的是你以为的内容,因为工具里不渲染任何页面。凡是重要的合并,请在 PDF 阅读器里把输出文件完整翻一遍,尤其要看方向或尺寸不同的扫描页相接的地方。

完成后的 PDF 是在你的标签页里生成的 Blob,下载也从这里发起,「再次下载」复用的就是它。点「全部清除」会把文件和结果都从内存里释放。

为什么这类需求要关心「不上传」

文件一旦上传,它就同时存在于你的设备和别人的服务器上,你无法验证对方什么时候删除、有没有备份、谁能访问。对于不涉密的传单或者公开资料,这没什么要紧。对于合同、病历、财务和证件,最稳妥的做法就是让文件根本不离开自己的设备。浏览器本地处理做到的正是这一点,而且你可以用上面的网络面板或者离线测试自己验证,不必相信谁的承诺。

本地处理也有它的代价:能处理的体量受限于一个标签页的内存,也没有服务器端工具那样的渲染、压缩或 OCR 功能。需要这些功能时,就得权衡是否值得把文件交给第三方。

打开工具: PDF 合并与页面提取

返回指南列表

更多指南