零基础搭建档案整理文书系统全流程实操
一、系统核心功能与技术选型
本文将指导你从零构建一个基于Python Flask的轻量级档案整理文书系统。该系统无需配置复杂的数据库服务,直接使用SQLite进行数据存储,并集成Tesseract OCR引擎实现图片文字自动识别。系统具备以下核心功能:支持图片/PDF上传、自动OCR文字提取、档案元数据手动录入、全文检索以及批量导出功能。
二、开发环境准备与依赖安装
在开始编写代码前,必须严格配置以下环境,任何环节缺失都会导致程序无法运行。
1. 安装Python环境
确保系统已安装Python 3.8或更高版本。打开命令行终端,输入以下命令检查版本:
python --version
若未安装,请前往Python官网下载对应操作系统的安装包并安装,安装时务必勾选"Add Python to PATH"。
2. 安装Tesseract OCR引擎
这是实现文书自动识别的关键组件。
- Windows用户:访问 UB Mannheim Tesseract Wiki 下载tesseract-ocr-w64-setup-5.x.x.exe,安装时务必勾选所有语言包(包括chi_sim简体中文),并记住安装路径(默认为
C:\Program Files\Tesseract-OCR\tesseract.exe)。 - MacOS用户:在终端执行
brew install tesseract tesseract-lang。 - Linux用户:在终端执行
sudo apt install tesseract-ocr tesseract-ocr-chi-sim。
3. 安装Python依赖库
在项目目录下创建requirements.txt文件,并填入以下内容:
flask==2.3.3 pytesseract==0.3.10 Pillow==10.0.0 werkzeug==2.3.7 pdf2image==1.16.3
在终端执行以下命令完成安装:
pip install -r requirements.txt
三、后端核心逻辑开发
创建项目目录结构如下:

