环境准备与依赖安装
在开始社保档案数字化处理之前,必须搭建一个稳定且兼容性好的Python运行环境。本方案基于Windows 10/11系统开发,核心依赖Tesseract-OCR引擎进行中文识别。
1. 安装Python环境
请确保已安装Python 3.8或更高版本。如果尚未安装,请直接访问Python官网下载Windows installer(64-bit)。安装时,务必勾选界面底部的"Add Python to PATH"选项,这将避免后续手动配置环境变量的麻烦。安装完成后,在CMD中输入python --version,显示版本号即表示安装成功。
2. 安装Tesseract-OCR引擎
这是实现文字识别的核心组件。请不要使用系统默认的包管理器,直接下载预编译的Windows版本以获得最佳稳定性。
下载地址:https://github.com/UB-Mannheim/tesseract/wiki
进入页面后,找到"Windows (32/64 bit)"部分,下载最新的tesseract-ocr-w64-setup-5.x.x.exe安装包。
安装配置:
- 路径设置:建议安装到
C:\Program Files\Tesseract-OCR,避免路径中包含中文字符或空格。
- 语言包选择:在安装组件选择界面(Choose Components),务必展开"Additional language data",勾选"Chinese - Simplified (chi_sim)"和"English"。这是识别社保档案中文字和数字的关键。
3. 安装Python依赖库
打开命令行工具(CMD或PowerShell),依次执行以下命令安装所需的第三方库。这些库分别用于图像处理、OCR调用、Excel数据生成及正则匹配。
执行命令:
```bash
pip install pillow pytesseract pandas opencv-python numpy openpyxl
```
档案目录结构规划
为了实现自动化批量处理,请严格按照以下结构在本地创建文件夹。这不仅是规范,更是脚本正确读取和写入文件的前提。
请在D盘根目录下创建social_security_archive文件夹,内部结构如下:
- D:\social_security_archive\input_images:存放待处理的社保档案扫描件(支持JPG、PNG格式)。请将所有需要整理的图片文件放入此文件夹。
- D:\social_security_archive\output_excel:脚本运行成功后,自动生成的Excel结果表将保存在此处。
核心代码实现与逻辑解析
本部分将直接提供完整的Python脚本代码。该脚本集成了图像预处理、OCR文字提取、正则信息清洗及Excel导出功能。请将以下代码保存为archive_processor.py,并放置在D:\social_security_archive目录下。
1. 图像预处理模块
社保档案通常是扫描件,往往带有噪点。直接识别准确率较低,因此必须进行灰度化和二值化处理。代码中使用OpenCV将图片转为灰度,并使用OTSU算法自动计算二值化阈值,去除背景干扰,提升文字对比度。
2. 文本识别与信息提取模块

