在进行焦作档案整理的数字化操作前,必须先搭建稳定的技术环境。本方案基于Python 3.9及以上版本构建,利用OpenCV进行图像预处理,使用Tesseract-OCR进行文字识别。
1. 安装Python环境
请确保系统已安装Python 3.9或3.10版本。如果未安装,请直接访问Python官网下载Windows installer版安装包。安装时务必勾选"Add Python to PATH"选项。
2. 安装Tesseract-OCR引擎
这是识别中文档案的核心组件。访问UB Mannheim的Tesseract下载页面:https://github.com/UB-Mannheim/tesseract/wiki。下载tesseract-ocr-w64-setup-5.3.0.20221214.exe(64位版本)。安装过程中,在"Choose Components"界面务必勾选Chinese (Simplified)和Chinese (Simplified, Vertical)语言数据包,否则无法识别中文内容。默认安装路径建议保持为C:\Program Files\Tesseract-OCR。
3. 安装Python依赖库
打开命令行工具(CMD或PowerShell),依次执行以下命令安装所需库:
pip install opencv-python
pip install pytesseract
pip install Pillow
pip install pandas
pip install shutil
4. 配置环境变量
为防止程序运行报错,需将Tesseract添加到系统环境变量。右键"此电脑" -> 属性 -> 高级系统设置 -> 环境变量 -> 系统变量 -> Path -> 编辑 -> 新建,输入:C:\Program Files\Tesseract-OCR。重启命令行使配置生效。
为了实现批量自动化处理,请在本地D盘或工作目录下创建如下标准文件夹结构。这种结构能够有效分离原始档案、处理中间件和最终成果。
D:/Jiaozuo_Archives/
├── raw_scans/ 存放原始扫描件(JPG/PNG/PDF)
├── processed_images/ 存放经过降噪、二值化处理的图片
├── output_data/ 存放识别后的Excel/CSV数据
└── archives_final/ 存放按年份和分类归档后的文件
├── 2022/
└── 2023/
焦作地区部分早期档案可能存在纸质泛黄、字迹模糊或扫描倾斜的问题。直接识别准确率极低,必须进行灰度化、二值化和降噪处理。创建文件preprocess.py,写入以下代码:

