Python提取非结构化PDF表格数据失败,求可行解决方案
解决PDF特定数据提取问题的有效方案
原代码的核心问题
- 路径错误:你把
ruta_pdf直接设为当前目录,而非具体的PDF文件路径,导致无法正确打开目标文件。 - 匹配逻辑局限:原代码仅针对
EMPRESA、DOMICILIO等少数字段,且依赖严格的冒号分隔或表格相邻列结构,既无法覆盖你需要的所有目标数据,也没考虑PDF文本布局的潜在差异。
有效解决方案:基于PyMuPDF+正则表达式
利用PyMuPDF提取PDF全文,再通过正则表达式精准匹配所有目标数据——这种方式不依赖表格结构,适配多数文本型PDF的布局。
完整代码示例
import fitz # PyMuPDF import re import os def extraer_datos_pdf(ruta_pdf): # 打开PDF并提取全文 documento = fitz.open(ruta_pdf) texto_completo = "" for pagina in documento: texto_completo += pagina.get_text() # 初始化提取结果 resultados = { "empresa": "未找到", "domicilio": "未找到", "monto": "未找到", "fecha_completa": "未找到", "fecha_mes_anio_1": "未找到", "fecha_mes_anio_2": "未找到", "numero_11dig": "未找到", "numero_7dig": "未找到" } # 匹配公司名称(假设位于"EMPRESA:"后) match_empresa = re.search(r"EMPRESA\s*:\s*([^\n]+)", texto_completo) if match_empresa: resultados["empresa"] = match_empresa.group(1).strip() # 匹配地址(假设位于"DOMICILIO:"后) match_domicilio = re.search(r"DOMICILIO\s*:\s*([^\n]+)", texto_completo) if match_domicilio: resultados["domicilio"] = match_domicilio.group(1).strip() # 匹配金额(格式:X.XXX,XX) match_monto = re.search(r"(\d+\.\d+,\d{2})", texto_completo) if match_monto: resultados["monto"] = match_monto.group(1) # 匹配完整日期(DD/MM/YYYY) match_fecha_completa = re.search(r"(\d{2}/\d{2}/\d{4})", texto_completo) if match_fecha_completa: resultados["fecha_completa"] = match_fecha_completa.group(1) # 匹配两个MM/YYYY格式日期 match_fechas_mesanio = re.findall(r"(\d{2}/\d{4})", texto_completo) if len(match_fechas_mesanio) >= 2: resultados["fecha_mes_anio_1"] = match_fechas_mesanio[0] resultados["fecha_mes_anio_2"] = match_fechas_mesanio[1] # 匹配11位数字串 match_num11 = re.search(r"(\d{11})", texto_completo) if match_num11: resultados["numero_11dig"] = match_num11.group(1) # 匹配7位数字串 match_num7 = re.search(r"(\d{7})", texto_completo) if match_num7: resultados["numero_7dig"] = match_num7.group(1) return resultados # 使用示例:替换为你的PDF文件路径 current_dir = os.getcwd() pdf_path = os.path.join(current_dir, "tu_archivo.pdf") # 替换成实际文件名 datos_extraidos = extraer_datos_pdf(pdf_path) print(datos_extraidos)
关键说明
- 路径修正:必须将
pdf_path指定为具体的PDF文件路径,而非目录。 - 正则适配:
- 如果PDF中字段前缀(如"EMPRESA")的格式有变化(比如无冒号、多空格),需调整正则中的前缀部分(如
r"EMPRESA\s*([^\n]+)")。 - 若目标数据在PDF中有重复,可通过调整正则的匹配位置或增加上下文限定词(如在金额前加"MONTO:")来精准定位。
- 如果PDF中字段前缀(如"EMPRESA")的格式有变化(比如无冒号、多空格),需调整正则中的前缀部分(如
- 扩展兼容性:如果PDF是扫描件(图片型),则需要OCR工具(如
pytesseract)配合PyMuPDF先提取图片再识别文本,代码需额外添加OCR逻辑。
内容的提问来源于stack exchange,提问作者user23531309
相关产品推荐
相关产品推荐