这是核心功能模块。脚本会指定Tesseract的安装路径,并调用image_to_string方法识别简体中文。识别出的全文本中,利用正则表达式精准提取关键字段:
- 姓名:利用
[\u4e00-\u9fa5]{2,4}匹配2到4个汉字,结合上下文定位。
- 身份证号:利用
[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]严格匹配18位身份证标准格式。
- 社保卡号:利用
\d{9,12}匹配常见的9到12位数字编号。
3. 数据汇总与导出模块
提取到的结构化数据会暂存于列表中,最后通过Pandas库转换为DataFrame对象,并调用to_excel方法导出。如果文件名包含日期,脚本还会尝试解析并归档。
完整可执行脚本
复制以下全部代码,无需任何修改,直接保存为.py文件即可使用。
```python
import os
import cv2
import numpy as np
import pytesseract
import pandas as pd
import re
from PIL import Image
- 配置区域 -
请务必将此路径修改为你电脑上Tesseract的实际安装路径
默认安装路径通常是:C:\Program Files\Tesseract-OCR\tesseract.exe
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
INPUT_DIR = 'input_images'
OUTPUT_DIR = 'output_excel'
OUTPUT_FILE = os.path.join(OUTPUT_DIR, '社保档案整理结果.xlsx')
- 核心功能函数 -
def preprocess_image(image_path):
"""
图像预处理:灰度化 + 去噪 + 二值化
目的:提高OCR识别准确率
"""
读取图片
img = cv2.imread(image_path)
if img is None:
print(f"无法读取图片: {image_path}")
return None
转为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
高斯模糊去噪
blur = cv2.GaussianBlur(gray, (3, 3), 0)
OTSU二值化(自动寻找最佳阈值)
_, binary = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
return binary
def extract_info_from_text(text):
"""
使用正则表达式从OCR识别的文本中提取关键信息
"""
data = {
'文件名': '',
'姓名': '未识别',
'身份证号': '未识别',
'社保卡号': '未识别',
'识别原文摘要': ''
}
提取身份证号 (严格匹配18位身份证)
id_pattern = r'[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]'
id_match = re.search(id_pattern, text)
if id_match:
data['身份证号'] = id_match.group()
提取社保卡号 (通常为9-12位数字,且不等于身份证号)
简单逻辑:寻找连续数字,排除身份证号
card_pattern = r'\d{9,12}'
potential_cards = re.findall(card_pattern, text)
for card in potential_cards:
if card != data['身份证号']:
data['社保卡号'] = card
break 取第一个匹配到的非身份证数字
提取姓名 (假设姓名为2-4个汉字,且出现在身份证号附近)
简单策略:查找所有2-4个汉字的组合,实际业务中可能需要更复杂的锚点定位
name_pattern = r'[\u4e00-\u9fa5]{2,4}'
names = re.findall(name_pattern, text)
if names:
这里取第一个匹配到的汉字串作为姓名,实际可根据表单位置优化
data['姓名'] = names[0]
data['识别原文摘要'] = text[:50] + '...' 截取前50字符用于校验
return data
def process_files():
"""
主处理逻辑:遍历文件夹 -> 识别 -> 提取 -> 汇总
"""
if not os.path.exists(INPUT_DIR):
print(f"错误:未找到输入文件夹 {INPUT_DIR},请在当前目录下创建它。")
return
if not os.path.exists(OUTPUT_DIR):
os.makedirs(OUTPUT_DIR)
all_results = []
files = [f for f in os.listdir(INPUT_DIR) if f.lower().endswith(('.jpg', '.png', '.jpeg'))]
print(f"开始处理,共发现 {len(files)} 个档案文件...")
for filename in files:
file_path = os.path.join(INPUT_DIR, filename)
print(f"正在处理: {filename}")
1. 预处理
processed_img = preprocess_image(file_path)
if processed_img is None:
continue
2. OCR识别 (lang='chi_sim' 指定简体中文)
psm 6 假设图片为统一的文本块
try:
text = pytesseract.image_to_string(processed_img, lang='chi_sim+eng', config='--psm 6')
except Exception as e:
print(f"识别出错: {e}")
text = ""
3. 提取信息
result = extract_info_from_text(text)
result['文件名'] = filename
all_results.append(result)
4. 导出Excel
if all_results:
df = pd.DataFrame(all_results)
调整列顺序
df = df[['文件名', '姓名', '身份证号', '社保卡号', '识别原文摘要']]
try:
df.to_excel(OUTPUT_FILE, index=False, engine='openpyxl')
print(f"\n处理完成!结果已保存至: {OUTPUT_FILE}")
except Exception as e:
print(f"保存Excel失败: {e}")
else:
print("未处理任何有效文件。")
if __name__ == "__main__":
process_files()
```
运行与结果验证
代码和环境准备就绪后,按照以下步骤执行操作,即可完成档案的自动整理。
步骤1:准备测试数据
找几张扫描好的社保申请表或缴费凭证图片(JPG或PNG格式),将它们复制到D:\social_security_archive\input_images文件夹中。确保图片中的文字清晰,特别是身份证号和姓名区域不要有严重污损。
步骤2:执行脚本
打开CMD命令行,切换到项目目录:
```bash
cd /d D:\social_security_archive
```
然后运行Python脚本:
```bash
python archive_processor.py
```
步骤3:查看输出结果
脚本运行过程中,控制台会打印正在处理的文件名。待显示“处理完成”后,打开D:\social_security_archive\output_excel目录,双击打开社保档案整理结果.xlsx。
你应该能看到一个包含五列的表格:文件名、姓名、身份证号、社保卡号以及识别原文摘要。请核对“识别原文摘要”列,确认OCR是否正确读取了图片内容。如果发现身份证号识别错误,通常是因为图片分辨率过低或存在倾斜,建议在预处理阶段增加旋转校正逻辑,或使用更高DPI扫描的图片。