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

Python提取PDF中被换行拆分的CPF/CNPJ失败,寻求解决方法

解决PDF中CPF/CNPJ被拆分无法匹配的问题

一、优化现有代码的解决方案

方法1:清理文本中的所有空白字符

PyPDF2提取文本时可能会在CPF/CNPJ中间插入换行或空格,导致正则无法匹配。可以先移除所有空白字符(换行、空格、制表符等),让原本拆分的内容拼接成完整的格式:

修改代码中的文本处理部分:

# 提取页面文本
texto = pdf.getPage(p).extractText()
# 移除所有空白字符(替换任意数量的空白为空字符串)
texto_limpo = re.sub(r'\s+', '', texto)
# 用清理后的文本匹配CPF/CNPJ
cnpjs = re.findall(r'\d{2}\.\d{3}\.\d{3}/\d{4}-\d{2}', texto_limpo)
cpfs = re.findall(r'\d{3}\.\d{3}\.\d{3}-\d{2}', texto_limpo)

这样像31.111.111\n/0001-64的内容会被处理成31.111.111/0001-64,正则就能正常匹配。

方法2:修改正则允许中间存在空白字符

如果不想完全移除空白,可以调整正则表达式,允许CPF/CNPJ的各个组成部分之间有任意空白字符:

# 匹配允许中间有空白的CNPJ和CPF
cnpjs = re.findall(r'\d{2}\.\s*\d{3}\.\s*\d{3}\s*/\s*\d{4}\s*-\s*\d{2}', texto)
cpfs = re.findall(r'\d{3}\.\s*\d{3}\.\s*\d{3}\s*-\s*\d{2}', texto)

其中\s*表示匹配0个或多个空白字符(包括换行、空格、制表符),这样即使内容被拆分,也能匹配到完整的号码。

二、替代PDF读取库推荐

PyPDF2的文本提取能力有限,对于复杂排版的PDF容易出现文本拆分问题,推荐以下更可靠的库:

1. pdfplumber

专注于PDF文本提取和数据分析,能精准识别文本布局,减少内容拆分的情况:

  • 安装:pip install pdfplumber
  • 代码示例:
import pdfplumber

# 替换原有的PDF读取逻辑
with pdfplumber.open(valores["file_path"]) as pdf:
    lista = []
    for page in pdf.pages:
        texto = page.extract_text()
        texto_limpo = re.sub(r'\s+', '', texto)
        cnpjs = re.findall(r'\d{2}\.\d{3}\.\d{3}/\d{4}-\d{2}', texto_limpo)
        cpfs = re.findall(r'\d{3}\.\d{3}\.\d{3}-\d{2}', texto_limpo)
        lista.extend(cpfs)
        lista.extend(cnpjs)

2. PyMuPDF(fitz)

提取速度快,文本质量高,对各种PDF格式兼容性好:

  • 安装:pip install pymupdf
  • 代码示例:
import fitz

# 替换原有的PDF读取逻辑
doc = fitz.open(valores["file_path"])
lista = []
for page in doc:
    texto = page.get_text()
    texto_limpo = re.sub(r'\s+', '', texto)
    cnpjs = re.findall(r'\d{2}\.\d{3}\.\d{3}/\d{4}-\d{2}', texto_limpo)
    cpfs = re.findall(r'\d{3}\.\d{3}\.\d{3}-\d{2}', texto_limpo)
    lista.extend(cpfs)
    lista.extend(cnpjs)
doc.close()

内容的提问来源于stack exchange,提问作者Carlos.Correia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:25:33