网站首页/ 信息中心/ 档案百科/

手把手搭建电子档案系统,Python实战案例全流程

发布时间:2026年08月29日 15:10:26 浏览量:0

一、环境准备与依赖安装

本案例将基于Python环境,利用Flask框架搭建一个具备OCR识别功能的轻量级电子档案管理系统。系统支持图片上传、自动文字识别、元数据存储及全文检索。所有操作均在Linux环境(Ubuntu/CentOS)下验证通过,Windows用户需自行调整Tesseract安装路径。

确保系统中已安装Python 3.8及以上版本。接着,安装OCR核心引擎Tesseract,这是实现图片转文字的关键组件。执行以下命令完成系统依赖安装:

sudo apt-get update
sudo apt-get install tesseract-ocr tesseract-ocr-chi-sim poppler-utils

上述命令中,tesseract-ocr是基础引擎,tesseract-ocr-chi-sim是中文语言包,poppler-utils用于后续处理PDF文件。安装完成后,使用tesseract --version验证是否成功。

随后,创建项目目录并安装Python依赖库。新建一个名为digital_archive的文件夹,进入该目录并创建虚拟环境:

mkdir digital_archive
cd digital_archive
python3 -m venv venv
source venv/bin/activate

在虚拟环境中激活后,安装所需的Python包:

pip install flask pytesseract pillow sqlite3 utils

这里,Flask负责Web服务,pytesseract是Tesseract的Python接口,Pillow用于图像处理,sqlite3作为内置数据库无需额外安装。

二、项目目录结构规划

为了保证代码的可维护性,请严格按照以下结构创建文件和文件夹:

digital_archive/
├── app.py               主程序入口
├── init_db.py           数据库初始化脚本
├── templates/           HTML模板目录
│   ├── index.html       首页及上传界面
│   └── search.html      搜索结果页面
├── static/              静态文件目录
│   └── uploads/         存放上传的档案文件
└── archive.db           自动生成的SQLite数据库文件

执行mkdir -p templates static/uploads命令创建上述目录。

三、数据库设计与初始化

我们需要一个数据库来存储档案的元数据(文件名、上传时间、识别出的文本内容)。创建init_db.py文件,并写入以下完整代码:

import sqlite3
def init_db():
conn = sqlite3.connect('archive.db')
cursor = conn.cursor()
创建档案表,包含ID、文件名、识别文本、上传时间
cursor.execute('''
CREATE TABLE IF NOT EXISTS documents (
id INTEGER PRIMARY KEY AUTOINCREMENT,
filename TEXT NOT NULL,
ocr_text TEXT,
upload_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
''')
conn.commit()
conn.close()
print("数据库初始化完成,数据库文件为 archive.db")
if __name__ == '__main__':
init_db()

保存文件后,在终端执行python init_db.py。如果当前目录下生成了archive.db文件,说明数据库创建成功。

四、核心后端逻辑开发

这是整个系统的核心部分,负责处理文件上传、调用OCR引擎并将结果存入数据库。创建app.py,代码如下:

import os
import sqlite3
from flask import Flask, render_template, request, redirect, url_for, flash
from werkzeug.utils import secure_filename
from PIL import Image
import pytesseract
app = Flask(__name__)
app.secret_key = 'your_secret_key_here'   用于Flash消息
app.config['UPLOAD_FOLDER'] = 'static/uploads'
app.config['ALLOWED_EXTENSIONS'] = {'png', 'jpg', 'jpeg', 'gif', 'pdf', 'tif'}
确保上传目录存在
os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1].lower() in app.config['ALLOWED_EXTENSIONS']
def get_db_connection():
conn = sqlite3.connect('archive.db')
conn.row_factory = sqlite3.Row
return conn
@app.route('/')
def index():
conn = get_db_connection()
获取最近上传的10条档案记录
docs = conn.execute('SELECT  FROM documents ORDER BY upload_date DESC LIMIT 10').fetchall()
conn.close()
return render_template('index.html', docs=docs)
@app.route('/upload', methods=['POST'])
def upload_file():
if 'file' not in request.files:
flash('没有文件部分')
return redirect(request.url)
file = request.files['file']
if file.filename == '':
'':
flash('未选择文件')
return redirect(request.url)
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
file.save(filepath)
执行OCR识别
try:
指定中文语言包,如果图片是英文,改为 'eng'
text = pytesseract.image_to_string(Image.open(filepath), lang='chi_sim')
except Exception as e:
flash(f'OCR识别失败: {str(e)}')
text = ""
存入数据库
conn = get_db_connection()
conn.execute('INSERT INTO documents (filename, ocr_text) VALUES (?, ?)',
(filename, text))
conn.commit()
conn.close()
flash('档案上传并识别成功!')
return redirect(url_for('index'))
else:
flash('不支持的文件格式')
return redirect(url_for('index'))
@app.route('/search')
def search():
query = request.args.get('q', '')
results = []
if query:
conn = get_db_connection()
使用LIKE进行模糊查询
results = conn.execute('SELECT  FROM documents WHERE ocr_text LIKE ? OR filename LIKE ?',
('%' + query + '%', '%' + query + '%')).fetchall()
conn.close()
return render_template('search.html', query=query, results=results)
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=5000)

