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

如何排查PyPDF2中PdfMerger引发的Python断言错误?

问题分析与解决方案

一、先修正代码中的语法错误

你的代码存在两处明显语法问题,可能导致部分执行异常:

  1. folder_path定义后缺少换行,导致和后续代码连在一起:
    folder_path = "U:\\BMP"  # 此处需换行分隔后续代码
    pdf_files = [os.path.splitext(f)[0] for f in os.listdir(folder_path) if f.endswith('.pdf')]
    
  2. 输出文件名拼接时缺少加号:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 13:35:19