一、技术栈选型与环境准备
事业单位档案数字化的核心难点在于批量扫描件的OCR识别与结构化存储。为了确保方案零成本且可落地,本方案采用Python作为核心开发语言,利用Tesseract OCR引擎进行文字识别,SQLite作为轻量级数据库,Flask搭建检索界面。这套组合无需购买昂贵的商业软件,且在普通办公电脑上即可运行。
必须搭建基础运行环境。请严格按照以下步骤操作,缺一不可。
1. 安装Python环境
访问Python官网下载Windows安装包。地址如下:https://www.python.org/downloads/
下载时务必勾选"Add Python to PATH"选项,这将自动配置环境变量,避免后续在命令行无法识别python命令。安装完成后,在CMD(命令提示符)中输入python --version,若显示版本号则安装成功。
2. 安装Tesseract OCR引擎
这是识别文字的核心组件。下载地址为:https://github.com/UB-Mannheim/tesseract/wiki
请下载最新的Windows installer(如tesseract-ocr-w64-setup-5.x.x.exe)。安装过程中,在"Choose Components"界面,务必展开"Additional language data",勾选Chinese (Simplified)和English,否则无法识别中文。默认安装路径通常为C:\Program Files\Tesseract-OCR,请记住此路径。
3. 安装Python依赖库
打开CMD,依次执行以下命令安装所需库:
```bash
pip install pytesseract pillow flask sqlite3
```
注意,sqlite3是Python内置库,通常无需单独安装,但如果报错请确保Python环境完整。pytesseract是Tesseract的Python接口,pillow用于处理图像,flask用于Web展示。
二、档案目录结构与预处理规范
在编写代码前,必须在本地建立标准化的文件目录。混乱的文件存放会导致程序读取失败。请在D盘根目录下创建一个名为DigitalArchive的文件夹,并在内部建立以下子目录结构:
- DigitalArchive /
- raw_scans/:存放待处理的扫描件图片(支持jpg, png, bmp格式)。
- processed_text/:存放识别成功后的TXT文本文件。
- database/:存放SQLite数据库文件。
- static/:存放Web界面所需的CSS样式文件。
- templates/:存放HTML模板文件。
- app.py:核心运行脚本。
将所有需要数字化的档案图片统一放入raw_scans文件夹中。为了提高识别率,建议文件命名带有编号,例如2023_001_人事档案.jpg。
三、核心OCR识别与入库脚本开发
这是整个方案的核心。我们将编写一个Python脚本,自动扫描raw_scans文件夹中的图片,调用Tesseract进行识别,将结果存入TXT文件,并将元数据(文件名、识别内容、时间)写入SQLite数据库。
请在DigitalArchive目录下创建app.py,并完整复制以下代码。注意修改代码中的tesseract_cmd路径以匹配你的实际安装位置。
```python
import os
import sqlite3
import datetime
from PIL import Image
import pytesseract
from flask import Flask, render_template, request
配置区域
如果你的Tesseract没有安装在默认路径,请务必修改下面这行引号内的路径
Windows默认路径示例: r'C:\Program Files\Tesseract-OCR\tesseract.exe'
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
SOURCE_DIR = 'raw_scans'
OUTPUT_DIR = 'processed_text'
DB_PATH = os.path.join('database', 'archives.db')
app = Flask(__name__)
数据库初始化
def init_db():
if not os.path.exists('database'):
os.makedirs('database')
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()
创建档案表,包含文件名、识别内容、处理时间
cursor.execute('''
CREATE TABLE IF NOT EXISTS archives (
id INTEGER PRIMARY KEY AUTOINCREMENT,
filename TEXT NOT NULL,
content TEXT,
process_date TEXT
)
''')
conn.commit()
conn.close()
核心处理函数
def process_files():
if not os.path.exists(OUTPUT_DIR):
os.makedirs(OUTPUT_DIR)
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()
files = [f for f in os.listdir(SOURCE_DIR) if f.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp'))]
for filename in files:
file_path = os.path.join(SOURCE_DIR, filename)
print(f"正在处理: {filename}")
try:
打开图片并进行灰度处理,提高识别率
img = Image.open(file_path)
img = img.convert('L')
调用Tesseract识别,lang='chi_sim+eng'表示中英文混合识别
text = pytesseract.image_to_string(img, lang='chi_sim+eng')
保存TXT文件
txt_name = os.path.splitext(filename)[0] + '.txt'
txt_path = os.path.join(OUTPUT_DIR, txt_name)
with open(txt_path, 'w', encoding='utf-8') as f:
f.write(text)
写入数据库
current_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
cursor.execute("INSERT INTO archives (filename, content, process_date) VALUES (?, ?, ?)",
(filename, text, current_time))
conn.commit()
print(f"完成: {filename}")
except Exception as e:
print(f"处理 {filename} 失败: {e}")
conn.close()
Web路由部分
@app.route('/')
def index():
return render_template('index.html')
@app.route('/search')
def search():
query = request.args.get('q', '')
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()
if query:
使用SQL LIKE进行模糊查询
cursor.execute("SELECT filename, content, process_date FROM archives WHERE content LIKE ?", ('%' + query + '%',))
else:
cursor.execute("SELECT filename, content, process_date FROM archives")
results = cursor.fetchall()
conn.close()
return render_template('results.html', results=results, query=query)
if __name__ == '__main__':
首次运行初始化数据库
init_db()
如果需要批量处理图片,取消下面这行的注释,处理完成后建议注释掉以免重复处理
process_files()
app.run(debug=True, port=5000)
```
四、Web检索界面搭建
为了让档案能被搜索,我们需要创建两个简单的HTML文件。Flask会自动渲染这些文件。
1. 创建主页

在templates文件夹下创建index.html:
```html
档案数字化检索系统
事业单位档案检索
```
2. 创建结果页
在templates文件夹下创建results.html:
```html
搜索结果
搜索结果: {{ query }}
返回首页
{% for row in results %}
文件名: {{ row[0] }}
处理时间: {{ row[2] }}
摘要内容: {{ row[1][:200] }}...
{% else %}
未找到相关档案。
{% endfor %}
```
五、执行步骤与常见问题解决
代码与文件准备就绪后,按照以下顺序启动系统:
1. 执行数字化处理
打开app.py,找到代码底部的if __name__ == '__main__':部分。将process_files()这一行的注释符号去掉。保存文件。
在CMD中进入DigitalArchive目录,执行命令:
```bash
python app.py
```
此时控制台会输出"正在处理..."等日志。待所有图片处理完毕,按Ctrl+C停止程序。然后务必将process_files()这行重新加上注释,防止每次启动Web服务都重复处理图片。
2. 启动Web服务
再次执行python app.py。打开浏览器,访问 http://127.0.0.1:5000。输入关键词即可看到检索结果。
3. 常见报错处理
- 报错:tesseract is not installed or it's not in your path
原因:Python找不到Tesseract程序。解决:检查代码中pytesseract.pytesseract.tesseract_cmd的路径是否正确,必须指向tesseract.exe这个文件,而不是文件夹。
- 报错:FileNotFoundError: [Errno 2] No such file or directory: 'raw_scans'
原因:目录结构不完整。解决:确保在DigitalArchive下手动创建了raw_scans等所有文件夹。
- 识别结果全是乱码
原因:未安装中文语言包。解决:重新运行Tesseract安装包,确保勾选了Chinese (Simplified)语言数据。