PDF 合并
多 PDF 顺序合并(pdfcpu)
输出设置
合并
使用说明
本地处理:使用 pdf-lib 在浏览器内完成合并,文件永不上传任何服务器
调整顺序:直接拖拽列表项即可重新排序,或用 ↑↓ 按钮微调
大小建议:单文件 < 50MB,总和 < 200MB(受浏览器内存限制)
加密 PDF:合并工具会自动忽略加密标志强制读取;如读取失败请先用 PDF 解密工具去除密码
PDF 属性:可在输出设置中填写标题 / 作者 / 主题,写入合并后 PDF 的元数据
关于本工具
了解工具定位 · 使用场景 · 对比优势
将多个 PDF 按指定顺序合并为一个文件。办公中整理合同、归档扫描件、拼接电子签章页面时,无需逐页拖拽。选择文件后调整顺序,后端处理完成后提供下载。文件仅用于合并,处理完毕即从服务器删除。
使用场景
合同归档合并
行政或法务人员需要将多份 PDF 合同(如采购单、验收单、付款凭证)按顺序合并为一个完整档案。本工具无需安装软件,直接拖入文件、拖动排序后一键合并,生成的文件页码连续、书签保留,方便直接归档或发送给审计方。
论文附录整理
研究生在提交毕业论文时,常需将正文、查重报告、导师签字页、原始数据附录等独立 PDF 按学校要求顺序合并。本工具支持快速调整文件顺序,合并后保持原始排版和超链接,避免因分页错误被退回修改。
标书文件整合
投标负责人需将商务标、技术标、报价单、资质证明等分散的 PDF 合并为一本完整的标书。本工具在浏览器内完成,不经过第三方服务器,确保敏感报价和资质文件不外泄;合并后文件大小稳定,满足招投标平台的上传限制。
电子书章节拼接
阅读爱好者从不同渠道下载了同一本书的多个 PDF 章节文件(如第 1-3 章、第 4-6 章等),希望合并为完整一本。本工具支持一次性拖入所有章节,按文件名或手动排序后合并,生成的书签结构完整,在阅读器上可连续翻页。
扫描件顺序整理
使用扫描仪或手机拍摄了多页文档(如身份证正反面、发票、合同),但每页是一个独立 PDF 文件。本工具允许拖入后自由调整页面顺序,合并为一个文件,省去逐页打印再扫描的繁琐流程,特别适合需要线上提交的材料。
对比矩阵本工具 vs 竞品 vs 传统方法
| 维度 | 本工具 | 竞品 A (Smallpdf) | 传统方法 (Adobe Acrobat Pro / 桌面软件) |
|---|---|---|---|
| 数据隐私 | 纯浏览器处理,文件不上传服务器 | 文件上传至云端处理,受其隐私政策约束 | 文件完全在本地处理,不依赖网络 |
| 处理速度 | 秒级完成,取决于文件大小和浏览器性能 | 受上传带宽和服务器排队影响,通常需数秒至数十秒 | 启动软件、加载文件、导出过程较慢,分钟级 |
| 离线可用 | 完全离线,无需网络 | 必须联网 | 完全离线 |
| 大小限制 | 受浏览器内存限制,通常 500MB 以内 | 免费版通常限制 10-50MB,付费版可更大 | 无严格限制,取决于电脑性能 |
| 收费 | 完全免费,无隐藏费用 | 免费版有使用次数限制,高级功能需订阅 | 需购买正版软件,价格较高 |
| 注册 | 无需注册,即开即用 | 免费版通常需注册或登录 | 需安装软件,通常无需额外注册 |
| 平台依赖 | 跨平台,任何现代浏览器均可 | 跨平台,任何现代浏览器均可 | 需安装特定操作系统版本的软件 |
使用指南
上手步骤 · 输入输出 · 避坑提示
使用步骤
- 点击「选择文件」或拖拽 PDF 到上传区,支持一次选择多个文件
- 在列表中拖动文件调整合并顺序,顶部文件排在最前
- 点击「开始合并」按钮,后端自动调用 pdfcpu 完成顺序拼接
- 合并完成后自动弹出下载,保存为单个 PDF 文件
输入输出示例7 个典型场景,覆盖常规、边界与易错
| 输入 | 输出 | 说明 |
|---|---|---|
| 文件1.pdf, 文件2.pdf, 文件3.pdf | 合并后文件.pdf(包含文件1、文件2、文件3的全部页面,按此顺序) | 典型场景:将多个独立PDF按顺序合并 |
| 封面.pdf, 正文.pdf, 附录.pdf | 完整文档.pdf(封面 → 正文 → 附录) | 典型场景:合并文档的不同组成部分 |
| 单页文件.pdf(仅1页) | 合并后文件.pdf(包含该单页) | 边界case:仅上传一个单页PDF文件 |
| 空白页.pdf(无内容的空PDF) | 合并后文件.pdf(包含空白页) | 边界case:输入文件包含空白页 |
| 加密文件.pdf(需密码打开) | 错误提示:无法处理加密PDF,请先解密 | 易错case:工具不支持加密PDF |
| 图片扫描件.pdf(仅含图片,无文字层) | 合并后文件.pdf(页面内容为图片,不可选中文字) | 边界case:扫描件PDF合并后仍保持原样 |
| 文件A.pdf, 文件A.pdf(同名文件) | 合并后文件.pdf(包含文件A两次的全部页面) | 易错case:重复选择同一文件会重复合并 |
常见错误对照8 个常踩的坑 · 错误 → 修复
1. 上传非 PDF 文件(图片 / Word / 网页)
直接选中 .jpg / .docx / .html 文件并点击合并先用其他工具将图片 / Word / 网页转为 PDF,再上传到本工具合并pdfcpu 只处理 PDF 格式;非 PDF 文件会导致合并失败或输出空白页。Word/图片需先转换,浏览器打印到 PDF 是最简方案。
2. 文件顺序颠倒后手动重排
上传顺序为 A.pdf, B.pdf, C.pdf,但实际想合并为 C, B, A,于是删除全部文件重新上传上传后拖拽文件列表或点击上下箭头调整顺序,无需重新上传多数 PDF 合并工具(包括本工具)支持拖拽排序;重新上传浪费流量和时间,且容易漏传。
3. 合并加密 / 有权限保护的 PDF
上传一个带打开密码或编辑权限的 PDF,直接点击合并先使用 PDF 解锁工具(如 qpdf --decrypt)去除保护,再上传合并pdfcpu 默认无法处理加密 PDF;合并时要么报错,要么输出损坏文件。需先解密再操作。
4. 上传超大文件导致浏览器崩溃
一次上传 10 个 500MB 的 PDF(总计 5GB)单次合并建议总大小不超过 500MB;超大文件可分批合并(先合并前 5 个,再合并后 5 个,最后合并两个中间结果)浏览器内存有限,超大文件会触发 OOM(内存溢出);后端处理也有超时限制。分批合并是稳妥做法。
5. 合并后文件体积异常增大
合并 3 个 2MB 的 PDF,结果输出文件变成 200MB合并前检查各 PDF 是否包含高分辨率图片或嵌入字体;可先用压缩工具(如 Ghostscript -dPDFSETTINGS=/ebook)压缩各文件pdfcpu 合并时不做重压缩,原始 PDF 中的大资源会原样保留。如果原始 PDF 体积差异大,合并后取最大体积。
6. 误以为合并会保留书签 / 目录
合并前各 PDF 有书签(目录),期望合并后书签自动整合合并后书签不会自动合并;需手动用 PDF 编辑工具(如 Adobe Acrobat)重新生成书签pdfcpu 合并时只拼接页面内容,不合并书签结构。书签是独立的元数据,合并后丢失是正常行为。
7. 上传空 PDF 或损坏 PDF
上传一个 0KB 的 PDF 或从网页打印失败的空白 PDF上传前用本地 PDF 阅读器打开确认文件正常;0KB 文件直接删除空 PDF 或损坏 PDF 会导致合并过程卡住或输出错误页。检查文件完整性是基本操作。
8. 合并后页面顺序错乱(未检查排序)
上传文件后直接点击合并,未确认列表顺序是否符合预期点击合并前,仔细核对文件列表的排列顺序(从上到下即为合并后顺序)文件列表默认按上传时间排序,但用户可能期望按文件名排序。手动拖拽调整后再合并可避免返工。
工作原理
公式推导 · 流程图解 · 依据出处
核心公式
O = P1 ⊕ P2 ⊕ ... ⊕ Pn
变量说明
O— 合并后的输出 PDF 文件P1, P2, ..., Pn— 按顺序输入的 n 个 PDF 文件⊕— PDF 页面顺序拼接操作
示例
用户上传 3 个 PDF 文件:P1(3 页)、P2(5 页)、P3(2 页)。工具依次读取每个文件的全部页面,按 P1→P2→P3 顺序拼接,生成一个 10 页的合并 PDF 文件 O。页面顺序为:P1 第 1-3 页、P2 第 4-8 页、P3 第 9-10 页。
适用范围
适用于任意 PDF 文件的顺序合并,不涉及页面旋转、缩放或内容修改。不支持加密 PDF(需先解密)或损坏 PDF。基于 pdfcpu 库实现,兼容 PDF 1.4-2.0 规范。
原理图
开发者集成
3 种主流语言 · 复制即用
import PyPDF2
# 待合并的 PDF 文件列表(按顺序)
pdf_files = ["doc1.pdf", "doc2.pdf", "doc3.pdf"]
# 创建合并器
merger = PyPDF2.PdfMerger()
for pdf in pdf_files:
try:
merger.append(pdf)
except FileNotFoundError:
print(f"错误:文件 {pdf} 未找到")
exit(1)
# 输出合并后的文件
output_file = "merged.pdf"
merger.write(output_file)
merger.close()
print(f"合并成功:{output_file}")package main
import (
"fmt"
"os"
"github.com/pdfcpu/pdfcpu/pkg/api"
)
func main() {
// 待合并的 PDF 文件列表(按顺序)
inputFiles := []string{"doc1.pdf", "doc2.pdf", "doc3.pdf"}
outputFile := "merged.pdf"
// 检查所有输入文件是否存在
for _, f := range inputFiles {
if _, err := os.Stat(f); os.IsNotExist(err) {
fmt.Printf("错误:文件 %s 不存在\n", f)
return
}
}
// 执行合并
if err := api.MergeAppendFile(inputFiles, outputFile, nil); err != nil {
fmt.Printf("合并失败:%v\n", err)
return
}
fmt.Printf("合并成功:%s\n", outputFile)
}const PDFMerger = require('pdf-merger-js');
const fs = require('fs');
async function mergePDFs() {
const merger = new PDFMerger();
// 待合并的 PDF 文件列表(按顺序)
const pdfFiles = ['doc1.pdf', 'doc2.pdf', 'doc3.pdf'];
// 检查文件是否存在
for (const file of pdfFiles) {
if (!fs.existsSync(file)) {
console.error(`错误:文件 ${file} 未找到`);
return;
}
}
// 按顺序添加文件
for (const file of pdfFiles) {
await merger.add(file);
}
// 保存合并结果
await merger.save('merged.pdf');
console.log('合并成功:merged.pdf');
}
mergePDFs().catch(console.error);常见问题
7 个高频疑问