import cv2
import os
import numpy as np
def process_image(input_path, output_path):
读取图片
image = cv2.imread(input_path)
1. 转灰度图,减少计算量
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
2. 二值化处理,使用Otsu算法自动寻找阈值,增强黑白对比
这对于盖有红色印章的档案尤为重要,能去除印章干扰
_, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
3. 降噪处理,去除扫描产生的噪点
使用3x3的高斯模糊
denoised = cv2.GaussianBlur(binary, (3, 3), 0)
4. 保存处理后的图片
cv2.imwrite(output_path, denoised)
批量处理函数
def batch_process(input_dir, output_dir):
if not os.path.exists(output_dir):
os.makedirs(output_dir)
for filename in os.listdir(input_dir):
if filename.endswith(('.jpg', '.jpeg', '.png')):
input_file = os.path.join(input_dir, filename)
output_file = os.path.join(output_dir, f"processed_{filename}")
process_image(input_file, output_file)
print(f"已处理: {filename}")
if __name__ == "__main__":
请根据实际路径修改
batch_process("D:/Jiaozuo_Archives/raw_scans", "D:/Jiaozuo_Archives/processed_images")
运行此脚本后,processed_images文件夹中将生成高对比度的黑白图片,大幅提升OCR识别率。
创建文件ocr_extract.py。本步骤将识别图片中的文字,并利用正则表达式提取关键的"档案号"和"日期"信息。针对中文环境,需指定lang='chi_sim'。
import pytesseract
import cv2
import os
import re
import pandas as pd
from PIL import Image
如果未配置环境变量,需在此处显式指定tesseract.exe路径
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
def extract_info_from_image(image_path):
打开图片
img = Image.open(image_path)
使用Tesseract识别,配置PSM 6模式(假设为单行文本块,提高准确率)
config='--psm 6' 表示将图片视为统一文本块
text = pytesseract.image_to_string(img, lang='chi_sim', config='--psm 6')
清理换行符和多余空格
clean_text = text.replace('\n', ' ').replace('\r', '').strip()
正则提取逻辑(需根据焦作档案实际格式调整)
假设档案号格式如:焦档[2022]001号
archive_id_pattern = re.compile(r'焦档\[\d{4}\]\d+号')
假设日期格式如:2022年05月20日
date_pattern = re.compile(r'\d{4}年\d{1,2}月\d{1,2}日')
archive_id = archive_id_pattern.search(clean_text)
date = date_pattern.search(clean_text)
return {
'filename': os.path.basename(image_path),
'full_text': clean_text,
'archive_id': archive_id.group() if archive_id else "未识别到档案号",
'date': date.group() if date else "未识别到日期"
}
def run_ocr_batch(image_dir, output_excel):
data_list = []
for filename in os.listdir(image_dir):
if filename.startswith("processed_"):
file_path = os.path.join(image_dir, filename)
print(f"正在识别: {filename}")
info = extract_info_from_image(file_path)
data_list.append(info)
保存为Excel
df = pd.DataFrame(data_list)
df.to_excel(output_excel, index=False, engine='openpyxl')
print(f"识别完成,数据已保存至: {output_excel}")
if __name__ == "__main__":
run_ocr_batch("D:/Jiaozuo_Archives/processed_images", "D:/Jiaozuo_Archives/output_data/archives_info.xlsx")
注意:正则表达式部分(archive_id_pattern)必须根据您手头实际的档案样式进行修改。建议先打印出clean_text查看识别效果,再编写匹配规则。
识别完成后,最后一步是根据提取的"年份"和"档案号"将文件移动到对应的目录,并重命名,实现标准化归档。创建文件auto_archive.py:
import os
import shutil
import pandas as pd
import re
def archive_files(excel_path, source_img_dir, target_base_dir):
读取之前生成的Excel数据
df = pd.read_excel(excel_path, engine='openpyxl')
for index, row in df.iterrows():
old_filename = row['filename']
archive_id = row['archive_id']
date_str = row['date']
源文件路径
src_path = os.path.join(source_img_dir, old_filename)
if not os.path.exists(src_path):
print(f"源文件不存在,跳过: {old_filename}")
continue
提取年份用于创建子文件夹
尝试从日期字符串中提取年份
year_match = re.search(r'(\d{4})', date_str)
if year_match:
year_folder = year_match.group(1)
else:
如果日期没识别出来,尝试从档案号提取
id_year_match = re.search(r'\[(\d{4})\]', archive_id)
year_folder = id_year_match.group(1) if id_year_match else "unknown_year"
目标文件夹路径
target_dir = os.path.join(target_base_dir, year_folder)
if not os.path.exists(target_dir):
os.makedirs(target_dir)
构建新文件名:档案号_原文件名
处理档案号中的特殊字符,防止文件名非法
safe_archive_id = archive_id.replace('[', '(').replace(']', ')').replace(' ', '')
new_filename = f"{safe_archive_id}_{old_filename}"
dst_path = os.path.join(target_dir, new_filename)
移动文件
try:
shutil.move(src_path, dst_path)
print(f"已归档: {old_filename} -> {year_folder}/{new_filename}")
except Exception as e:
print(f"移动文件失败: {old_filename}, 错误: {e}")
if __name__ == "__main__":
archive_files(
"D:/Jiaozuo_Archives/output_data/archives_info.xlsx",
"D:/Jiaozuo_Archives/processed_images",
"D:/Jiaozuo_Archives/archives_final"
)
为了方便日常使用,创建一个main.py将上述步骤串联。只需运行此文件,即可完成从扫描件到归档的全过程。
import os
import subprocess
import sys
def run_script(script_name):
print(f" 开始执行: {script_name} ")
try:
subprocess.run([sys.executable, script_name], check=True)
except subprocess.CalledProcessError as e:
print(f"执行 {script_name} 时出错: {e}")
sys.exit(1)
if __name__ == "__main__":
BASE_DIR = "D:/Jiaozuo_Archives"
确保所有脚本都在同一目录下
os.chdir(BASE_DIR) 切换到工作目录
1. 图像预处理
run_script("preprocess.py")
2. OCR识别
run_script("ocr_extract.py")
3. 自动归档
run_script("auto_archive.py")
print("=== 焦作档案整理流程全部完成 ===")
在实操过程中,您可能会遇到以下问题,请对照解决方案排查:
1. pytesseract is not installed or is not in your path
这是最常见的错误。即使安装了软件,Python也可能找不到。请检查pytesseract.pytesseract.tesseract_cmd是否在代码中被正确赋值为绝对路径。路径中最好不要包含中文或空格。
2. 识别结果是乱码
这通常是因为Tesseract版本与语言数据包版本不匹配,或者没有下载chi_sim。请重新运行安装程序,确保"Chinese (Simplified)"被勾选。另外,检查图片分辨率,建议扫描件DPI不低于300。
3. date_pattern无法匹配日期
如果档案格式不统一,建议放宽正则规则。例如,只匹配\d{4}提取年份,或者修改OCR配置参数--psm。默认--psm 6适合单行文本,如果是整页布局,可以尝试--psm 3或--psm 4。