基础环境搭建与依赖安装
档案数字化的核心在于将非结构化的图像数据转化为可检索、可分析的结构化数据。本指南基于Linux环境(推荐Ubuntu 20.04或CentOS 7+),使用Python作为开发语言,结合Tesseract OCR引擎与FastAPI框架,构建一套可落地的微服务架构。
更新系统源并安装OCR核心引擎Tesseract及其中文语言包。执行以下命令:
```bash
sudo apt-get update
sudo apt-get install -y tesseract-ocr tesseract-ocr-chi-sim libpng-dev libjpeg-dev libtiff-dev
```
安装Python 3.8及以上版本的环境管理工具,并创建虚拟环境。为了避免依赖冲突,强烈建议使用虚拟环境:
```bash
python3 -m venv venv
source venv/bin/activate
```
接下来,安装项目所需的Python依赖库。创建一个requirements.txt文件,并填入以下具体版本号,确保环境稳定性:
```text
fastapi==0.95.0
uvicorn==0.21.1
python-multipart==0.0.6
pytesseract==0.3.10
Pillow==9.5.0
pandas==2.0.1
openpyxl==3.1.2
```
执行安装命令:
```bash
pip install -r requirements.txt
```
核心OCR识别模块开发
创建ocr_engine.py文件,用于封装底层的图像识别逻辑。产业化应用中必须对图像进行预处理,以提高识别率。以下代码实现了灰度化、二值化及OCR识别的完整流程:
```python
import pytesseract
from PIL import Image
import io
class OCREngine:
def __init__(self, lang='chi_sim'):
self.lang = lang
def preprocess_image(self, image_bytes):
"""
图像预处理:转为灰度图并进行二值化处理
"""
image = Image.open(io.BytesIO(image_bytes)).convert('L')
二值化阈值处理,阈值设为170
image = image.point(lambda x: 0 if x < 170 else 255, '1')
return image
def recognize(self, image_bytes):
"""
执行OCR识别
"""
try:
image = self.preprocess_image(image_bytes)
psm 6 表示假设为统一的文本块
text = pytesseract.image_to_string(image, lang=self.lang, config='--psm 6')
return text.strip()
except Exception as e:
return f"Error: {str(e)}"
```
注意:Tesseract在处理中文时,--psm 6参数通常能获得较好的段落识别效果。如果服务器内存较小,建议限制并发线程数,防止OOM(Out of Memory)错误。
结构化数据提取与清洗

单纯的OCR文本输出无法满足产业化需求,必须进行结构化提取。创建data_extractor.py,使用正则表达式提取档案中的关键信息(如日期、金额、文件编号):
```python
import re
class DataExtractor:
def extract_info(self, raw_text):
"""
从OCR识别的文本中提取结构化字段
"""
data = {}
提取日期 (格式:YYYY-MM-DD 或 YYYY年MM月DD日)
date_pattern = r'(\d{4}[-年]\d{1,2}[-月]\d{1,2}[日]?)'
dates = re.findall(date_pattern, raw_text)
data['dates'] = dates[0] if dates else "未识别"
提取金额 (支持千分位和两位小数)
money_pattern = r'¥?\d{1,3}(,\d{3})(\.\d{2})?'
moneys = re.findall(money_pattern, raw_text)
findall返回的是元组,需要重组
clean_moneys = [''.join(m) for m in moneys]
data['amounts'] = clean_moneys
提取类似文件编号的字母数字组合 (例如:DOC-2023-001)
code_pattern = r'[A-Z]{2,4}-\d{4}-\d{3,5}'
codes = re.findall(code_pattern, raw_text)
data['file_code'] = codes[0] if codes else "未识别"
提取纯文本摘要(去除多余空行)
data['summary'] = re.sub(r'\s+', ' ', raw_text)[:200] 截取前200字作为摘要
return data
```
此模块将杂乱的文本转化为JSON格式的数据,直接对接数据库或Excel导出需求,是档案数字化价值变现的关键一步。
基于FastAPI的服务封装
为了便于集成到其他系统,我们需要将上述功能封装为RESTful API接口。创建main.py:
```python
from fastapi import FastAPI, File, UploadFile, HTTPException
from fastapi.responses import JSONResponse
import uvicorn
from ocr_engine import OCREngine
from data_extractor import DataExtractor
app = FastAPI(title="档案数字化处理服务")
ocr_engine = OCREngine()
extractor = DataExtractor()
@app.post("/process_archive")
async def process_archive(file: UploadFile = File(...)):
"""
接收上传的图片文件,返回OCR文本及结构化数据
"""
验证文件类型
if not file.content_type.startswith("image/"):
raise HTTPException(status_code=400, detail="仅支持图片格式上传")
try:
读取文件字节流
image_bytes = await file.read()
1. 执行OCR
raw_text = ocr_engine.recognize(image_bytes)
2. 结构化提取
structured_data = extractor.extract_info(raw_text)
return JSONResponse(content={
"status": "success",
"filename": file.filename,
"raw_text": raw_text,
"structured_data": structured_data
})
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
```
启动服务:
```bash
python main.py
```
服务启动后,可通过curl命令进行本地测试,验证接口可用性:
```bash
curl -X POST "http://127.0.0.1:8000/process_archive" -H "accept: application/json" -H "Content-Type: multipart/form-data" -F "file=@test_image.jpg"
```
Docker容器化部署
为了实现产业化部署,必须解决环境一致性和横向扩展问题。编写Dockerfile将应用打包:
```dockerfile
使用官方Python运行时作为父镜像
FROM python:3.9-slim
设置工作目录
WORKDIR /app
安装系统依赖,特别是Tesseract和中文包
RUN apt-get update && apt-get install -y \
tesseract-ocr \
tesseract-ocr-chi-sim \
libpng-dev \
libjpeg-dev \
libtiff-dev \
&& rm -rf /var/lib/apt/lists/
复制requirements文件
COPY requirements.txt .
安装Python依赖
RUN pip install --no-cache-dir -r requirements.txt
复制项目代码
COPY . .
暴露端口
EXPOSE 8000
启动命令
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
```
构建镜像并运行容器。执行以下命令完成最终部署:
```bash
构建镜像
docker build -t archive-ocr-service:v1 .
运行容器
docker run -d -p 8000:8000 --name archive-service archive-ocr-service:v1
```
至此,一套完整的档案数字化处理微服务已部署完毕。该服务具备高并发处理能力,且通过Docker实现了环境隔离,可直接作为企业数字化产业链中的基础节点接入上层业务系统。通过调整data_extractor.py中的正则规则,可快速适配不同类型的档案(如财务凭证、人事档案、合同文件)的自动化提取需求。