PDF 合并、拆分与整理:完整页面管理指南
· 12分钟阅读
管理 PDF 页面是您会遇到的最常见文档任务之一。无论您是合并会计发票、将大型报告拆分为章节,还是提取特定页面与同事共享,了解如何高效操作 PDF 结构可以节省数小时的手动工作。
本综合指南涵盖从基本合并和拆分到高级批处理操作、CLI 自动化和 Python 脚本的所有内容。我们将探讨这些操作中保留的内容、比较流行工具,并演练您实际会遇到的真实场景。
目录
合并 PDF:组合多个文档
合并通过按顺序附加页面将多个 PDF 文件组合成单个文档。这对于从单独的部分创建完整报告、组合扫描文档或汇总账单期间的发票至关重要。
该过程看似简单,但不同工具处理 PDF 功能的方式不同。了解保留什么以及丢失什么对于专业文档工作流程至关重要。
合并期间保留的内容
| 功能 | qpdf | pdftk | pikepdf | 在线工具 |
|---|---|---|---|---|
| 页面内容 | ✅ | ✅ | ✅ | ✅ |
| 书签 | ✅ | ✅ | ✅ | 有时 |
| 内部链接 | ✅ | 部分 | ✅ | 很少 |
| 表单字段 | ✅ | ✅ | ✅ | 有时 |
| 注释 | ✅ | ✅ | ✅ | 有时 |
| 数字签名 | ❌ (失效) | ❌ | ❌ | ❌ |
| 嵌入字体 | ✅ | ✅ | ✅ | ✅ |
| 图层 (OCG) | ✅ | 部分 | ✅ | 很少 |
重要提示:合并时数字签名始终会失效,因为文档内容发生了变化。这是设计使然——它证明文档在签名后被修改过。如果您需要在保持签名有效性的同时组合已签名文档,请考虑使用 PDF 文件夹。
基本合并命令
# qpdf: 合并三个文件
qpdf --empty --pages file1.pdf file2.pdf file3.pdf -- merged.pdf
# pdftk: 合并多个文件
pdftk file1.pdf file2.pdf file3.pdf cat output merged.pdf
# pdftk: 使用通配符合并
pdftk *.pdf cat output combined.pdf
使用我们的 PDF 合并工具直接在浏览器中组合文件,无需安装软件。它会自动保留书签、链接和表单字段。
高级合并技术
有时您需要比简单连接更多的控制。以下是选择性合并的技术:
# 从多个文件合并特定页面范围
qpdf --empty --pages file1.pdf 1-10 file2.pdf 5-15 file3.pdf -- selective.pdf
# 合并并旋转页面
pdftk A=file1.pdf B=file2.pdf cat A1-10 B1-5east output merged.pdf
# 合并并在文档之间添加空白页
qpdf --empty --pages file1.pdf blank.pdf file2.pdf -- spaced.pdf
专业提示:合并扫描文档时,请确保所有文件在合并前具有相同的方向和 DPI。不匹配的设置会创建不一致的页面大小,看起来不专业。
拆分 PDF:分解文档
拆分将 PDF 分成多个较小的文件。这对于共享特定部分、减小电子邮件文件大小或从编译文档中分离章节至关重要。
不同的拆分策略服务于不同的目的。选择与您的工作流程需求匹配的方法。
常见拆分方法
| 方法 | 描述 | 示例用例 | 命令模式 |
|---|---|---|---|
| 按页面范围 | 提取特定页面序列 | 第1-10页 → file1.pdf,第11-20页 → file2.pdf | qpdf input.pdf --pages . 1-10 -- output.pdf |
| 每 N 页 | 拆分为等大小的块 | 100页文档 → 10个每个10页的文件 | 需要脚本 |
| 按文件大小 | 大小超过限制时拆分 | 在5 MB处拆分以用于电子邮件附件 | 需要自定义逻辑 |
| 按书签 | 在章节边界处拆分 | 每章成为单独的文件 | pdftk input.pdf dump_data + 脚本 |
| 单页 | 每页作为单独的文件 | 100页 → 100个单独的文件 | pdftk input.pdf burst |
拆分命令
# pdftk: 拆分为单独的页面
pdftk input.pdf burst output page_%04d.pdf
# qpdf: 按页面范围拆分
qpdf input.pdf --pages . 1-50 -- part1.pdf
qpdf input.pdf --pages . 51-100 -- part2.pdf
# pdftk: 在特定页面拆分
pdftk input.pdf cat 1-25 output chapter1.pdf
pdftk input.pdf cat 26-50 output chapter2.pdf
试用我们的 PDF 拆分工具进行可视化页面选择和实时预览。您可以拖动选择范围并准确查看要提取的内容。
按书签拆分
对于具有适当书签结构的文档,按书签拆分可保留逻辑文档划分:
# 提取书签信息
pdftk input.pdf dump_data output metadata.txt
# 解析书签并相应拆分(需要脚本)
# 级别1的每个书签成为新文件
快速提示:拆分用于电子邮件时,目标文件小于10 MB。大多数电子邮件服务器接受最多25 MB,但较小的文件发送更快,更有可能通过企业防火墙。
提取特定页面
提取从 PDF 中提取特定页面而不修改原始文件。这是最常见的 PDF 操作——提取单页共享、从教科书中提取章节或从批次中隔离特定发票。
与拆分不同,提取侧重于精确性:获取您需要的确切页面,同时保持源完整。
基本提取
# qpdf: 提取第5页、第10-15页和第20页
qpdf input.pdf --pages . 5,10-15,20 -- extracted.pdf
# pdftk: 提取第1-3页和第7页
pdftk input.pdf cat 1-3 7 output extracted.pdf
# qpdf: 提取最后5页
qpdf input.pdf --pages . z-4-z -- last5.pdf
使用我们的 PDF 页面提取器获得带缩略图预览的可视化界面。您可以单击单个页面或按住 Shift 键单击以选择范围。
高级提取模式
复杂的提取场景需要了解页面引用语法:
1-10— 第1页到第10页1,3,5— 仅第1、3和5页z— 最后一页(qpdf 语法)z-5-z— 最后6页r1-r10— 前10页反向(pdftk)even或odd— 所有偶数或奇数页(pdftk)
# 提取所有奇数页(用于双面扫描)
pdftk input.pdf cat odd output odd_pages.pdf
# 提取每第三页
qpdf input.pdf --pages . 1,4,7,10,13,16,19 -- every_third.pdf
# 以相反顺序提取页面
pdftk input.pdf cat end-1 output reversed.pdf
专业提示:从大型 PDF 中提取页面时,原始文件大小不会按比例减少。100 MB 的 PDF 可能产生10页20 MB 的提取,因为字体和图像是完整嵌入的。之后使用 PDF 压缩来优化文件大小。
重新排序和旋转页面
重新排序在不添加或删除内容的情况下更改页面顺序。旋转修复扫描或手机照片的方向问题。这两种操作都是非破坏性的,并保留所有 PDF 功能。
重新排序页面
# qpdf: 反转整个文档
qpdf input.pdf --pages . z-1 -- reversed.pdf
# pdftk: 自定义顺序(第3页,然后第1页,然后第2页)
pdftk input.pdf cat 3 1 2 output reordered.pdf
# pdftk: 将最后一页移到前面
pdftk input.pdf cat end 1-r2 output reordered.pdf
# qpdf: 交错两个文档(用于双面扫描的奇数/偶数)
qpdf --empty --pages odd.pdf even.pdf -- collated.pdf
旋转页面
旋转以90度增量指定。不同工具使用不同的语法:
# pdftk: 将第1页顺时针旋转90度
pdftk input.pdf cat 1east 2-end output rotated.pdf
# pdftk: 将所有页面旋转180度
pdftk input.pdf cat 1-endsouth output flipped.pdf
# qpdf: 将第1-10页顺时针旋转90度
qpdf input.pdf --rotate=+90:1-10 -- rotated.pdf
# qpdf: 奇数页旋转一个方向,偶数页旋转另一个方向
qpdf input.pdf --rotate=+90:odd --rotate=-90:even -- rotated.pdf
旋转方向:
- pdftk:
north(0°)、east(90° 顺时针)、south(180°)、west(270° 顺时针) - qpdf:
+90(顺时针)、-90(逆时针)、+180或-180
快速提示:旋转元数据不会更改实际页面内容——它只是告诉 PDF 阅读器如何显示它。一些较旧的 PDF 查看器会忽略旋转标志,因此如果您需要保证方向,请使用重新渲染页面内容的工具。
命令行工具比较
选择正确的 CLI 工具取决于您的操作系统、功能要求和性能需求。以下是最流行选项的详细比较。
工具功能矩阵
| 工具 | 许可证 | 速度 | 功能 | 最适合 |
|---|---|---|---|---|
| qpdf | Apache 2.0 | 非常快 | 全面,保留结构 | 专业工作流程、自动化 |
| pdftk | GPL | 快 | 简单语法,表单填充 | 快速任务、初学者 |
| pikepdf | MPL 2.0 | 快 | Python 库,可编程 | 自定义自动化、集成 |
| PyPDF2 | BSD | 中等 | 纯 Python,无依赖 | 简单的 Python 脚本 |
| Ghostscript | AGPL | 慢 | 渲染、转换、压缩 | 格式转换、优化 |
安装
# macOS
brew install qpdf pdftk-java
# Ubuntu/Debian
apt install qpdf pdftk
# Python 工具
pip install pikepdf PyPDF2
# Windows(通过 Chocolatey)
choco install qpdf pdftk
性能比较
在500页、50 MB PDF 上进行基准测试(合并操作):
- qpdf: 1.2秒
- pdftk: 1.8秒
- pikepdf: 1.5秒
- PyPDF2: 4.3秒
- Ghostscript: 12.7秒
对于处理数百个文件的批处理操作,qpdf 的速度优势会显著累积。
专业提示:如果您在 macOS 上且 pdftk 无法工作,您可能需要 pdftk-java。原始 pdftk 是为较旧的 macOS 版本编译的,无法在 Apple Silicon 上运行。使用 brew install pdftk-java,命令变为 pdftk-java。
Python 自动化示例
Python 通过 pikepdf 和 PyPDF2 等库提供强大的 PDF 操作。这些示例展示了您可以为工作流程调整的常见自动化模式。
使用 pikepdf 合并
import pikepdf
from pathlib import Path
def merge_pdfs(input_files, output_file):
"""合并多个 PDF 并保留所有功能。"""
pdf = pikepdf.Pdf.new()
for file in input_files:
src = pikepdf.Pdf.open(file)
pdf.pages.extend(src.pages)
pdf.save(output_file)
# 用法
files = ['report1.pdf', 'report2.pdf', 'report3.pdf']
merge_pdfs(files, 'combined_report.pdf')
按页数拆分
import pikepdf
from pathlib import Pat