如何用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
相关产品推荐
相关产品推荐

