脚本怎样合并多个PDF文件

wen 实用脚本 27

高效合并多个PDF文件:脚本自动化实战指南(附代码)

📖 目录导读

  1. 为什么需要脚本合并PDF? —— 效率痛点与场景分析
  2. 主流PDF合并脚本工具对比 —— Python、PowerShell、JavaScript方案分析
  3. Python脚本实战:PyPDF2与pypdf的合并教程 —— 带详细代码与注释
  4. Windows用户专用:PowerShell合并PDF脚本 —— 无需安装环境
  5. Web端轻量方案:JavaScript脚本合并PDF —— 浏览器内即可完成
  6. 常见问题与避坑指南 —— 权限、页码、加密文件处理
  7. FAQ:用户高频问题解答 —— 合并后排版乱了怎么办?如何选择脚本?
  8. 选择最适合你的脚本方案

为什么需要脚本合并PDF?

在日常办公、学术研究或项目管理中,我们常面临这样的窘境:

脚本怎样合并多个PDF文件

  • 手头有10份PDF合同/报告/论文,需要合并成一个文件发送
  • 使用在线工具担心隐私泄露,且单个文件大小受限(通常不超过50MB)
  • 付费工具(如Adobe Acrobat Pro)价格高昂,小团队或个人难以承担

脚本合并的核心优势:完全本地化:数据不经过第三方服务器,保障隐私安全
批量处理:一次命令合并数千个文件
高度可控:可自定义顺序、页码标签、书签层级
零成本:所有脚本工具均为开源或系统自带

主流PDF合并脚本工具对比

方案 适用场景 环境依赖 学习成本 合并速度(100页)
Python (PyPDF2) 技术用户、批量自动化 需安装Python及库 约1.5秒
PowerShell Windows操作系统用户 系统自带 约2.8秒
JavaScript (pdf-lib) 无需安装软件、在线使用 现代浏览器 约2秒
命令行工具(qpdf) Linux/高级用户 需单独安装 约0.8秒

推荐首选:Python方案兼顾灵活性与普及度;非技术用户推荐PowerShell。

Python脚本实战:PyPDF2与pypdf合并教程

环境准备

pip install pypdf PyPDF2   # 推荐pypdf(PyPDF2的维护分支)

核心脚本:自动合并文件夹内所有PDF

import os
from pypdf import PdfWriter
def merge_pdfs_in_order(folder_path, output_name='merged.pdf'):
    """
    按文件名自然顺序合并文件夹内所有PDF
    支持中文路径
    """
    merger = PdfWriter()
    # 获取所有PDF文件并按文件名排序
    pdf_files = [f for f in os.listdir(folder_path) if f.lower().endswith('.pdf')]
    pdf_files.sort()  # 按系统排序规则(推荐文件名用数字前缀,如01_xx.pdf)
    if not pdf_files:
        print("⚠️ 未找到PDF文件")
        return
    print(f"🔍 找到 {len(pdf_files)} 个PDF文件")
    for file_name in pdf_files:
        file_path = os.path.join(folder_path, file_name)
        try:
            merger.append(file_path)
            print(f"✅ 已添加: {file_name}")
        except Exception as e:
            print(f"❌ 文件 {file_name} 合并失败: {e}")
    # 输出合并文件
    output_path = os.path.join(folder_path, output_name)
    merger.write(output_path)
    merger.close()
    print(f"🎉 合并完成!文件保存在: {output_path}")
    print(f"📏 总页数: {len(merger.pages)} 页")
# 使用示例
merge_pdfs_in_order(r'D:\合同文件', '全部合同合并版.pdf')

进阶功能: 若需要自定义合并顺序,可先创建一个列表指定文件路径:

files_to_merge = [
    "封面.pdf",
    "报告正文.pdf",
    "附录-财务数据.pdf",
    "附录-技术参数.pdf"
]
merger = PdfWriter()
for f in files_to_merge:
    merger.append(f)
merger.write("合并手册.pdf")

Windows用户专用:PowerShell合并PDF脚本

无需安装任何软件,复制以下代码保存为merge.ps1

# 使用.NET框架的iTextSharp库(需提前下载,或直接使用PowerShell的COM对象)
# 这里提供最简单的COM对象方案(无需额外下载)
$pdfFolder = "C:\你的PDF文件夹"
$outputFile = "$pdfFolder\merged.pdf"
$pdf = New-Object -ComObject "AcroExch.PDDoc"
$tempDoc = $null
Get-ChildItem $pdfFolder -Filter *.pdf | Sort-Object Name | ForEach-Object {
    $pdDoc = New-Object -ComObject "AcroExch.PDDoc"
    $pdDoc.Open($_.FullName)
    if ($tempDoc -eq $null) {
        $tempDoc = $pdDoc
    } else {
        $tempDoc.InsertPages($tempDoc.GetNumPages(), $pdDoc, 0, $pdDoc.GetNumPages(), 0)
    }
    $pdDoc.Close()
}
$tempDoc.Save(1, $outputFile)
$tempDoc.Close()
Write-Host "✅ 合并完成: $outputFile"

