PDF 合并是日常最高频的操作——但合完发现书签丢了、目录指错页、页码乱了,是绝大多数免费工具的通病。理解 PDF 内部”页面流 + outline + 链接”三层结构,能预判合并工具会丢掉什么。
PDF 的三个独立层
合并的对象不是”一沓纸”,是三层数据:
| 层 | 内容 | 合并行为 |
|---|---|---|
| 页面流(Pages) | 每页的实际显示内容 | 串接,必保留 |
| 大纲(Outline) | 左侧书签树 | 工具决定保留与否 |
| 链接 / 目标(Annot / Dest) | 页内跳转、外链、目录链接 | 工具决定是否重新映射 |
简单的合并器只动第一层;完整的合并器三层都更新。
书签会怎么变
PDF 内置的”书签 / Outline”是树形结构,每个节点指向某一页:
《年报》
├── 第一章 经营回顾 (page 5)
│ ├── 1.1 主营业务 (page 7)
│ └── 1.2 投资情况 (page 12)
└── 第二章 财务报告 (page 25)
合并后,理想合并器会把这棵树作为子节点挂到新 PDF 的根 outline 下:
合并后的 PDF
├── 年报.pdf
│ ├── 第一章 经营回顾 (page 5)
│ └── 第二章 财务报告 (page 25)
└── 审计报告.pdf
└── ...
页号自动重新映射的规则:第一份文件的书签页号不变(它在合并后的最前面),第二份及之后文件的书签页号统一加上”前置文件总页数”的偏移——比如第二份文件原来指向第 5 页,第一份文件 30 页,合并后该书签指向总第 35 页。
简单合并器直接丢掉 /Outlines 字典,合并后左侧空空如也。判断方式:合并后用任意 PDF 阅读器打开,左侧”书签”面板有内容就是好工具,没有就是简单拼接。
目录页和书签的区别
很多人以为”目录”就是”书签”——不是。
- 目录页:作者写在第一页的可见文字,比如”第一章 … P5”。本质是普通文本 + 一个跳转链接(PDF Annot 的
/Link类型) - 书签 / 大纲:左侧导航面板,由 PDF 元数据
/Outlines字段定义
合并后书签保留得好(如果工具好),但目录页的跳转链接是绝对页号,合并后会全错——原本指向”第 5 页”的链接,合并后还是跳到 PDF 总第 5 页,但目标内容不在那里了。
修法只有两条:
- 合并前删掉每份 PDF 的目录页,只保留正文。读者通过左侧书签导航
- 合并后用 Acrobat 重新创建目录链接——耗时操作
页码的”两套”问题
PDF 有两套页码,互相独立:
| 名称 | 决定方 | 是否重排 |
|---|---|---|
| 物理页号 | PDF 数据顺序,永远 1, 2, 3… | 合并后自动重排 |
| 显示页脚 | 作者排版时印在每页底部的数字 | 不变,仍是原文档的 1, 2, 3… |
合并后会看到:
[PDF 阅读器顶部] 第 50 / 150 页 ← 物理页号
[页面底部页脚] - 5 - ← 显示页脚(来自第二份文档)
要让显示页脚连续,必须重新排版——LaTeX 重新编译、Acrobat 加新页脚 / 删旧页脚。普通合并工具做不到。
工程上的妥协:
- 学术 / 报告类:每份子文档保留各自页脚,整体加一个 PDF 页号水印(“P1 / P150”)盖在所有页右上角
- 合同 / 法律类:用罗马数字页脚(i, ii, iii)作”附件页码”,与主文档阿拉伯数字区分
文件名排序的坑
按文件名排序时,字典序不等于数字序:
错误:1.pdf, 10.pdf, 11.pdf, 2.pdf, ...
正确:01.pdf, 02.pdf, ..., 09.pdf, 10.pdf, 11.pdf
文件多于 100 时用 001.pdf。批量重命名脚本:
# bash
i=1
for f in *.pdf; do
printf -v new "%03d.pdf" "$i"
mv "$f" "$new"
((i++))
done
或者用支持自然排序的工具——大多数 GUI 合并器(包括本工具)使用拖拽顺序,肉眼可控更稳。
元数据合并
PDF 顶层元数据(标题、作者、关键词、创建时间)合并时只能取一份。合并器通常:
- 默认取第一份输入的元数据
- 创建时间设为合并的当前时间
- 修改时间清零
合并后建议手动改一下:在 Acrobat / qpdf 里设新的 Title,否则书签栏标题混乱。
加密 PDF 能合并吗
不能直接合。加密 PDF 必须先解密 / 解锁才能读到内部对象:
qpdf --decrypt --password=PWD encrypted.pdf decrypted.pdf
合并后输出可以选择不加密或重新加密。本工具不支持合并加密 PDF,需要先用 PDF 解密工具处理后再合并。
命令行替代
GUI 工具不顺手时直接 qpdf:
# 合并 a.pdf b.pdf c.pdf,保留 outline
qpdf --empty --pages a.pdf b.pdf c.pdf -- merged.pdf
# 合并并重新 linearize 优化体积
qpdf --empty --pages a.pdf b.pdf -- --linearize merged.pdf
但 qpdf --empty --pages 不会保留 outline 字典——要保 outline 用 pdftk:
pdftk a.pdf b.pdf cat output merged.pdf
原版 pdftk(C++ + libgcj)已经多年不更新,但社区维护的 pdftk-java 仍活跃,Debian / Ubuntu 包仓库可用。命令行最稳的选择是 pdfunite(poppler-utils):
pdfunite a.pdf b.pdf c.pdf merged.pdf
pdfunite 保留 outline 和大部分链接,是命令行最稳的选择。
一句话总结
合并工具好不好看三件事:书签保不保、目录链接修不修、页码重不重排——前两件多数工具做不到,第三件几乎没工具能做。