如何排查PyPDF2中PdfMerger引发的Python断言错误?
问题分析与解决方案
一、先修正代码中的语法错误
你的代码存在两处明显语法问题,可能导致部分执行异常:
folder_path定义后缺少换行,导致和后续代码连在一起:folder_path = "U:\\BMP" # 此处需换行分隔后续代码 pdf_files = [os.path.splitext(f)[0] for f in os.listdir(folder_path) if f.endswith('.pdf')]- 输出文件名拼接时缺少加号:
file_out = open("S:\\USERS\\VINTON\\BMP-Rev\\" + search_value + ".pdf", 'wb') # 补全+完成拼接
二、核心问题:PdfMerger断言错误的常见原因与修复
1. 文件指针位置异常(最可能触发错误)
你先通过PdfReader(file_in)读取了文件,此时文件指针已移动到文件末尾,后续调用pdf_merger.append(file_in)时,PdfMerger无法读取有效内容,触发内部断言错误。
修复方法:在append前将文件指针重置到开头,或重新打开文件:
# 方法1:重置指针 file_in.seek(0) pdf_merger.append(file_in) # 方法2:重新打开文件(更稳妥) file_in.close() file_in = open(FileName, 'rb') pdf_merger.append(file_in)
2. PDF文件结构损坏
少数PDF可能存在交叉引用表错误、损坏对象或异常流结构,导致PyPDF2无法正常解析。
修复方法:
- 捕获异常并跳过错误文件,同时记录错误信息:
try: pdf_merger.append(file_in) pdf_merger.add_metadata({ '/Revision': Revision, '/Description': Description }) file_out = open("S:\\USERS\\VINTON\\BMP-Rev\\" + search_value + ".pdf", 'wb') pdf_merger.write(file_out) except AssertionError as e: print(f"处理文件{search_value}.pdf时出错:{e}") finally: file_in.close() file_out.close() pdf_merger.close() # 关闭PdfMerger释放资源 - 尝试用PyPDF2修复损坏的PDF:
from PyPDF2 import PdfWriter # 先修复PDF reader = PdfReader(file_in) writer = PdfWriter() for page in reader.pages: writer.add_page(page) # 将修复后的内容写入临时文件,再用PdfMerger处理 temp_file = "temp_fixed.pdf" with open(temp_file, 'wb') as f: writer.write(f) # 用修复后的文件处理 pdf_merger.append(temp_file)
3. PyPDF2版本问题
旧版本PyPDF2存在已知解析bug,建议升级到最新稳定版:
pip install --upgrade PyPDF2
三、修正后的完整代码
import os import pandas as pd from PyPDF2 import PdfReader, PdfMerger, PdfWriter df = pd.read_excel('S:\\USERS\\VINTON\\F001A - Item Master (Stock and Cost)- 270001.xlsx') folder_path = "U:\\BMP" pdf_files = [os.path.splitext(f)[0] for f in os.listdir(folder_path) if f.endswith('.pdf')] for EachFile in pdf_files: search_value = EachFile print(EachFile) search_result = df[df['Item Number 02'] == search_value] if not search_result.empty: print("Found in JDE") Revision = search_result['Rev'].values[0] Description = search_result['Item Description 01'].values[0] FileName = "U:\\BMP\\" + search_value + ".pdf" file_in = None file_out = None pdf_merger = None try: file_in = open(FileName, 'rb') pdf_reader = PdfReader(file_in) if pdf_reader.is_encrypted: print("Encrypted") continue # 重置文件指针到开头 file_in.seek(0) pdf_merger = PdfMerger() pdf_merger.append(file_in) pdf_merger.add_metadata({ '/Revision': Revision, '/Description': Description }) output_file = "S:\\USERS\\VINTON\\BMP-Rev\\" + search_value + ".pdf" file_out = open(output_file, 'wb') pdf_merger.write(file_out) print(f"成功处理文件: {output_file}") except AssertionError as e: print(f"处理文件{search_value}.pdf时触发断言错误: {str(e)}") # 尝试修复PDF try: if file_in: file_in.seek(0) reader = PdfReader(file_in) writer = PdfWriter() for page in reader.pages: writer.add_page(page) temp_file = f"{search_value}_temp.pdf" with open(temp_file, 'wb') as f: writer.write(f) # 用修复后的文件重新处理 pdf_merger = PdfMerger() pdf_merger.append(temp_file) pdf_merger.add_metadata({ '/Revision': Revision, '/Description': Description }) output_file = "S:\\USERS\\VINTON\\BMP-Rev\\" + search_value + ".pdf" file_out = open(output_file, 'wb') pdf_merger.write(file_out) print(f"修复后成功处理文件: {output_file}") os.remove(temp_file) except Exception as e2: print(f"修复文件{search_value}.pdf失败: {str(e2)}") except Exception as e: print(f"处理文件{search_value}.pdf时发生未知错误: {str(e)}") finally: if file_in: file_in.close() if file_out: file_out.close() if pdf_merger: pdf_merger.close() print("All Done!!")
内容的提问来源于stack exchange,提问作者VikedVinton
相关产品推荐
相关产品推荐

