一、环境准备与工具安装
在开始构建档案数字化系统之前,必须确保运行环境配置正确。本系统基于Python开发,利用Tesseract OCR引擎进行图像文字识别,使用SQLite作为轻量级数据库存储档案信息。请严格按照以下步骤安装依赖。
1. 安装Python环境
确保系统已安装Python 3.8或更高版本。如果未安装,请访问Python官网下载对应操作系统的安装包。安装时务必勾选"Add Python to PATH"选项。安装完成后,在终端执行以下命令验证:
python --version
2. 安装Tesseract OCR引擎
Tesseract是OCR的核心识别引擎。不同操作系统的安装方式如下:
- Windows:访问 https://github.com/UB-Mannheim/tesseract/wiki 下载最新的安装包(推荐tesseract-ocr-w64-setup)。安装时请务必勾选"Additional language data"中的Chinese (Simplified)和English语言包,否则无法识别中文。默认安装路径通常为
C:\Program Files\Tesseract-OCR\tesseract.exe。
- macOS:使用Homebrew安装,执行命令:
brew install tesseract tesseract-lang。
- Linux (Ubuntu/Debian):执行命令:
sudo apt install tesseract-ocr tesseract-ocr-chi-sim。
3. 安装Python依赖库
在项目根目录下创建 requirements.txt 文件,并填入以下内容。随后执行安装命令。这些库分别用于OCR封装、图像处理和数据库操作。
pip install pytesseract pillow sqlite3
注意:sqlite3通常包含在Python标准库中,无需单独安装。如果上述命令报错,请尝试分别安装:pip install pytesseract pillow。
二、项目目录结构规划
为了保持代码的可维护性,请按照以下结构创建文件夹和文件。这种结构将输入文件、处理后的图片、数据库和代码逻辑分离,避免混乱。
- archive_system/ (项目根目录)
- input_files/ (存放待扫描的原始图片,支持jpg, png)
- processed_files/ (存放经过降噪处理的图片)
- data/ (存放数据库文件)
- config.py (配置文件,存放路径和常量)
- image_processor.py (图像预处理模块)
- ocr_engine.py (文字识别模块)
- db_manager.py (数据库管理模块)
- main.py (主程序入口)
三、配置文件编写
创建 config.py,集中管理路径和Tesseract配置。这在更换机器或部署时能极大减少修改工作量。请根据Windows或Linux的实际安装路径修改 TESSERACT_PATH。
```python
import os
基础路径
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
文件路径配置
INPUT_DIR = os.path.join(BASE_DIR, 'input_files')
PROCESSED_DIR = os.path.join(BASE_DIR, 'processed_files')
DATA_DIR = os.path.join(BASE_DIR, 'data')
DB_PATH = os.path.join(DATA_DIR, 'archives.db')
Tesseract OCR 引擎路径配置
Windows用户请务必修改为实际安装路径,Mac/Linux用户可注释掉此行或设为None
TESSERACT_PATH = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
OCR识别参数
OCR_LANG = 'chi_sim+eng' 同时识别中文简体和英文
PAGE_SEG_MODE = '6' PSM 6: 假设为统一的文本块
```
四、图像预处理模块开发

