# PDF 合并 — 还能拆分和重排页面

挪动页面，不用往服务器跑一趟。

> 把多个 PDF 合到一起，把一个拆成好几个，把页面拖成你要的顺序，全都在你自己的浏览器里完成。什么都不上传，不用注册，成品文件在交给你之前还会被重新打开、重新数一遍页数。

这是一个浏览器交互工具，地址是 https://abox.tools/zh/merge-pdf/。文件在运行该浏览器的设备上处理。主动分享和可选联网功能都在页面上说明。下文是它的文字说明；使用工具请打开该地址。

## 你的文档**在浏览器里处理**，无须上传处理。

你选中的每一份文档，都是由这个地址提供的代码，在这台机器的内存里打开、拆开、再写回去的。这里没有任何东西能发起上传，页面的另一端也没有服务器来接。

- ✗ 不上传
- ✗ 不注册
- ✓ 断网可用
- ✓ 开源
- ✓ 文件不出这台机器

## PDF 合并、拆分或重排的步骤

1. **选好你的 PDF。** 拖到选择框里，或者自己找出来，之后还能再加：每个文件的页面都会接在当前顺序的末尾，正因如此，两个文件夹可以分两次合。浏览器直接从你的磁盘上读。
2. **把页面排成你要的顺序。** 抓住把手拖动一页，或者用箭头一格格挪。把扫歪了的那页转正，把某页删掉，或者在框里敲 `1-3, 8, 12-`，一次性保留、删除或旋转一整串。编号会随着你的操作重新编排，所以你看到的永远就是成品的样子。
3. **说清楚出来的是一份文档还是好几份。** 一份是常见答案。其余都是切法：每隔多少页切一次、在你指定的页码处切、一页一个文件，或者切回它们原本所属的文件。多于一份的时候会打包成一个 ZIP 交给你，这样只保存一次，而不是五十次。
4. **生成它，然后读那行“已核对”的说明。** 文档写完之后，页面上同一个读取器会把每一份重新打开，数一遍页数。要是数出来和你要的对不上，这次操作会被报为失败，也不会给你下载。

## 说得更细的版本

