一、环境准备与依赖安装
本系统采用 Python Flask 作为 Web 框架,SQLite 作为数据库,Tesseract OCR 进行档案文字识别。请确保你的操作系统已安装 Python 3.8 或更高版本。
1. 安装 Tesseract OCR 引擎
OCR 是实现档案检索的核心,必须先安装系统级的识别引擎。
Windows 用户:访问 UB Mannheim 的 Tesseract 仓库下载 Windows 安装包:https://github.com/UB-Mannheim/tesseract/wiki。下载最新版安装时,务必勾选 "Additional language data" 中的 Chinese (Simplified) 语言包,并记住安装路径(默认为 C:\Program Files\Tesseract-OCR)。
Linux 用户:执行以下命令安装引擎及中文语言包:
```bash
sudo apt-get update
sudo apt-get install tesseract-ocr tesseract-ocr-chi-sim
```
2. 配置 Python 依赖库
在项目根目录下创建 requirements.txt,直接复制以下内容。这包含了 Web 服务、图像处理及数据库连接驱动。
```text
flask==2.3.3
pytesseract==0.3.10
Pillow==10.0.0
werkzeug==2.3.7
```
打开终端,切换到项目目录,执行安装命令:
```bash
pip install -r requirements.txt
```
二、项目目录结构搭建
为了保持代码清晰,请严格按照以下结构创建文件和文件夹。在终端执行以下命令快速生成骨架:
```bash
mkdir hr_archive_system
cd hr_archive_system
mkdir uploads templates
touch app.py init_db.py
```
最终的目录结构应如下所示:
- app.py:后端核心逻辑,包含上传、识别、搜索接口。
- init_db.py:数据库初始化脚本,用于生成数据表。
- uploads/:用于存储上传的原始档案文件。
- templates/:存放 HTML 前端页面。
三、数据库设计与初始化
我们需要一个轻量级的数据库来存储档案元数据和 OCR 识别后的文本内容。SQLite 无需配置服务器,直接以文件形式存储。
打开 init_db.py,填入以下完整代码。该脚本会创建一个名为 archives 的表,包含文件名、上传时间和识别内容。
```python
import sqlite3
def init_db():
连接数据库文件,不存在则自动创建
conn = sqlite3.connect('hr_archive.db')
cursor = conn.cursor()
创建档案表
cursor.execute('''
CREATE TABLE IF NOT EXISTS archives (
id INTEGER PRIMARY KEY AUTOINCREMENT,
filename TEXT NOT NULL,
upload_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
content TEXT
)
''')
conn.commit()
conn.close()
print("数据库初始化成功,已生成 hr_archive.db 文件。")
if __name__ == '__main__':
init_db()
```
保存后,在终端运行 python init_db.py。如果看到成功提示,目录下会出现 hr_archive.db 文件。
四、后端核心逻辑开发
这是系统的核心部分,负责处理文件上传、调用 OCR 引擎提取文字以及响应搜索请求。

