You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python的PyPDF按指定顺序批量合并多家庭PDF文件

批量按自定义顺序合并多家庭PDF文件

核心需求

批量处理文件夹中数百个家庭的PDF文件,按指定的文件类型顺序合并每个家庭的所有文件,合并顺序不依赖文件名的字母排序,同时支持同一家庭同类型多文件的合并。

解决方案代码

import os
from PyPDF2 import PdfMerger

def load_reference_order(file_path):
    """读取文件类型参考顺序列表"""
    with open(file_path, 'r', encoding='utf-8') as f:
        return [line.strip() for line in f if line.strip()]

def group_files_by_family(directory, reference_order):
    """将PDF文件按家庭ID分组,并匹配对应基础类型"""
    family_files = {}
    for filename in os.listdir(directory):
        if not filename.endswith('.pdf'):
            continue
        # 拆分文件名提取核心信息
        parts = filename.split('_', 2)
        if len(parts) < 3:
            continue
        prefix, family_id, rest = parts
        file_type_part = rest.rsplit('.', 1)[0]
        
        # 匹配参考列表中的基础类型(如Phone Bill Son归为Phone Bill)
        base_type = None
        for ref_type in reference_order:
            if file_type_part.startswith(ref_type):
                base_type = ref_type
                break
        if not base_type:
            continue
        
        # 按家庭ID分组存储文件信息
        if family_id not in family_files:
            family_files[family_id] = []
        family_files[family_id].append((os.path.join(directory, filename), base_type))
    return family_files, prefix

def merge_family_pdfs(family_id, files, reference_order, output_dir, password=None):
    """按参考顺序合并单个家庭的PDF"""
    merger = PdfMerger()
    # 严格按参考列表顺序处理
    for ref_type in reference_order:
        matching_files = [f for f, t in files if t == ref_type]
        matching_files.sort()  # 同类型文件按文件名排序(可按需调整)
        for file_path in matching_files:
            try:
                merger.append(file_path, password=password)
            except Exception as e:
                print(f"处理文件 {file_path} 出错: {str(e)}")
    
    output_filename = f"{prefix}_{family_id}_Family_Combined_File_Package.pdf"
    output_path = os.path.join(output_dir, output_filename)
    merger.write(output_path)
    merger.close()
    print(f"已生成合并文件: {output_path}")

if __name__ == "__main__":
    # 配置参数
    REFERENCE_FILE = "File_Type_Reference_File.txt"
    WORKING_DIR = os.getcwd()
    OUTPUT_DIR = "merged_pdfs"
    PDF_PASSWORD = "filepassword"  # 无需解密则设为None
    
    # 初始化输出目录
    if not os.path.exists(OUTPUT_DIR):
        os.makedirs(OUTPUT_DIR)
    
    # 加载参考顺序
    reference_order = load_reference_order(REFERENCE_FILE)
    if not reference_order:
        print("参考列表为空,请检查文件")
        exit()
    
    # 按家庭分组文件
    family_files, prefix = group_files_by_family(WORKING_DIR, reference_order)
    if not family_files:
        print("未找到符合命名规则的PDF文件")
        exit()
    
    # 批量处理每个家庭
    for family_id, files in family_files.items():
        merge_family_pdfs(family_id, files, reference_order, OUTPUT_DIR, PDF_PASSWORD)

关键逻辑说明

  • 参考列表处理:读取并清洗参考文件,去除空行和多余空白,保证顺序准确性。
  • 文件分组:通过文件名拆分提取家庭ID,匹配参考列表中的基础类型,将同家庭文件归类。
  • 有序合并:严格按照参考列表顺序遍历类型,将对应类型的所有文件依次加入合并器,同类型文件可按需排序。
  • 解密支持:合并时自动处理加密PDF,无需额外操作。
  • 批量输出:自动生成每个家庭的合并文件,统一保存到指定目录,避免覆盖原文件。

注意事项

  • 确保文件名符合前缀_家庭ID_文件类型.pdf规则,不符合规则的文件会被跳过。
  • 若基础类型匹配逻辑需要调整(如非前缀匹配),可修改group_files_by_family中的类型判断代码。
  • 无需解密时,将PDF_PASSWORD设为None即可。

内容的提问来源于stack exchange,提问作者Jean-Baptiste

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 11:53:21