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

如何用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
  • 安装Poppler(用于PDF转图片):
    • Linux:sudo apt install poppler-utils
    • Windows:下载后添加到系统环境变量
    • macOS:brew install poppler

完整代码(带注释)

# 导入所需库
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}")

关键说明

  1. 正则表达式调整:如果PDF中字段的格式(比如分隔符是半角冒号还是全角冒号,字段名前后是否有空格)和示例不同,需要修改FIELD_PATTERNS中的正则表达式,确保能准确匹配目标内容。
  2. 中文识别优化:OCR时指定lang='chi_sim'确保中文识别准确性,需提前安装Tesseract的中文语言包(Linux:sudo apt install tesseract-ocr-chi-sim,Windows/macOS需手动添加语言包文件)。
  3. 多页适配:代码会自动遍历PDF所有页面,若目标字段分布在不同页面,也能正确提取并合并结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:46:05