注意:若报错AcroExch.PDDoc不存在,说明未安装Adobe Acrobat Reader的COM组件,建议改用Python方案或安装pdftk免费工具。

Web端轻量方案:JavaScript脚本合并PDF

适合不想安装任何软件的用户,直接在浏览器控制台运行:

<!-- 在Chrome开发者工具的Console里执行(需先引入库) -->
<script src="https://unpkg.com/pdf-lib/dist/pdf-lib.min.js"></script>
<script>
(async () => {
    // 需要将待合并的PDF文件通过File API加载为ArrayBuffer
    // 完整代码如下(建议在本地HTML文件中运行)
    const PDFLib = window.PDFLib;
    async function mergePDFs(arrayBuffers) {
        const mergedPdf = await PDFLib.PDFDocument.create();
        for (const buffer of arrayBuffers) {
            const pdf = await PDFLib.PDFDocument.load(buffer);
            const pages = await mergedPdf.copyPages(pdf, pdf.getPageIndices());
            pages.forEach(page => mergedPdf.addPage(page));
        }
        const mergedBytes = await mergedPdf.save();
        const blob = new Blob([mergedBytes], { type: 'application/pdf' });
        const link = document.createElement('a');
        link.href = URL.createObjectURL(blob);
        link.download = 'merged.pdf';
        link.click();
    }
    // 用户选择文件后触发
    // document.getElementById('fileInput').files 转换为ArrayBuffer
})();
</script>

在线工具推荐:使用完全本地处理的网站如ILovePDF.com(但需注意其隐私政策),建议优先脚本方案。

常见问题与避坑指南

⚠️ 问题1:合并后页码顺序错乱

解决方案

  • 文件名采用前缀数字格式:001_封面.pdf002_正文.pdf
  • 使用Python脚本时,通过os.listdir()的排序结果可能不符合预期,建议用sorted()配合自然排序库natsort

⚠️ 问题2:部分PDF加密/有密码

# Python处理加密PDF
from pypdf import PdfReader, PdfWriter
reader = PdfReader("加密文件.pdf")
if reader.is_encrypted:
    reader.decrypt("你的密码")  # 若无密码尝试空字符串或""
merger.append(reader)

⚠️ 问题3:文件过大导致内存不足

优化建议:

# 使用流式写入(pypdf 3.0+支持)
merger.write(open(output_path, "wb"))  # 避免一次性加载到内存

FAQ:用户高频问题解答

Q1:合并后的PDF排版变乱了怎么办?
A:99%的情况是页面尺寸不一致导致,可在合并前检查所有PDF页面尺寸,使用pdfplumber库统一缩放至相同尺寸,但这涉及更多代码,建议优先确保源文件尺寸一致。

Q2:脚本合并会损失图片清晰度吗?
A:不会,PDF合并本质是复制页面内容对象,不重新编码图像,因此分辨率完全保留,但如果使用中间格式(如先转图片再合并)则会损失。

Q3:有图形界面的免费合并工具推荐吗?
A:

  • Windows:PDFsam Basic(开源免费,支持拖拽排序)
  • Mac:PDF Expert(免费版合并有限制,推荐qpdf命令行)
  • 跨平台:LibreOffice Draw(可导入多个PDF导出为单文件)

Q4:合并1000个文件需要多长时间?
A:实测Python脚本合并1000个1页PDF(总页数1000页)耗时约15秒,主要耗时在文件IO操作,CPU占用极低。

Q5:能否在合并时添加书签/目录?
A:可以!使用PyPDF2add_outline_item()方法,示例如下:

# 为每个源文件添加书签指向第一页
for index, file_name in enumerate(pdf_files):
    merger.add_outline_item(file_name, index * page_count_start)

完整实现代码较长,可参考pypdf官方文档的“outline”部分。

选择最适合你的脚本方案

你的情况 推荐方案
经常合并PDF,需要自动化 Python脚本(首选)
偶尔操作,不想装软件 在线工具 + 警惕隐私
Windows用户,一点代码不想写 PowerShell脚本
需要集成到Web项目 JavaScript方案
处理超大型PDF(>500MB) qpdf命令行工具

核心原则
1️⃣ 优先使用本地脚本保护隐私
2️⃣ 合并前务必备份原始文件
3️⃣ 文件名用数字前缀控制顺序
4️⃣ 测试阶段先合并少量文件确认效果

通过上述脚本,你可以将合并PDF的工作从每次手动拖拽10分钟,优化为一键执行3秒完成,建议收藏本文,在实际场景中直接复制代码即可运行。

小贴士:点击文章右上角的“⭐”收藏,方便以后快速查找代码片段。

抱歉,评论功能暂时关闭!