PDF 合并不只是拼接:书签、目录、页码会怎么变

· 约 4 分钟 📑 PDF 合并

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 页,但目标内容不在那里了。

修法只有两条:

  1. 合并前删掉每份 PDF 的目录页,只保留正文。读者通过左侧书签导航
  2. 合并后用 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 和大部分链接,是命令行最稳的选择。

一句话总结

合并工具好不好看三件事:书签保不保、目录链接修不修、页码重不重排——前两件多数工具做不到,第三件几乎没工具能做。

❓ 常见问题

PDF 合并后原来的书签为什么不见了?

看合并工具是否保留 outline 树。简单的合并器(特别是早期在线工具)只把页面流拼起来,不复制 /Outlines 字典——书签全丢。完整的合并器会把每份 PDF 的 outline 树作为子树挂到合并后的 PDF 上,原书签都在但变成"嵌套层级"。本工具按后者实现,每份输入文件成为合并后 PDF 的一级目录节点。

合并后目录页指向的页码全错了,能修吗?

目录页(用户写在第一页那个"目录")和 PDF 内置 outline 是两回事。用户写的目录是普通文本 + 页内链接,链接的目标是绝对页号——合并后第二份文档的"第 1 页"变成总第 50 页,原来指向第 1 页的链接还是跳到第 1 页(错了)。修法:合并前把每份文档的目录链接清掉,只保留正文;或合并后用 Acrobat 重新创建目录链接。或者直接走"按章拆分"再合,每章独立目录。

合并的 PDF 页码看起来"两套"是怎么回事?

PDF 里有两个"页码"——物理页号(PDF 里第几页,永远是 1, 2, 3...)和显示页号(页脚印的那个数字,由文档自己排版决定)。合并几份原本各自有自己页脚页码的 PDF,物理页号会重排,但显示页脚还是各自的"1, 2, 3..."——所以合并后会看到第 50 页底下印着"第 5 页"。修这个要重新生成页脚,普通合并工具做不到,需要 Acrobat 或 LaTeX。

PDF 合并有顺序限制吗?文件名能保证排序吗?

取决于工具。按拖拽顺序最可靠,所见即所得。按文件名排序踩坑:1.pdf, 2.pdf, ..., 10.pdf 字典序会变成 1, 10, 2, 3, ...——10 排在 2 前面。规范命名应该用 01.pdf, 02.pdf, ...,三位数文件用 001.pdf。本工具支持拖拽手动排序,避免文件名陷阱。

📑 打开 PDF 合并 多个 PDF · 拖拽排序 · 本地处理