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

