如何用Python将非表格/容器类PDF数据转为列格式表格
需求与解决方案:PDF检验结果转结构化表格
需求说明
将PDF中的检验结果数据转换为用|分隔的结构化格式,无需依赖AI模型,替代此前在R中通过识别大空格替换为|的实现方式,解决使用pdfplumber、PdfReader、pytesseract时遇到的结构化提取问题。
已尝试工具及问题
pdfplumber:仅能提取顶部结构化个人信息,无法提取靠大空格分隔的检验结果数据
代码示例:import pandas as pd import pdfplumber path = r"my_pdf_file.pdf" data = [] with pdfplumber.open(path) as pdf: pages = pdf.pages for p in pages: data.append(p.extract_tables()) print(data)问题:提取结果仅包含患者信息,无法获取检验结果数据。
PdfReader:仅返回纯文本格式,无结构化表格数据
代码示例:from pypdf import PdfReader reader = PdfReader(path) reader.pages[0].extract_text().splitlines()问题:输出为无结构的文本行,无法直接转为表格。
pytesseract:提取的文本中检验结果靠空格分隔,无法直接转为目标格式
解决方案:基于大空格识别的文本处理
通过识别文本中的连续多空格,将其替换为|,同时保留特殊说明行的原始格式,以下是Python实现:
实现步骤
- 用PdfReader或pytesseract提取PDF纯文本行
- 遍历每行内容,区分检验结果行与说明行
- 用正则表达式将连续多空格替换为
| - 直接保留说明类行的原始格式
代码实现
from pypdf import PdfReader import re def process_pdf_test_results(pdf_path): reader = PdfReader(pdf_path) processed_lines = [] # 匹配连续2个及以上空格的正则规则 multi_space_pattern = re.compile(r'\s{2,}') for page in reader.pages: text_lines = page.extract_text().splitlines() for line in text_lines: stripped_line = line.strip() if not stripped_line: continue # 简单判断:包含数字的行视为检验结果行 if any(char.isdigit() for char in stripped_line): processed_line = multi_space_pattern.sub('|', stripped_line) processed_lines.append(processed_line) else: # 保留检测方法等说明类行 processed_lines.append(stripped_line) return processed_lines # 使用示例 path = r"my_pdf_file.pdf" result = process_pdf_test_results(path) for line in result: print(line)
预期输出示例
血尿素氮(BUN)|15|6-21|mg/dl (检测方法:计算法) 血清肌酐|1.10|0.9-1.3|mg/dL
补充优化建议
- 若pytesseract提取的文本存在断行、空格混乱问题,可先增加预处理步骤:合并连续的断行、去除无意义的单个空格
- 可根据实际PDF格式,调整检验结果行的判断逻辑,比如增加对常见检验单位(mg/dl、mmol/L等)的匹配,提升识别准确率
内容的提问来源于stack exchange,提问作者ViSa
相关产品推荐
相关产品推荐