archive_system/ ├── app.py 主程序入口 ├── init_db.py 数据库初始化脚本 ├── templates/ 前端模板目录 │ └── index.html ├── static/ 静态文件目录 │ ├── uploads/ 上传文件存储 │ └── exports/ 导出文件存储 └── archive.db SQLite数据库文件(自动生成)
1. 数据库初始化
创建init_db.py,用于建立档案表结构。执行此脚本将生成archive.db文件。
import sqlite3
def init_db():
conn = sqlite3.connect('archive.db')
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS documents (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
category TEXT,
file_path TEXT,
ocr_content TEXT,
upload_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
''')
conn.commit()
conn.close()
print("数据库初始化完成。")
if __name__ == '__main__':
init_db()
运行命令:python init_db.py。
2. 主程序逻辑编写
创建app.py,这是系统的核心控制器,包含文件上传、OCR识别、数据存储及检索接口。注意:Windows用户需修改下方代码中的tesseract_cmd路径。
import os
import sqlite3
from flask import Flask, render_template, request, jsonify, send_from_directory
from werkzeug.utils import secure_filename
from PIL import Image
import pytesseract
import pdf2image
from datetime import datetime
app = Flask(__name__)
配置项
UPLOAD_FOLDER = 'static/uploads'
EXPORT_FOLDER = 'static/exports'
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'pdf'}
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.config['MAX_CONTENT_LENGTH'] = 16 1024 1024 限制上传大小为16MB
关键配置:请根据实际安装路径修改
如果是Windows,取消下面这行的注释并修改路径,Mac/Linux留空
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
确保目录存在
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
os.makedirs(EXPORT_FOLDER, exist_ok=True)
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
def get_db_connection():
conn = sqlite3.connect('archive.db')
conn.row_factory = sqlite3.Row
return conn
def perform_ocr(file_path):
"""执行OCR识别,支持图片和PDF"""
text = ""
try:
if file_path.lower().endswith('.pdf'):
将PDF转换为图片列表
pages = pdf2image.convert_from_path(file_path)
for page in pages:
text += pytesseract.image_to_string(page, lang='chi_sim+eng') + "\n"
else:
直接处理图片
img = Image.open(file_path)
text = pytesseract.image_to_string(img, lang='chi_sim+eng')
except Exception as e:
print(f"OCR Error: {e}")
text = "识别失败"
return text
@app.route('/')
def index():
return render_template('index.html')
@app.route('/upload', methods=['POST'])
def upload_file():
if 'file' not in request.files:
return jsonify({'error': '无文件上传'}), 400
file = request.files['file']
title = request.form.get('title', '未命名文档')
category = request.form.get('category', '未分类')
if file.filename == '':
return jsonify({'error': '未选择文件'}), 400
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
添加时间戳防止重名
timestamp = datetime.now().strftime('%Y%m%d%H%M%S')
filename = f"{timestamp}_{filename}"
filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
file.save(filepath)
执行OCR识别
ocr_text = perform_ocr(filepath)
存入数据库
conn = get_db_connection()
conn.execute('INSERT INTO documents (title, category, file_path, ocr_content) VALUES (?, ?, ?, ?)',
(title, category, filepath, ocr_text))
conn.commit()
conn.close()
return jsonify({'success': True, 'message': '上传并识别成功'})
return jsonify({'error': '文件格式不支持'}), 400
@app.route('/search')
def search():
query = request.get('q', '')
conn = get_db_connection()
if query:
cursor = conn.execute('SELECT FROM documents WHERE title LIKE ? OR ocr_content LIKE ? ORDER BY upload_date DESC',
('%' + query + '%', '%' + query + '%'))
else:
cursor = conn.execute('SELECT FROM documents ORDER BY upload_date DESC')
documents = cursor.fetchall()
conn.close()
result_list = []
for doc in documents:
result_list.append({
'id': doc['id'],
'title': doc['title'],
'category': doc['category'],
'upload_date': doc['upload_date'],
'content_preview': doc['ocr_content'][:100] + '...' if len(doc['ocr_content']) > 100 else doc['ocr_content']
})
return jsonify(result_list)
@app.route('/download/')
def download_file(doc_id):
conn = get_db_connection()
doc = conn.execute('SELECT FROM documents WHERE id = ?', (doc_id,)).fetchone()
conn.close()
if doc:
return send_from_directory(os.path.dirname(doc['file_path']), os.path.basename(doc['file_path']), as_attachment=True)
return "文件未找到", 404
if __name__ == '__main__':
app.run(debug=True, port=5000)
四、前端交互界面开发
在templates目录下创建index.html。该页面集成了文件上传表单、搜索栏以及档案列表展示,采用原生JavaScript处理AJAX请求,无需额外安装前端框架。
档案整理文书系统 档案整理文书系统
文书归档
ID 标题 分类 OCR内容预览 上传时间 操作
五、系统运行与实操验证
完成代码编写后,按照以下步骤启动系统并进行实际操作。
1. 启动服务
在终端确保位于项目根目录下,执行:
python app.py
终端显示Running on http://127.0.0.1:5000即代表启动成功。
2. 上传与识别测试
- 打开浏览器:访问
http://127.0.0.1:5000。 - 准备素材:找一张包含中文文字的图片(如扫描件)或一份文字型PDF。
- 填写表单:点击“选择文件”上传素材,输入标题(如“2023年度合同”),选择分类“合同文件”。
- 提交处理:点击“上传并识别”按钮。此时前端会发送POST请求,后端接收文件后调用Tesseract引擎进行OCR提取。
- 观察结果:上传成功后,下方列表会自动刷新。你将看到“OCR内容预览”列中显示了图片中的文字内容。
3. 全文检索验证
在搜索框中输入刚才上传文档标题中的某个词,或者OCR识别结果中的任意一段文字。点击搜索,列表将仅展示匹配的档案项。这证明了系统已成功将非结构化的图片数据转化为可搜索的结构化数据。
六、常见故障排查
在实操过程中,若遇到报错,请按以下方案排查:
- 报错:'tesseract' is not recognized...
这是最常见的问题。说明系统找不到Tesseract程序。请检查
app.py中pytesseract.pytesseract.tesseract_cmd是否已取消注释并指向了正确的绝对路径。Windows路径前需加r以避免转义