平顶山档案培训实操:零基础搭建电子档案检索系统
一、环境准备与依赖安装
在开始构建电子档案检索系统之前,必须先配置好基础的运行环境。本系统基于Python开发,利用Flask作为Web框架,结合Tesseract OCR实现档案内容的文字识别,确保扫描件也能被检索。
1. 安装Python环境
请确保你的系统已安装Python 3.9或更高版本。打开终端或命令提示符,输入以下命令检查版本:
```bash python --version ```如果未安装,请直接访问Python官网下载对应操作系统的安装包:https://www.python.org/downloads/。安装时务必勾选“Add Python to PATH”选项。
2. 安装Tesseract OCR引擎
档案检索的核心在于图片转文字。需要安装Tesseract引擎。
- Windows用户: 访问 https://github.com/UB-Mannheim/tesseract/wiki 下载最新的安装包(如tesseract-ocr-w64-setup-5.3.0.exe)。安装时请务必记住安装路径,默认为
C:\Program Files\Tesseract-OCR。 - Linux用户: 执行命令
sudo apt install tesseract-ocr和sudo apt install libtesseract-dev。 - macOS用户: 执行命令
brew install tesseract。
3. 安装Poppler依赖
处理PDF文件需要Poppler库。
- Windows用户: 下载 https://github.com/oschwartz10612/poppler-windows/releases/,解压后将
bin目录添加到系统环境变量Path中,或者记住该路径。 - Linux用户: 执行
sudo apt install poppler-utils。
4. 安装Python依赖库
在项目目录下创建一个 requirements.txt 文件,并填入以下内容:
然后在终端执行安装命令:
```bash pip install -r requirements.txt ```二、项目目录结构搭建
为了保持代码清晰,请在本地创建一个名为 archive_system 的文件夹,并按照以下结构创建子文件夹和文件:
注意:请务必手动创建 templates 和 uploads 文件夹。
三、核心代码编写
1. 配置文件 (config.py)
此文件用于管理数据库路径和上传文件夹设置。请填入以下代码:
```python import os 基于当前文件路径获取项目根目录 basedir = os.path.abspath(os.path.dirname(__file__)) class Config: 设置SQLite数据库URI SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'archive.db') SQLALCHEMY_TRACK_MODIFICATIONS = False 文件上传配置 UPLOAD_FOLDER = os.path.join(basedir, 'uploads') ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'pdf', 'gif'} Tesseract OCR 路径配置 (Windows用户请修改为你的实际安装路径) 如果是Linux或Mac,通常不需要设置此变量,但如果报错请设置 TESSERACT_PATH = r'C:\Program Files\Tesseract-OCR\tesseract.exe' Poppler 路径配置 (Windows用户需要设置,指向bin目录下的poppler.exe所在目录) 例如: r'C:\Program Files\poppler-23.08.0\Library\bin' POPPLER_PATH = r'C:\Program Files\poppler-24.02.0\Library\bin' ```2. 数据库模型 (models.py)
定义档案的数据结构,包括文件名、存储路径和识别出的文本内容。
```python from flask_sqlalchemy import SQLAlchemy from datetime import datetime db = SQLAlchemy() class Archive(db.Model): id = db.Column(db.Integer, primary_key=True) filename = db.Column(db.String(100), nullable=False) filepath = db.Column(db.String(200), nullable=False) content = db.Column(db.Text, nullable=True) 存储OCR识别后的文本 upload_date = db.Column(db.DateTime, default=datetime.utcnow) def __repr__(self): return f'3. 主程序逻辑 (app.py)
这是系统的核心,包含文件上传、OCR识别、入库和检索逻辑。
```python import os import pytesseract from flask import Flask, render_template, request, redirect, url_for, flash from werkzeug.utils import secure_filename from pdf2image import convert_from_path from config import Config from models import db, Archive app = Flask(__name__) app.config.from_object(Config) 初始化数据库 db.init_app(app) 配置OCR路径 (仅Windows需要,Linux/Mac可注释掉) if os.name == 'nt': pytesseract.pytesseract.tesseract_cmd = app.config['TESSERACT_PATH'] 设置poppler路径环境变量,防止pdf2image找不到 os.environ['PATH'] += os.pathsep + app.config['POPPLER_PATH'] 创建数据库表 with app.app_context(): db.create_all() def allowed_file(filename): return '.' in filename and \ filename.rsplit('.', 1)[1].lower() in app.config['ALLOWED_EXTENSIONS'] def perform_ocr(filepath): """执行OCR识别,支持图片和PDF""" text_content = "" try: if filepath.lower().endswith('.pdf'): 将PDF转换为图片列表 images = convert_from_path(filepath) for img in images: 识别每一页 text_content += pytesseract.image_to_string(img, lang='chi_sim+eng') + "\n" else: 直接识别图片 text_content = pytesseract.image_to_string(filepath, lang='chi_sim+eng') except Exception as e: print(f"OCR Error: {e}") return "OCR识别失败" return text_content @app.route('/', methods=['GET', 'POST']) def index(): if request.method == 'POST': 处理文件上传 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 flash('正在处理文件,请稍候...') content = perform_ocr(filepath) 存入数据库 new_archive = Archive(filename=filename, filepath=filepath, content=content) db.session.add(new_archive) db.session.commit() flash(f'文件 {filename} 上传并归档成功!') return redirect(url_for('index')) 处理搜索查询 query = request.args.get('q') results = [] if query: 使用like进行模糊查询 results = Archive.query.filter(Archive.content.contains(query)).all() return render_template('index.html', results=results, query=query) if __name__ == '__main__': app.run(debug=True, port=5000) ```四、前端页面制作
1. 首页模板 (templates/index.html)

这个页面集成了上传表单和搜索结果展示。
```html{{ message }}
{% endfor %}档案数字化上传
档案内容检索
搜索结果 (关键词: {{ query }})
{% if results %} {% for item in results %}{{ item.filename }}
上传时间: {{ item.upload_date.strftime('%Y-%m-%d %H:%M') }}
摘要内容: {{ item.content[:200] }}...
查看/下载文件未找到包含 "{{ query }}" 的档案。
{% endif %} {% endif %} ```五、系统运行与实操测试
1. 启动服务
在终端中确保位于 archive_system 目录下,执行以下命令启动Web服务:
看到输出 Running on http://127.0.0.1:5000 即表示启动成功。
2. 实操上传测试
- 打开浏览器访问 http://127.0.0.1:5000。
- 准备一张包含文字的图片(如照片或扫描件)或一份PDF文档。建议使用包含“平顶山”或“档案”字样的测试文件。
- 在“档案数字化上传”区域点击“选择文件”,选中测试文件。
- 点击“上传并OCR识别”按钮。
- 观察现象: 页面会刷新,如果配置正确,顶部会显示“文件xxx上传并归档成功”。如果是PDF,处理时间可能会稍长,请耐心等待。
3. 实操检索测试
- 在页面下方的“档案内容检索”输入框中,输入你刚才上传文件中包含的某个词汇,例如“平顶山”。
- 点击“搜索”按钮。
- 观察结果: 页面下方应列出对应的档案条目,显示文件名、摘要以及“查看/下载文件”的链接。
- 点击“查看/下载文件”链接,确认能正确打开原始文件。
六、常见故障排查
在实操过程中,可能会遇到以下技术问题,请按方案排查:
- 报错:tesseract is not installed or it's not in your path
这是最常见的错误。请检查
config.py中的TESSERACT_PATH是否绝对正确指向了tesseract.exe。注意路径字符串前的r不能省略。 - 报错:Unable to open file "..." or access it
通常是PDF转换失败。请检查
config.py中的POPPLER_PATH是否正确指向了Poppler的bin目录。如果路径无误,尝试重启终端或IDE。 - 上传后没有内容或乱码
默认OCR语言设置为
chi_sim+eng(简体中文+英文)。如果识别效果差,可能是图片分辨率过低。请确保测试图片清晰度足够。 - 点击下载链接404错误
检查
index.html中的链接路径生成逻辑。如果是在本地运行,确保uploads文件夹确实存在且有文件权限。