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

Python实现单PDF中多份W-2C表单结构化数据提取至Excel

批量提取W-2C表单数据到Excel的解决方案

针对你的需求(100多份W-2C表单合并PDF,提取字段到Excel,每行对应一份表单),分两种核心场景给出具体实现方案:


场景1:PDF是原生可复制文本(非扫描件)

这类PDF能直接提取文本,但布局混乱,核心思路是利用W-2C字段的固定标签,通过正则匹配定位对应值,再整理成结构化数据。

具体步骤:

  1. 使用pdfplumber读取PDF每页文本(它比PyPDF2更能保留布局相关的文本顺序)。
  2. 针对每个表单的文本块,编写正则表达式匹配每个字段(比如雇主信息、SSN、薪资等)。
  3. 将提取的字段整理为字典,批量存入列表后转换为DataFrame,最终导出到Excel。

示例代码:

import pdfplumber
import re
import pandas as pd

def extract_w2c_fields(page_text):
    # 定义字段匹配规则,根据实际PDF文本调整正则
    field_patterns = {
        "雇主名称地址": r"a\s+Employer’s name, address, and ZIP code\s+(.*?)\s+b\s+Employer identification number",
        "雇主EIN": r"b\s+Employer identification number \(EIN\)\s+(.*?)\s+c\s+Tax year/Form corrected",
        "纳税年度": r"c\s+Tax year/Form corrected\s+(.*?)\s+d\s+Employee’s correct SSN",
        "雇员正确SSN": r"d\s+Employee’s correct SSN\s+(.*?)\s+e\s+Corrected SSN and/or name",
        "原申报薪资": r"Previously reported\s+1\s+Wages, tips, other compensation\s+(\d+\.\d+)",
        "修正后薪资": r"Correct information\s+1\s+Wages, tips, other compensation\s+(\d+\.\d+)"
    }
    
    extracted = {}
    for field_name, pattern in field_patterns.items():
        match = re.search(pattern, page_text, re.DOTALL)
        extracted[field_name] = match.group(1).strip() if match else None
    return extracted

# 批量处理PDF页面
all_form_data = []
with pdfplumber.open("w2c_batch.pdf") as pdf:
    for page in pdf.pages:
        text = page.extract_text()
        if text:
            all_form_data.append(extract_w2c_fields(text))

# 导出到Excel
df = pd.DataFrame(all_form_data)
df.to_excel("w2c_extracted.xlsx", index=False)

场景2:PDF是扫描件(图片格式)

这类PDF无法直接复制文本,必须结合OCR识别,再提取字段。核心工具用Tesseract OCR配合pdf2image转换PDF到图片。

具体步骤:

  1. 用pdf2image将PDF每页转换为图片。
  2. 用pytesseract对图片进行OCR识别,得到文本。
  3. 复用场景1的正则匹配逻辑提取字段,最终导出Excel。

示例代码:

from pdf2image import convert_from_path
import pytesseract
import re
import pandas as pd

# 配置Tesseract路径(若未加入系统环境变量)
# pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

def extract_w2c_from_image(image):
    # OCR识别文本
    ocr_text = pytesseract.image_to_string(image, lang='eng')
    # 复用字段匹配逻辑
    field_patterns = {
        "雇主名称地址": r"a\s+Employer’s name, address, and ZIP code\s+(.*?)\s+b\s+Employer identification number",
        "雇主EIN": r"b\s+Employer identification number \(EIN\)\s+(.*?)\s+c\s+Tax year/Form corrected",
        # 其余字段同场景1...
    }
    
    extracted = {}
    for field_name, pattern in field_patterns.items():
        match = re.search(pattern, ocr_text, re.DOTALL)
        extracted[field_name] = match.group(1).strip() if match else None
    return extracted

# 转换PDF为图片并处理
images = convert_from_path("w2c_scanned.pdf")
all_form_data = []
for img in images:
    all_form_data.append(extract_w2c_from_image(img))

# 导出到Excel
df = pd.DataFrame(all_form_data)
df.to_excel("w2c_scanned_extracted.xlsx", index=False)

优化建议:

  • 若表单布局完全固定,扫描版可结合OpenCV定位输入框坐标,截取对应区域后再OCR,能大幅提升准确率。
  • 批量处理时添加错误捕获逻辑,避免单个表单提取失败导致整个程序中断。
  • 正则表达式需根据实际PDF的文本格式微调(比如换行、空格的差异)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 06:47:11