[怎么合并、拆分和重排 PDF 页面](https://abox.tools/zh/guides/merge-and-split-pdf-files/): 把几个 PDF 合到一起、把一个切成好几个、把页面挪来挪去：重排之后什么留得下、什么是任何工具都带不过去的，以及为什么这些事都不必把你的文件传到别处。

## 工具箱里还有

- [PDF 压缩](https://abox.tools/zh/compress-pdf/): 文档变小，不用送去任何地方。
- [PDF 解锁](https://abox.tools/zh/unlock-pdf/): 权限限制与打开密码不同。页面会说明你的 PDF 使用哪种保护。
- [PDF 加密](https://abox.tools/zh/protect-pdf/): 把文档锁上，而不是为了锁它先把它交给一个网站。
- [PDF 水印](https://abox.tools/zh/watermark-pdf/): 一份写着自己去了哪里的扫描件，就没法悄悄再去别的地方。

## 常见问题

### 我的 PDF 会被传到哪里去吗？

不会。它们由你自己的浏览器在你自己的硬件上读取、复制和写出。这个工具没有服务端，页面的 `Content-Security-Policy` 里写着它允许联系的每一个地址，没有一个属于本站。这个工具连可选的网络功能都完全没有。

### 能合并多少个文件，文件能有多大？

工具里没写任何上限。上限是你自己的机器：文档在处理期间是放在内存里的，所以一台笔记本合个几百兆不会有意见，再往上就开始吃力。这里不收费、不限速、不加水印、不排队，因为另一端根本没人来做这些事。

### 合并或拆分会掉画质吗？

不会。页面上的任何东西都不会被重新编码、重新渲染或重新压缩。每一页的内容流，以及它引用的每种字体、每张图片、每个矢量图形，都是逐字节复制过去的，所以文字照样能选能搜，照片还是那张照片。变的只有页面的顺序，以及它们外面那层结构。

### 书签和链接会怎样？

两者都是重新搭好，而不是直接丢掉。目标页还在结果里的书签，会指向那一页新的位置；目标页被你删掉的书签会消失，除非它下面还有活着的条目，那它就作为一个标题留下来。合并多个文件时，每个文件的书签会归到一个以它命名的标题下面。页面之间的链接用同样的办法跟过去，包括 Word 和 LaTeX 写的具名目标；目标没有跟过来的链接会被留成什么都不做，而不是把读者送到错的地方。指向网址的链接原样保留。

### 有什么是不会带过去的？

四样，而且工具会在结果里说明，而不是写在小字里。屏幕阅读器用的带标签阅读顺序树、页面标签（“iii、iv、1、2”那套编号）、内嵌的附件，以及任何既不是“跳到某一页”也不是“打开某个网址”的动作，包括文档里的 JavaScript。前两样描述的是页面一挪就不复存在的顺序；最后一样，你并没有要求把它带进新文件。要是文档的无障碍标签对你重要，那就把原件也留着。

### 填好的表单还在吗？

在。表单字段和里面填的内容会跟着页面一起过来，新文档也会被登记成表单，阅读器就会按表单来对待它。合并时有一点要知道：在任何阅读器看来，同名的两个字段就是同一个字段，所以如果你把同一张表单的两份合在一起，在其中一页填一个框，另一页那个也会跟着填上。工具会发现这种情况并说明。

### 能打开带密码的 PDF 吗？

不能，而且是故意的。加密的文档会被拒收，并附上说明，哪怕密码是空的也一样，而不少扫描仪和复印机正是那样保存的。给文件解除保护，和挪动它的页面是两码事，一个悄悄这么干的工具，就是在做你没要求它做的事。

### 为什么没有页面缩略预览？

因为要把一页画出来，就得有一个完整的 PDF 渲染器：字体、渐变、透明组、混合模式，那是一兆开外的引擎，为了几张缩略图要下载并跑起来。方块上显示的，是重排真正会用到的东西：页码、纸张的形状和尺寸、写出时会带的旋转，以及它出自哪个文件。一叠竖版页面里混进一张横版扫描，照样一眼就看得出来。

### 做好的文件到哪儿都能打开吗？

能。输出写成 PDF 1.5，或者写成你给的这些文件里所需的最高版本，而 1.5 自 2003 年以来出厂的每一个阅读器都懂。工具还会在你自己的机器上把这一点做实：它会把每个成品文件重新打开，沿着页面树数一遍页数，然后才把它给你。

### 它免费吗，需要注册吗？

免费，没有账号，不用登录，没有试用期，除了你自己机器的内存之外也没有文件大小限制。本站带广告，经费就是从那儿来的，广告拿不到任何关于你文档的信息。

### 断网能用吗？

能。页面加载一次之后断开网络，它照样干活。这也是证明“什么都没上传”最省事的办法，真要把你的文档送出去合并，拔线那一刻就停了。

## 这条隐私承诺怎么核实

- **处理在这个浏览器里完成。** 本工具在浏览器里处理输入和结果，处理代码不把它们上传去处理。Content-Security-Policy 限制可用资源和连接目的地，但已允许的主机仍可接收请求。策略不检查载荷，不能单独证明什么都没有发出。请把具体操作的请求与源码核对，或断网完成该本地操作。
- **合并恰恰是最不该上传的那类活。** 人们要拼在一起的文档，往往正是从别处来的那些：合同和它的签字页、护照扫描件和银行流水、诊断书和理赔表。一个在线合并服务因此拿到了全部，放在一处，还已经排好了序。这个工具只有你浏览器里的一个页面，没有另外那一半。
- **整个格式都在这个仓库里。** 一份 PDF 就是一串对象，加上一张记录每个对象从哪儿开始的表。`src/objects.js` 读这套语法，`src/reader.js` 顺着那张表走，`src/assemble.js` 在文档之间复制页面，`src/writer.js` 写出结果。这四个里没有一个引入了能发出请求的东西。不会去取任何库，也没有什么是在服务器上渲染的。
- **加密的文件会被挡下，而不是被打开。** 带密码的 PDF 一律拒收，包括扫描仪用空密码生成、技术上其实打得开的那种。给文档解除保护，和挪动它的页面是两码事，一声不吭地替你做了，对一个工具来说太越界了。
- **成品文件不会说自己是在哪儿做的。** 没有生成器一行，没有创建日期，没有工具名字。它也不带走排版软件留下的 XMP 数据包和私有块，那些属于此前存在过的那份文档，而不属于你刚做出来的这一份。页面里的内容会被原样复制：这个工具挪的是页，不改页面上写着什么。
- **不是“跳到某一页”的动作不会被复制。** PDF 里可以放打开时就执行的指令：播放这个、把这张表单提交到那个地址、运行这段 JavaScript。经过这个工具的页面，会保留通向其他页面和网址的链接，其余的都丢掉。你要重排别人的页面，不构成把人家文档的脚本一起带进你新文件的理由。
- **Google 加载了什么，又拿不到什么。** 广告脚本和统计脚本来自 Google。关于你文档的信息，一条也没有交给它们，文件、某一页、名字、大小、页数都没有。读取、复制、写出 PDF 的每一行代码都由这个源提供，也都摆在仓库里。
- **捐助按钮加载了什么，又拿不到什么。** 页首那个“Buy me a coffee”按钮由 cdnjs.buymeacoffee.com 的脚本画出来，字体取自 Google Fonts。它不过是个链接，不上报访问，也拿不到关于你或你文档的任何东西。不点它就什么都不会发生，点下去到的是别人的站。
- **断网也照样能用。** 断开网络，这个页面上的一切照常工作。这是最省事的一条证明，真要把你的文档送出去合并，那时候就停了。

**你可以自己核对。**上面这些不用你信。这个页面是仓库里的模板和配置生成出来的，构建脚本你能读，也能自己跑一遍，跑出来的结果就提交在 `dist` 分支上。拿实际发给你的内容，跟你自己从源码构建出来的结果对一遍就知道了： https://github.com/A-Box-of-Tools/website

最值得先读的几个文件：`config/site.toml` 里是 Content-Security-Policy，以及负责全部复制工作的 `src/assemble.js`：一页是怎么从一份文档里抽出来、放进另一份的，又有什么是有意留下不带走的。它够不着网络，旁边的读取器和写入器同样够不着。
