技术选型与环境准备
本指南将带你从零构建一个具备OCR识别、自动分类和元数据提取功能的轻量级文书档案系统。我们将使用Python作为核心开发语言,FastAPI作为Web框架,结合Tesseract-OCR实现文字识别。这种方式既适合个人档案数字化,也能作为企业内部系统的微服务基石。
你需要准备基础的开发环境。请确保你的操作系统已安装Python 3.9或更高版本。不建议使用Python 3.8及以下版本,以避免依赖库兼容性问题。
打开终端或命令行工具,执行以下命令创建项目目录并进入:
```bash
mkdir archive_system
cd archive_system
```
接下来,我们将创建一个虚拟环境来隔离项目依赖,这是Python开发的最佳实践,防止不同项目间的包版本冲突:
```bash
python -m venv venv
```
激活虚拟环境。在Windows系统下执行:
```bash
venv\Scripts\activate
```
在Linux或macOS系统下执行:
```bash
source venv/bin/activate
```
环境激活后,安装核心依赖包。这里我们需要FastAPI用于构建API,Uvicorn用于运行服务器,Python-Multipart用于处理文件上传,Pillow用于图像预处理,pytesseract用于调用OCR引擎:
```bash
pip install fastapi uvicorn[standard] python-multipart Pillow pytesseract python-dateutil
```
OCR引擎部署与配置
系统的核心能力在于将图片或扫描件转换为可检索的文本。我们需要安装Tesseract-OCR引擎。这是目前开源界最强大的OCR工具之一。
Windows用户安装步骤:
不要使用系统自带的包管理器,直接访问UB Mannheim的官方发布页面下载安装包,这是最稳定的Windows版本。下载地址如下:
https://github.com/UB-Mannheim/tesseract/wiki
下载完成后,双击安装。务必记住安装路径,默认通常是C:\Program Files\Tesseract-OCR。在安装过程中,务必勾选"Additional language data",并下载简体中文语言包chi_sim,否则系统将无法识别中文内容。
Linux用户安装步骤:
在终端中执行以下命令安装引擎及中文语言包:
```bash
sudo apt update
sudo apt install tesseract-ocr tesseract-ocr-chi-sim
```
环境变量配置:

