Python合并PDF案例实操?

wen python案例 1

本文目录导读:

  1. 方法一:使用PyPDF2库(推荐)
  2. 方法二:使用pypdf库(PyPDF2的继任者)
  3. 方法三:实用案例:文件夹内所有PDF合并
  4. 方法四:带进度条的合并(适合大文件)
  5. 方法五:处理密码保护的PDF
  6. 实用小技巧
  7. 常见问题解决
  8. 完整脚本模板

我来为您详细介绍Python合并PDF的几种实操方法。

使用PyPDF2库(推荐)

安装

pip install PyPDF2

基础合并

import PyPDF2
import os
def merge_pdfs_basic(pdf_list, output_path):
    """
    合并多个PDF文件
    :param pdf_list: PDF文件路径列表
    :param output_path: 输出文件路径
    """
    # 创建PDF合并对象
    merger = PyPDF2.PdfMerger()
    # 逐个添加PDF文件
    for pdf in pdf_list:
        merger.append(pdf)
    # 写入合并后的文件
    with open(output_path, 'wb') as f:
        merger.write(f)
    print(f"合并完成!输出文件:{output_path}")
# 使用示例
pdf_files = ['file1.pdf', 'file2.pdf', 'file3.pdf']
merge_pdfs_basic(pdf_files, 'merged_output.pdf')

高级用法:选择指定页面

def merge_specific_pages(pdf_list, output_path):
    """
    合并PDF并选择特定页面
    """
    merger = PyPDF2.PdfMerger()
    # 添加第一个PDF的所有页面
    merger.append('file1.pdf')
    # 添加第二个PDF的第1-3页
    with open('file2.pdf', 'rb') as f:
        pdf_reader = PyPDF2.PdfReader(f)
        merger.append('file2.pdf', pages=(0, 2))  # 第1-3页(索引0-2)
    # 添加第三个PDF的偶数页
    merger.append('file3.pdf', pages=[0, 2, 4])  # 第1,3,5页
    with open(output_path, 'wb') as f:
        merger.write(f)
# 使用示例
merge_specific_pages(pdf_files, 'selective_merge.pdf')

使用pypdf库(PyPDF2的继任者)

安装

pip install pypdf

合并代码

from pypdf import PdfWriter
import os
def merge_with_pypdf(pdf_list, output_path):
    """
    使用pypdf库合并PDF
    """
    merger = PdfWriter()
    for pdf in pdf_list:
        merger.append(pdf)
    # 写入输出文件
    with open(output_path, 'wb') as f:
        merger.write(f)
# 使用示例
pdf_files = ['doc1.pdf', 'doc2.pdf', 'doc3.pdf']
merge_with_pypdf(pdf_files, 'merged_document.pdf')

实用案例:文件夹内所有PDF合并

完整脚本

import os
import PyPDF2
from pathlib import Path
def merge_all_pdfs_in_folder(folder_path, output_filename='merged.pdf'):
    """
    合并文件夹中的所有PDF文件
    """
    # 获取文件夹路径并创建输出路径
    folder = Path(folder_path)
    output_file = folder / output_filename
    # 收集所有PDF文件
    pdf_files = list(folder.glob('*.pdf'))
    pdf_files.sort()  # 按文件名排序
    if not pdf_files:
        print("未找到PDF文件!")
        return
    print(f"找到 {len(pdf_files)} 个PDF文件")
    # 合并文件
    merger = PyPDF2.PdfMerger()
    for pdf_file in pdf_files:
        print(f"添加文件: {pdf_file.name}")
        merger.append(str(pdf_file))
    # 保存合并文件
    with open(str(output_file), 'wb') as f:
        merger.write(f)
    print(f"合并完成!输出文件:{output_file}")
# 使用示例
merge_all_pdfs_in_folder('./pdf_files', 'combined.pdf')

带进度条的合并(适合大文件)

安装tqdm

pip install tqdm

带进度条的合并

import PyPDF2
from pathlib import Path
from tqdm import tqdm
import time
def merge_with_progress(pdf_list, output_path):
    """
    带进度条的PDF合并
    """
    merger = PyPDF2.PdfMerger()
    print("开始合并PDF文件...")
    for pdf_file in tqdm(pdf_list, desc="合并进度", unit="file"):
        merger.append(str(pdf_file))
        time.sleep(0.1)  # 模拟处理时间(实际使用时删掉)
    print("正在写入合并文件...")
    with open(output_path, 'wb') as f:
        merger.write(f)
    print(f"合并完成!文件大小:{os.path.getsize(output_path)/1024:.2f} KB")