打开 app.py,写入以下代码。注意:如果你是 Windows 用户,请取消代码中关于 tesseract_cmd 的注释并修改为你的实际安装路径。
```python
import os
import sqlite3
from flask import Flask, render_template, request, redirect, url_for, send_from_directory
from werkzeug.utils import secure_filename
from PIL import Image
import pytesseract
app = Flask(__name__)
配置区域
UPLOAD_FOLDER = 'uploads'
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'pdf', 'tif', 'bmp'}
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.config['MAX_CONTENT_LENGTH'] = 16 1024 1024 限制上传大小为 16MB
Windows 用户必须配置此路径,Linux 用户可忽略
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
确保上传目录存在
if not os.path.exists(UPLOAD_FOLDER):
os.makedirs(UPLOAD_FOLDER)
def allowed_file(filename):
"""检查文件扩展名是否合法"""
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
def perform_ocr(file_path):
"""执行 OCR 识别,支持中英文"""
try:
使用 PIL 打开图片文件
image = Image.open(file_path)
lang='chi_sim+eng' 表示同时识别简体中文和英文
text = pytesseract.image_to_string(image, lang='chi_sim+eng')
return text
except Exception as e:
print(f"OCR Error: {e}")
return "识别失败"
@app.route('/')
def index():
"""首页:展示档案列表及搜索结果"""
query = request.args.get('q', '')
conn = sqlite3.connect('hr_archive.db')
cursor = conn.cursor()
if query:
执行模糊搜索,匹配文件名或识别内容
cursor.execute(
"SELECT FROM archives WHERE content LIKE ? OR filename LIKE ? ORDER BY upload_time DESC",
('%' + query + '%', '%' + query + '%')
)
else:
无搜索词时,显示所有记录
cursor.execute("SELECT FROM archives ORDER BY upload_time DESC")
archives = cursor.fetchall()
conn.close()
return render_template('index.html', archives=archives, query=query)
@app.route('/upload', methods=['POST'])
def upload_file():
"""处理文件上传"""
if 'file' not in request.files:
return redirect(request.url)
file = request.files['file']
if file.filename == '':
return redirect(request.url)
if file and allowed_file(file.filename):
1. 安全处理文件名并保存
filename = secure_filename(file.filename)
file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
file.save(file_path)
2. 执行 OCR 识别
print(f"正在识别文件: {filename}...")
ocr_content = perform_ocr(file_path)
3. 存入数据库
conn = sqlite3.connect('hr_archive.db')
cursor = conn.cursor()
cursor.execute("INSERT INTO archives (filename, content) VALUES (?, ?)",
(filename, ocr_content))
conn.commit()
conn.close()
print(f"文件 {filename} 处理完成。")
return redirect(url_for('index'))
@app.route('/uploads/
')
def uploaded_file(filename):
"""回显已上传的文件"""
return send_from_directory(app.config['UPLOAD_FOLDER'], filename)
if __name__ == '__main__':
启动服务,监听所有 IP,端口 5000
app.run(debug=True, host='0.0.0.0', port=5000)
```
五、前端交互页面开发
在 templates 文件夹下创建 index.html。这个页面集成了文件上传表单和搜索框,并使用表格展示档案列表。
```html
HR 数字档案馆系统
HR 数字档案馆系统
档案列表 ({{ archives|length }})
| ID |
文件名 |
上传时间 |
识别内容摘要 |
操作 |
{% for archive in archives %}
| {{ archive[0] }} |
{{ archive[1] }} |
{{ archive[2] }} |
{% if archive[3] %}
{{ archive[3] }}
{% else %}
(无文本内容)
{% endif %}
|
查看原件 |
{% else %}
| 暂无档案数据,请先上传。 |
{% endfor %}
```
六、系统运行与实操测试
代码编写完毕,现在启动系统并进行实际操作验证。
1. 启动服务
确保终端位于项目根目录,执行以下命令:
```bash
python app.py
```
当终端显示 Running on http://0.0.0.0:5000 时,说明服务已成功启动。
2. 上传测试
打开浏览器访问 http://127.0.0.1:5000。
- 准备一张图片(例如员工身份证扫描件、劳动合同 PDF 或 JPG 图片)。
- 点击页面上的“选择文件”,选中该图片。
- 点击“上传档案”按钮。
- 观察终端:你会看到 "正在识别文件..." 的日志,稍等片刻(取决于图片大小和电脑性能)。
- 观察页面:页面刷新后,下方列表会出现新上传的文件,且“识别内容摘要”栏会显示从图片中提取出的文字。
3. 检索测试
在页面右上角的搜索框中,输入刚才上传图片中包含的任意关键词(例如员工姓名“张三”或词语“劳动合同”)。
点击“搜索”,列表将只展示包含该关键词的档案记录。这证明了 OCR 提取的文字已成功存入数据库并支持检索。
七、常见故障排查
在实操过程中,可能会遇到以下两个典型问题,请按方案解决:
1. 报错:tesseract is not installed or your path is incorrect
这是最常见的路径配置问题。请检查 app.py 中的 pytesseract.pytesseract.tesseract_cmd 是否已取消注释,且路径指向你电脑上 tesseract.exe 的绝对位置。Windows 路径中通常包含 Program Files,建议在字符串前加 r 以避免转义问题。
2. 识别内容为空或乱码
如果识别结果全是乱码或为空,通常是语言包缺失。请确保 Tesseract 的 tessdata 文件夹中存在 chi_sim.traineddata 文件。如果是 Linux,请重新运行安装命令;如果是 Windows,请手动下载该文件放入 Tesseract 安装目录下的 tessdata 文件夹中。