在进行济宁档案整理的数字化操作前,必须先配置好Python运行环境及OCR识别引擎。本方案基于Python 3.9环境,利用Tesseract-OCR进行文字识别,实现档案内容的自动提取与归档。
1. 安装Python环境
前往Python官网下载Windows x64可执行安装包。安装时务必勾选"Add Python to PATH"选项,以便在命令行直接调用。下载地址:https://www.python.org/downloads/release/python-3913/
2. 安装Tesseract-OCR引擎
这是识别的核心组件。下载Tesseract for Windows版本,建议安装5.3.0及以上版本以获得更好的中文识别率。下载地址:https://github.com/UB-Mannheim/tesseract/wiki
安装过程中,在"Choose Components"界面务必勾选Chinese (Simplified)语言包,否则无法识别中文档案。安装完成后,将安装路径(默认为C:\Program Files\Tesseract-OCR\tesseract.exe)添加至系统环境变量Path中。
3. 安装Python依赖库
打开CMD或PowerShell,执行以下命令安装必要的图像处理与文件操作库:
```bash pip install pytesseract pillow opencv-python ```为了确保整理后的档案符合济宁地区档案管理规范,我们需要在本地建立一个标准化的目录结构。请手动在D盘根目录下创建以下文件夹结构:
在02_已归档档案下,我们将按照“年度-保管期限-问题”的层级自动生成文件夹。例如:2023\永久\文书档案\。
原始扫描件往往存在噪点、倾斜或模糊问题,直接识别会导致准确率下降。我们需要编写一个预处理函数,对图像进行灰度化、二值化和去噪处理。
1. 图像预处理逻辑

使用OpenCV对图像进行优化。以下是具体的预处理代码实现:
```python import cv2 import numpy as np def preprocess_image(image_path): 读取图像 img = cv2.imread(image_path) 转为灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 二值化处理,使用OTSU自动寻找阈值 _, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) 去噪处理 denoised = cv2.medianBlur(binary, 5) return denoised ```2. OCR文字提取配置
配置pytesseract以调用Tesseract引擎,并指定中文语言数据。为了提高档案标题和文号的识别准确率,我们需要设置白名单字符变量(针对数字和常见汉字)。
```python import pytesseract from PIL import Image 指定tesseract.exe的绝对路径,请根据实际安装位置修改 pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' def extract_text_from_image(image_cv): 将OpenCV图像格式转换为PIL格式 pil_img = Image.fromarray(image_cv) 配置识别参数:使用简体中文,识别页码 custom_config = r'--oem 3 --psm 6 -l chi_sim' 执行识别 text = pytesseract.image_to_string(pil_img, config=custom_config) return text ```本模块是核心,负责解析OCR提取的文本,根据济宁档案整理规则提取“年度”、“保管期限”和“文件题名”,并移动文件到对应目录。
1. 档案元数据解析
假设档案标题中包含年份信息,或者OCR能识别出“2023年”字样。我们需要编写正则表达式来提取这些关键信息。
```python import re import os import shutil import datetime def parse_archive_metadata(text): 默认值设置 year = str(datetime.datetime.now().year) retention = "10年" 默认保管期限 title = "未命名文件" 提取年份 (匹配 1990-2099 年) year_match = re.search(r'(19|20)\d{2}', text) if year_match: year = year_match.group(0) 提取保管期限 (匹配永久、30年、10年) if "永久" in text: retention = "永久" elif "30年" in text: retention = "30年" 提取题名 (简单策略:取识别文本的前20个字符作为文件夹名,去除特殊符号) 实际生产中应根据档案页眉特定格式提取 lines = text.split('\n') for line in lines: if len(line) > 5: 过滤掉噪点行 title = re.sub(r'[\\/?:"<>|]', '', line.strip())[:15] 去除文件名非法字符 break return year, retention, title ```2. 文件移动与目录创建
根据解析出的元数据,在目标目录创建结构并移动文件。
```python def move_file_to_archive(source_path, year, retention, title): base_output = r"D:\JiNang_Archives\02_已归档档案" 构建目标文件夹路径:年度/保管期限/题名 target_dir = os.path.join(base_output, year, retention, title) 如果目录不存在则创建 if not os.path.exists(target_dir): os.makedirs(target_dir) 获取原文件名 filename = os.path.basename(source_path) target_path = os.path.join(target_dir, filename) 移动文件 try: shutil.move(source_path, target_path) print(f"成功: {filename} -> {target_dir}") return True except Exception as e: print(f"失败: {filename}, 错误: {str(e)}") return False ```将上述代码片段整合为一个完整的Python脚本archive_organizer.py,并放置在D:\JiNang_Archives目录下。
1. 完整脚本代码
```python import cv2 import numpy as np import pytesseract from PIL import Image import re import os import shutil import datetime 配置区域 INPUT_DIR = r"D:\JiNang_Archives\01_待处理档案" OUTPUT_DIR = r"D:\JiNang_Archives\02_已归档档案" LOG_DIR = r"D:\JiNang_Archives\03_日志记录" TESSERACT_PATH = r'C:\Program Files\Tesseract-OCR\tesseract.exe' 初始化配置 pytesseract.pytesseract.tesseract_cmd = TESSERACT_PATH if not os.path.exists(LOG_DIR): os.makedirs(LOG_DIR) def process_single_file(file_path): try: 1. 预处理 img_processed = preprocess_image(file_path) 2. OCR识别 text_content = extract_text_from_image(img_processed) 3. 解析元数据 year, retention, title = parse_archive_metadata(text_content) 4. 移动文件 status = move_file_to_archive(file_path, year, retention, title) 5. 记录识别文本(用于人工复核) log_name = os.path.basename(file_path) + ".txt" log_path = os.path.join(LOG_DIR, log_name) with open(log_path, 'w', encoding='utf-8') as f: f.write(f"识别路径: {file_path}\n") f.write(f"归档路径: {year}/{retention}/{title}\n") f.write("-" 20 + "\n") f.write(text_content) except Exception as e: print(f"处理文件 {file_path} 发生异常: {e}") def main(): files = [f for f in os.listdir(INPUT_DIR) if f.lower().endswith(('.jpg', '.png', '.jpeg'))] print(f"检测到 {len(files)} 个待处理文件。") for filename in files: full_path = os.path.join(INPUT_DIR, filename) print(f"正在处理: {filename}...") process_single_file(full_path) print("所有文件处理完毕。") if __name__ == "__main__": main() ```2. 执行步骤
D:\JiNang_Archives\01_待处理档案文件夹。cd D:\JiNang_Archives
python archive_organizer.py
3. 结果验证与修正
脚本执行完毕后,检查02_已归档档案目录。文件将按照“年份\保管期限\题名”的结构自动归档。如果发现OCR识别错误导致归档路径不准确,可查看03_日志记录中的txt文件,人工核对识别内容,并手动修正文件夹名称。对于识别率极低的文件,建议检查扫描件清晰度或重新调整二值化阈值参数。