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

