如何用Python从PDF中提取指定文本?已实现全文本提取需求助
扫描版PDF特定字段提取解决方案
针对扫描版PDF的特定字段提取需求,我们可以在OCR全文提取的基础上,通过正则表达式匹配目标字段的格式,实现结构化提取。以下是带有详细注释的Python实现代码:
依赖准备
确保已安装所需库及工具:
- 安装Python库:
pip install pdf2image pytesseract pillow - 安装Tesseract OCR引擎(需对应系统版本):
- Linux:
sudo apt install tesseract-ocr - Windows:从官方渠道下载安装,并在代码中指定路径
- macOS:
brew install tesseract
- Linux:
- 安装Poppler(用于PDF转图片):
- Linux:
sudo apt install poppler-utils - Windows:下载后添加到系统环境变量
- macOS:
brew install poppler
- Linux:
完整代码(带注释)
# 导入所需库 import pdf2image import pytesseract from PIL import Image import re # -------------------------- 配置项 -------------------------- # 如果是Windows系统,需指定Tesseract的安装路径,Linux/macOS可注释此行 # pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' # PDF文件路径 PDF_PATH = '/content/SRW1012022Y0002378_220216102321.PDF' # 定义需要提取的字段及对应的正则表达式 # 格式:字段名: 正则表达式(匹配"字段名: 值"的格式,可根据实际PDF格式调整) FIELD_PATTERNS = { '业务编号': r'业务编号\s*[::]\s*(\S+)', '申请人': r'申请人\s*[::]\s*([^\n]+)', '申请日期': r'申请日期\s*[::]\s*(\d{4}-\d{2}-\d{2})', '联系电话': r'联系电话\s*[::]\s*(\d{11})', '申请事项': r'申请事项\s*[::]\s*([^\n]+)', # 可根据截图中的其他字段继续添加 } # ----------------------------------------------------------- def extract_pdf_fields(pdf_path, field_patterns): """ 从扫描版PDF中提取指定字段 :param pdf_path: PDF文件路径 :param field_patterns: 字段-正则表达式字典 :return: 提取结果字典 """ # 将PDF转换为图片(每页对应一张图片) pages = pdf2image.convert_from_path(pdf_path) # 初始化结果字典 extract_result = {} # 遍历每一页图片 for page_num, page_img in enumerate(pages, start=1): print(f"正在处理第 {page_num} 页...") # OCR识别当前页文本,指定中文简体提高识别准确率 page_text = pytesseract.image_to_string(page_img, lang='chi_sim') # 遍历每个需要提取的字段 for field_name, pattern in field_patterns.items(): # 用正则匹配字段值 match = re.search(pattern, page_text) if match: # 提取匹配到的值并存入结果字典,去除首尾空白 extract_result[field_name] = match.group(1).strip() print(f"已提取 {field_name}: {extract_result[field_name]}") return extract_result if __name__ == '__main__': # 执行提取逻辑 result = extract_pdf_fields(PDF_PATH, FIELD_PATTERNS) # 打印最终提取结果 print("\n=== 最终提取结果 ===") for key, value in result.items(): print(f"{key}: {value}")
关键说明
- 正则表达式调整:如果PDF中字段的格式(比如分隔符是半角冒号还是全角冒号,字段名前后是否有空格)和示例不同,需要修改
FIELD_PATTERNS中的正则表达式,确保能准确匹配目标内容。 - 中文识别优化:OCR时指定
lang='chi_sim'确保中文识别准确性,需提前安装Tesseract的中文语言包(Linux:sudo apt install tesseract-ocr-chi-sim,Windows/macOS需手动添加语言包文件)。 - 多页适配:代码会自动遍历PDF所有页面,若目标字段分布在不同页面,也能正确提取并合并结果。
内容的提问来源于stack exchange,提问作者anonymous
相关产品推荐
相关产品推荐

