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

Python提取非结构化PDF表格数据失败,求可行解决方案

解决PDF特定数据提取问题的有效方案

原代码的核心问题

  1. 路径错误:你把ruta_pdf直接设为当前目录,而非具体的PDF文件路径,导致无法正确打开目标文件。
  2. 匹配逻辑局限:原代码仅针对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)

关键说明

  1. 路径修正:必须将pdf_path指定为具体的PDF文件路径,而非目录。
  2. 正则适配:
    • 如果PDF中字段前缀(如"EMPRESA")的格式有变化(比如无冒号、多空格),需调整正则中的前缀部分(如r"EMPRESA\s*([^\n]+)")。
    • 若目标数据在PDF中有重复,可通过调整正则的匹配位置或增加上下文限定词(如在金额前加"MONTO:")来精准定位。
  3. 扩展兼容性:如果PDF是扫描件(图片型),则需要OCR工具(如pytesseract)配合PyMuPDF先提取图片再识别文本,代码需额外添加OCR逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 16:57:18