扫描件通常存在噪点、倾斜或光照不均,直接识别准确率极低。创建 image_processor.py,编写代码将图片转为灰度、进行二值化处理,这是提升识别率的关键步骤。
```python
import os
from PIL import Image, ImageEnhance
import config
def ensure_dir(directory):
if not os.path.exists(directory):
os.makedirs(directory)
def preprocess_image(image_path, output_path):
"""
对图像进行灰度化、二值化和对比度增强处理
"""
try:
img = Image.open(image_path)
1. 转为灰度图
img = img.convert('L')
2. 增强对比度
enhancer = ImageEnhance.Contrast(img)
img = enhancer.enhance(2.0)
3. 二值化处理 (阈值设为 170,可根据实际扫描件调整)
像素值大于170的设为白(255),小于的设为黑(0)
threshold = 170
table = []
for i in range(256):
if i < threshold:
table.append(0)
else:
table.append(255)
img = img.point(table, '1')
保存处理后的图片
img.save(output_path)
return True
except Exception as e:
print(f"图像处理失败: {image_path}, 错误: {e}")
return False
def batch_process():
ensure_dir(config.PROCESSED_DIR)
files = [f for f in os.listdir(config.INPUT_DIR) if f.lower().endswith(('.png', '.jpg', '.jpeg'))]
processed_files = []
for filename in in files:
src_path = os.path.join(config.INPUT_DIR, filename)
dst_path = os.path.join(config.PROCESSED_DIR, f"processed_{filename}")
if preprocess_image(src_path, dst_path):
processed = {'original': filename, 'processed': f"processed_{filename}"}
processed_files.append(processed)
print(f"已处理: {filename}")
return processed_files
```
五、数据库管理模块开发
创建 db_manager.py,负责初始化数据库和将识别结果入库。使用SQLite无需配置服务器,适合单机或小团队使用。我们将建立一张 archives 表,存储文件名、识别文本和入库时间。
```python
import sqlite3
import os
import datetime
import config
def init_db():
"""初始化数据库,创建表"""
ensure_dir = lambda d: os.makedirs(d, exist_ok=True)
ensure_dir(config.DATA_DIR)
conn = sqlite3.connect(config.DB_PATH)
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS archives (
id INTEGER PRIMARY KEY AUTOINCREMENT,
file_name TEXT NOT NULL,
ocr_content TEXT,
create_time TEXT
)
''')
conn.commit()
conn.close()
print("数据库初始化完成。")
def insert_archive(file_name, ocr_content):
"""插入单条档案记录"""
conn = sqlite3.connect(config.DB_PATH)
cursor = conn.cursor()
create_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
cursor.execute('''
INSERT INTO archives (file_name, ocr_content, create_time)
VALUES (?, ?, ?)
''', (file_name, ocr_content, create_time))
conn.commit()
conn.close()
print(f"已入库: {file_name}")
def query_all():
"""查询所有档案"""
conn = sqlite3.connect(config.DB_PATH)
cursor = conn.cursor()
cursor.execute('SELECT id, file_name, create_time FROM archives ORDER BY id DESC')
results = cursor.fetchall()
conn.close()
return results
```
六、OCR识别与核心业务逻辑
创建 main.py,这是系统的入口。它将串联预处理、OCR识别和数据存储三个环节。注意,这里必须显式指定Tesseract的可执行文件路径,否则Windows环境下会报错。
```python
import pytesseract
import config
from image_processor import batch_process
from db_manager import init_db, insert_archive
设置Tesseract路径,仅Windows需要,Mac/Linux可忽略
if config.TESSERACT_PATH and os.path.exists(config.TESSERACT_PATH):
pytesseract.pytesseract.tesseract_cmd = config.TESSERACT_PATH
def run_ocr_on_image(image_path):
"""
调用Tesseract进行文字识别
"""
try:
config参数:lang='chi_sim+eng' 指定中英文混合识别
text = pytesseract.image_to_string(
Image.open(image_path),
lang=config.OCR_LANG,
config=f'--psm {config.PAGE_SEG_MODE}'
)
return text.strip()
except Exception as e:
print(f"OCR识别出错: {image_path}, 错误: {e}")
return ""
def main():
print("=== 档案数字化入库系统启动 ===")
1. 初始化数据库
init_db()
2. 批量预处理图像
print("开始图像预处理...")
file_list = batch_process()
if not file_list:
print("未发现待处理文件,请将图片放入 input_files 目录。")
return
3. 循环执行OCR与入库
print("开始OCR识别与入库...")
for item in file_list:
processed_img_path = os.path.join(config.PROCESSED_DIR, item['processed'])
执行识别
content = run_ocr_on_image(processed_img_path)
if content:
入库
insert_archive(item['original'], content)
else:
print(f"跳过空内容文件: {item['original']}")
print("=== 所有任务处理完成 ===")
if __name__ == "__main__":
导入Image用于PIL操作
from PIL import Image
main()
```
七、运行与测试验证
至此,所有代码已编写完毕。现在进行实际操作验证。
1. 准备测试数据
找几张包含中文和数字的档案扫描件(JPG或PNG格式),放入项目的 input_files 文件夹中。建议图片分辨率不低于300DPI以保证识别效果。
2. 执行程序
在项目根目录下打开终端,运行以下命令启动系统:
python main.py
3. 观察输出结果
终端将依次显示图像处理进度、OCR识别进度和入库状态。如果一切正常,你将看到“已入库”的提示。
4. 验证数据存储
我们可以使用Python命令行快速查看数据库中的数据,确认入库是否成功。在终端执行:
```python
python
```
```python
import sqlite3
conn = sqlite3.connect('data/archives.db')
cursor = conn.cursor()
cursor.execute("SELECT FROM archives")
print(cursor.fetchall())
conn.close()
exit()
```
如果屏幕打印出了包含你档案文字内容的列表,元组中包含文件名、识别出的文本和时间戳,说明档案数字化与入库系统已成功落地。你可以根据实际需求,修改 image_processor.py 中的二值化阈值,或调整 config.py 中的PSM参数以获得更精准的识别效果。