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

Python PDF行分析数据提取异常,请求技术排查指导

高校PDF批量重命名工具数据提取故障排查

我正在给学校开发一款PDF数据提取工具,用来批量重命名数千份文件,省掉手动操作的时间。目前已经用行分析脚本把PDF内容拆分成了行,但后续的提取脚本出了两个问题:

  • 发票文件提取的Student ID完全错误,拿到的是无关内容
  • 账单文件根本提取不到Semester和Year字段

相关代码片段

行分析核心代码

import PyPDF2

def split_pdf_into_lines(pdf_path):
    with open(pdf_path, 'rb') as f:
        reader = PyPDF2.PdfReader(f)
        lines = []
        for page in reader.pages:
            text = page.extract_text()
            page_lines = text.split('\n')
            lines.extend(page_lines)
    return lines

发票数据提取代码

def extract_invoice_data(lines):
    student_id = None
    for line in lines:
        if "Student ID" in line:
            # 按冒号分割取最后一段
            student_id = line.split(':')[-1].strip()
    return {'student_id': student_id}

账单数据提取代码

def extract_bill_data(lines):
    semester, year = None, None
    for line in lines:
        if "Semester" in line:
            semester = line.split(':')[-1].strip()
        if "Year" in line:
            year = line.split(':')[-1].strip()
    return {'semester': semester, 'year': year}

错误输出示例

# 发票提取结果(错误)
{'student_id': 'Undergraduate'}  # 预期应为类似"S1234567"的学生ID

# 账单提取结果(错误)
{'semester': None, 'year': None}  # 预期应提取到"Fall"和"2024"

排查方向

  • 行分割逻辑问题:PyPDF2提取文本时可能存在换行异常,比如原本同属一行的内容被拆分,或者不同行内容被合并。可以打印split_pdf_into_lines返回的lines列表,核对实际文本行的格式是否符合预期。
  • 匹配规则精度不足:发票里的"Student ID"可能和其他带冒号的内容在同一行(比如Student ID: S1234567 | Program: Undergraduate),用split(':')[-1]会取到最后一个冒号后的内容。建议改用正则表达式精确匹配,比如re.search(r'Student ID:\s*(\w+)', line)来捕获ID。
  • 账单字段格式不符预期:账单里的Semester和Year可能不是Semester: Fall这种格式,比如可能是2024 Fall Term或Academic Year: 2023-2024 | Semester: Spring。先查看账单PDF提取后的原始文本,确认字段的实际呈现形式,再调整匹配逻辑。
  • PDF文本提取工具局限性:如果PDF是扫描件(图片转PDF),PyPDF2无法提取有效文本;即使是原生PDF,PyPDF2的文本提取也可能丢失布局信息。可以尝试替换成pdfplumber,它能更精准地提取带布局的文本内容。

内容的提问来源于stack exchange,提问作者Jonathon Martinez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 10:03:29