# 使用示例
pdf_files = [f'document_{i}.pdf' for i in range(1, 11)]  # 模拟10个文件
merge_with_progress(pdf_files, 'merged_with_progress.pdf')

处理密码保护的PDF

import PyPDF2
def merge_protected_pdfs():
    """
    合并带密码保护的PDF
    """
    merger = PyPDF2.PdfMerger()
    # 添加密码保护的PDF
    with open('protected.pdf', 'rb') as file:
        pdf_reader = PyPDF2.PdfReader(file)
        if pdf_reader.is_encrypted:
            pdf_reader.decrypt('your_password')  # 输入密码
            merger.append(pdf_reader)
    # 添加普通PDF
    merger.append('normal.pdf')
    # 设置输出文件的密码
    merger.encrypt('output_password')
    with open('protected_merged.pdf', 'wb') as f:
        merger.write(f)
# 使用示例
merge_protected_pdfs()

实用小技巧

按创建日期排序合并

import os
from datetime import datetime
def merge_by_date(folder_path):
    """按创建日期排序合并"""
    pdf_files = []
    for file in os.listdir(folder_path):
        if file.endswith('.pdf'):
            full_path = os.path.join(folder_path, file)
            creation_time = os.path.getctime(full_path)
            pdf_files.append((creation_time, full_path))
    # 按创建时间排序
    pdf_files.sort()
    # 合并
    merger = PyPDF2.PdfMerger()
    for _, pdf_path in pdf_files:
        merger.append(pdf_path)
    merger.write('sorted_merged.pdf')

合并并添加书签

def merge_with_bookmarks(pdf_list, titles, output_path):
    """
    合并PDF并添加书签
    :param pdf_list: PDF文件列表
    :param titles: 对应的书签标题列表
    """
    merger = PyPDF2.PdfMerger()
    for i, (pdf, title) in enumerate(zip(pdf_list, titles)):
        merger.append(pdf, outline_item=title)
    with open(output_path, 'wb') as f:
        merger.write(f)
# 使用示例
pdf_files = ['ch1.pdf', 'ch2.pdf', 'ch3.pdf']
chapter_titles = ['第一章', '第二章', '第三章']
merge_with_bookmarks(pdf_files, chapter_titles, 'bookmarked_merge.pdf')

常见问题解决

处理编码错误

with open(pdf_file, 'rb') as file:  # 使用二进制模式
    merger.append(file)

大文件处理

# 分批处理大文件
def merge_large_files(pdf_files, output_path):
    merger = PyPDF2.PdfMerger()
    for i, pdf in enumerate(pdf_files):
        try:
            merger.append(pdf)
            print(f"成功添加第{i+1}个文件")
        except Exception as e:
            print(f"添加第{i+1}个文件时出错: {e}")
    merger.write(output_path)

完整脚本模板

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import sys
import PyPDF2
from pathlib import Path
def main():
    """主函数"""
    # 配置参数
    input_folder = "./pdfs"  # 输入文件夹
    output_file = "result.pdf"  # 输出文件名
    # 获取所有PDF文件
    pdf_files = list(Path(input_folder).glob("*.pdf"))
    if not pdf_files:
        print("错误:未找到PDF文件!")
        sys.exit(1)
    print(f"发现 {len(pdf_files)} 个PDF文件")
    # 执行合并
    merger = PyPDF2.PdfMerger()
    for pdf in sorted(pdf_files):
        print(f"正在合并: {pdf.name}")
        merger.append(str(pdf))
    # 保存结果
    merger.write(output_file)
    print(f"合并完成!输出文件: {output_file}")
if __name__ == "__main__":
    main()

这些方法涵盖了大多数PDF合并的需求,选择哪种方法取决于您的具体场景:

  • 简单合并:使用PyPDF2或pypdf
  • 需要选择页面:使用页面选择功能
  • 处理大量文件:添加进度条
  • 需要书签:使用outline_item参数

有任何具体问题或需要更多功能,欢迎继续询问!

标签: PDF合并

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