注意:代码中lang='chi_sim'指定了使用简体中文识别库。如果识别速度慢或报错,请检查第一步中Tesseract语言包是否正确安装。

五、前端交互页面实现

手把手搭建电子档案系统,Python实战案例全流程

我们需要两个HTML页面来支撑用户交互。首先是首页templates/index.html,包含上传表单和最近记录列表:





电子档案管理系统



电子档案管理系统

上传新档案

{% with messages = get_flashed_messages() %} {% if messages %}
{{ messages[0] }}
{% endif %} {% endwith %}

最近上传档案

{% for doc in docs %} {% endfor %}
ID 文件名 识别内容预览 上传时间
{{ doc.id }} {{ doc.filename }} {{ doc.ocr_text[:50] }}... {{ doc.upload_date }}

前往搜索页面

接着是搜索页面templates/search.html,用于展示检索结果:





档案检索



档案全文检索

{% if query %}

找到 {{ results|length }} 条关于 "{{ query }}" 的结果:

{% for doc in results %}

{{ doc.filename }}

上传时间: {{ doc.upload_date }}

{{ doc.ocr_text }}

{% endfor %} {% endif %}

返回首页

六、系统运行与功能验证

所有代码准备就绪后,启动Flask开发服务器:

python app.py

终端显示Running on http://0.0.0.0:5000即表示启动成功。此时,打开浏览器访问http://localhost:5000(如果是远程服务器,请替换为对应IP)。

验证步骤一:上传与OCR
准备一张包含文字的图片(如扫描件或截图)。在首页点击“选择文件”,上传该图片。系统会自动跳转,如果看到提示“档案上传并识别成功!”,且下方列表中出现了该文件名和部分文字预览,说明OCR功能正常。

验证步骤二:全文检索
点击页面底部的“前往搜索页面”。在搜索框输入图片中包含的一个特定词汇(例如“合同”或“发票”)。点击搜索,如果系统返回了对应的档案条目,并展示了完整的识别文本,说明检索功能正常。

验证步骤三:数据持久化
停止服务器(Ctrl+C),重新运行python app.py。刷新浏览器页面,确认之前上传的档案记录依然存在,这证明SQLite数据库读写无误。

至此,一个具备核心功能的电子档案管理系统已完全落地。该系统虽然轻量,但完整覆盖了电子档案管理的生命周期:采集(上传)、处理(OCR)、存储(SQLite)、利用(检索)。读者可基于此框架,通过添加用户认证模块或对接对象存储(如MinIO)进一步扩展为生产级应用。

文教体育用品企业档案整理:从乱炖到满汉全席的逆袭之路
文教体育用品企业档案整理:从乱炖到满汉全席的逆袭之路
哎,说到档案整理,我猜你脑子里现在可能是一团乱麻,或者像我家过年大扫除时从床底下扒拉出来的那个塞满了各种过期单据、老照片和不明小物件的破纸箱——东西都知道重要,但真上手,只想原地摆烂。尤其是咱们文教体...
2026年08月29日 15:10:26
微信咨询
电话联系
QQ客服
微信咨询一对一服务
服务热线: 028-8744 4417
QQ客服: 2305721818