安装完成后,Python代码需要知道Tesseract的可执行文件在哪里。对于Linux用户,通常系统会自动配置。对于Windows用户,我们需要在代码中显式指定路径。为了代码的健壮性,我们将在后续的配置文件中处理这一细节。
项目结构搭建
为了保证代码的可维护性,我们采用模块化的目录结构。请在项目根目录下执行以下命令创建所需的文件夹和文件:
```bash
mkdir -p uploads static templates
touch main.py config.py ocr_utils.py
```
最终的目录结构如下所示:
- archive_system/ (项目根目录)
- uploads/ (用于存储上传的原始文件)
- static/ (用于存储处理后的结果或静态资源)
- main.py (应用程序入口,包含API路由)
- config.py (配置文件,包含路径和OCR设置)
- ocr_utils.py (核心工具类,包含图像处理和文字识别逻辑)
核心配置与工具类编写
首先编写config.py,集中管理路径和OCR配置。这能有效避免硬编码带来的维护困难。
打开config.py,写入以下代码。注意Windows用户需要根据实际情况修改TESSERACT_PATH:
```python
import os
from pathlib import Path
项目根目录
BASE_DIR = Path(__file__).resolve().parent
上传文件存储目录
UPLOAD_DIR = BASE_DIR / "uploads"
UPLOAD_DIR.mkdir(parents=True, exist_ok=True)
OCR引擎路径配置
Windows用户请取消下方注释并修改为你的实际安装路径
TESSERACT_PATH = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
TESSERACT_PATH = None
支持的文件类型
ALLOWED_EXTENSIONS = {".png", ".jpg", ".jpeg", ".gif", ".bmp", ".tif", ".tiff"}
文件大小限制 (10MB)
MAX_FILE_SIZE = 10 1024 1024
```
接下来编写ocr_utils.py,这是系统的技术核心。我们将实现图像预处理(转灰度、去噪)以提高识别率,并封装OCR识别逻辑。
打开ocr_utils.py,填入以下完整代码:
```python
import pytesseract
from PIL import Image
import uuid
from config import TESSERACT_PATH, UPLOAD_DIR
from datetime import datetime
如果配置文件中指定了路径(主要针对Windows),则进行设置
if TESSERACT_PATH:
pytesseract.pytesseract.tesseract_cmd = TESSERACT_PATH
def preprocess_image(image_path):
"""
图像预处理:转换为灰度图并进行二值化,提高OCR识别准确率
"""
try:
img = Image.open(image_path)
转换为灰度图
img = img.convert('L')
二值化处理,阈值设为200,可根据实际扫描件调整
img = img.point(lambda x: 0 if x < 200 else 255, '1')
return img
except Exception as e:
raise RuntimeError(f"图像预处理失败: {str(e)}")
def extract_text_from_image(image_path, lang='chi_sim+eng'):
"""
调用Tesseract提取文字
:param lang: 语言包,默认为中文简体+英文
"""
try:
先进行预处理
processed_img = preprocess_image(image_path)
执行OCR识别
text = pytesseract.image_to_string(processed_img, lang=lang)
return text.strip()
except Exception as e:
raise RuntimeError(f"OCR识别引擎异常: {str(e)}")
def save_upload_file(file_content, file_suffix):
"""
保存上传的文件并返回新的文件名和路径
"""
生成唯一文件名,防止覆盖
filename = f"{uuid.uuid4().hex}{file_suffix}"
file_path = UPLOAD_DIR / filename
with open(file_path, "wb") as buffer:
buffer.write(file_content)
return filename, file_path
def extract_metadata(text):
"""
简单的元数据提取逻辑:尝试从文本中提取日期
"""
import re
匹配常见日期格式 YYYY-MM-DD 或 YYYY/MM/DD
date_pattern = re.compile(r'\d{4}[-/]\d{1,2}[-/]\d{1,2}')
match = date_pattern.search(text)
date_str = match.group(0) if match else datetime.now().strftime("%Y-%m-%d")
return {"extracted_date": date_str}
```
主程序逻辑与API接口实现
我们编写main.py,构建Web服务接口。这里我们将实现一个/upload接口,接收前端上传的文件,调用工具类进行处理,并返回JSON格式的识别结果。
打开main.py,填入以下代码:
```python
from fastapi import FastAPI, File, UploadFile, HTTPException
from fastapi.responses import JSONResponse
from pathlib import Path
import shutil
from config import ALLOWED_EXTENSIONS, MAX_FILE_SIZE
from ocr_utils import save_upload_file, extract_text_from_image, extract_metadata
app = FastAPI(title="文书档案识别系统",)
@app.get("/")
async def root():
return {"message": "文书档案系统API服务已就绪,请使用POST /upload 接口上传文件"}
@app.post("/upload")
async def upload_archive(file: UploadFile = File(...)):
"""
上传文书档案,进行OCR识别并返回结构化数据
"""
1. 校验文件扩展名
file_suffix = Path(file.filename).suffix.lower()
if file_suffix not in ALLOWED_EXTENSIONS:
raise HTTPException(status_code=400, detail=f"不支持的文件格式: {file_suffix}")
2. 读取文件内容并校验大小
content = await file.read()
if len(content) > MAX_FILE_SIZE:
raise HTTPException(status_code=413, detail="文件大小超过10MB限制")
try:
3. 保存文件
saved_filename, saved_path = save_upload_file(content, file_suffix)
4. 执行OCR识别
recognized_text = extract_text_from_image(saved_path)
5. 提取元数据
metadata = extract_metadata(recognized_text)
6. 构造返回结果
result = {
"status": "success",
"filename": file.filename,
"saved_as": saved_filename,
"file_size": len(content),
"metadata": metadata,
"content": recognized_text
}
return JSONResponse(content=result)
except RuntimeError as e:
处理OCR或处理过程中的已知错误
raise HTTPException(status_code=500, detail=str(e))
except Exception as e:
处理未知错误
raise HTTPException(status_code=500, detail=f"服务器内部错误: {str(e)}")
```
系统运行与实操测试
代码编写完毕,现在启动服务。在终端确保虚拟环境已激活,并在项目根目录下执行:
```bash
uvicorn main:app --reload
```
终端将显示服务已启动,通常监听在http://127.0.0.1:8000。此时,我们不需要编写复杂的前端页面,直接使用curl命令进行测试,这是验证API最直接的方式。
准备一张包含中文文字的图片(例如一份扫描的合同或通知),命名为test.jpg,放在当前终端操作目录下。执行以下命令上传测试:
```bash
curl -X POST "http://127.0.0.1:8000/upload" -F "file=@test.jpg"
```
如果一切配置正确,你将看到返回的JSON数据,其中"content"字段包含了图片中识别出的文字,"metadata"字段包含了提取到的日期信息。
如果遇到tesseract is not installed or it's not in your PATH错误,请回到config.py中检查TESSERACT_PATH是否正确指向了.exe文件。如果识别结果是乱码,请确保安装时下载了chi_sim语言包,并在ocr_utils.py中确认lang='chi_sim+eng'参数正确。
至此,一个具备核心OCR能力的文书档案系统原型已经落地。你可以基于此扩展数据库存储(如SQLite或MySQL),将识别结果持久化,并添加检索接口,从而形成完整的数字化档案管理闭环。