Python+Tesseract实现档案数字化入库全流程实操方案
一、环境准备与工具安装
在开始编写代码之前,必须先配置好运行环境。本方案基于Python 3.8+和Tesseract OCR引擎构建,确保在Windows、Linux或macOS上均可运行。
1. 安装Python环境
请确保已安装Python 3.8或更高版本。如果未安装,请前往Python官网下载安装包,安装时务必勾选"Add Python to PATH"。安装完成后,在终端输入以下命令验证:
python --version
2. 安装Tesseract OCR引擎
Tesseract是OCR的核心引擎。根据你的操作系统,执行以下安装步骤:
- Windows用户:下载Tesseract-OCR安装包。推荐下载5.3.0及以上版本以获得更好的中文识别率。下载地址:https://github.com/UB-Mannheim/tesseract/wiki。安装时请记住安装路径,默认为
C:\Program Files\Tesseract-OCR。 - Linux用户:直接使用包管理器安装,命令如下:
sudo apt update
sudo apt install tesseract-ocr tesseract-ocr-chi-sim
- macOS用户:使用Homebrew安装,命令如下:
brew install tesseract
brew install tesseract-lang
3. 安装Python依赖库
在项目根目录下创建requirements.txt文件,或者直接执行以下pip命令安装所需库:
pip install pytesseract pillow pdf2image opencv-python
注意:如果需要处理PDF文件,Linux用户需要额外安装poppler-utils,Windows用户需将poppler bin目录加入环境变量。
二、项目目录结构搭建
为了保持代码清晰,建议按照以下结构创建项目文件夹:
- input_files/:存放待扫描的图片(JPG, PNG)或PDF档案。
- output_data/:存放识别后的文本文件或数据库文件。
- tessdata/:存放语言训练数据(如需自定义路径)。
- archive_system.py:主程序文件。
三、核心功能模块代码实现
我们将代码拆分为预处理、OCR识别和数据入库三个部分,确保逻辑解耦。
1. 图像预处理模块
扫描件往往存在噪点、倾斜或分辨率不足的问题,直接识别准确率低。我们需要使用OpenCV进行灰度化、二值化和去噪处理。

在archive_system.py中写入以下预处理函数:
```python
import cv2
import numpy as np
from PIL import Image
import os
def preprocess_image(image_path):
读取图片
img = cv2.imread(image_path)
if img is None:
raise ValueError(f"无法读取图片: {image_path}")
转为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
自适应阈值二值化,处理光照不均
binary = cv2.adaptiveThreshold(
gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 11, 2
)
降噪处理(中值滤波)
denoised = cv2.medianBlur(binary, 3)
return denoised
```
2. OCR文字识别模块
使用pytesseract调用Tesseract引擎。这里需要指定中文语言包chi_sim。
继续在文件中添加识别函数。注意:Windows用户必须手动配置tesseract_cmd路径。
```python
import pytesseract
Windows用户请取消下方注释并修改为你的实际安装路径
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
def perform_ocr(image_array):
将OpenCV图像数组转为PIL Image对象
pil_image = Image.fromarray(image_array)
配置识别参数:psm 6 表示假设是一个统一的文本块
custom_config = r'--oem 3 --psm 6 -l chi_sim+eng'
try:
text = pytesseract.image_to_string(pil_image, config=custom_config)
return text
except Exception as e:
print(f"OCR识别失败: {e}")
return ""
```
3. 数据库存储模块
使用SQLite建立本地轻量级数据库,存储档案元数据和识别内容。无需配置服务器,即开即用。
```python
import sqlite3
from datetime import datetime
def init_db(db_path='output_data/archive.db'):
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
创建档案表,包含文件名、识别内容、入库时间
cursor.execute('''
CREATE TABLE IF NOT EXISTS documents (
id INTEGER PRIMARY KEY AUTOINCREMENT,
file_name TEXT NOT NULL,
content TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
''')
conn.commit()
conn.close()
def save_to_db(file_name, content, db_path='output_data/archive.db'):
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
cursor.execute("INSERT INTO documents (file_name, content) VALUES (?, ?)", (file_name, content))
conn.commit()
conn.close()
print(f"已入库: {file_name}")
```
四、主流程整合与执行
将上述模块串联起来,并增加PDF转图片的逻辑(因为Tesseract直接处理PDF较慢且不稳定,建议先转图片)。
```python
from pdf2image import convert_from_path
def process_file(file_path, db_path):
file_name = os.path.basename(file_path)
full_text = ""
处理PDF文件
if file_name.lower().endswith('.pdf'):
try:
将PDF转换为图片列表,dpi=300保证清晰度
pages = convert_from_path(file_path, dpi=300)
for i, page in enumerate(pages):
PIL转OpenCV格式
opencv_img = cv2.cvtColor(np.array(page), cv2.COLOR_RGB2BGR)
预处理
processed = preprocess_image(opencv_img) 注意:这里preprocess需要接受array,稍作调整或直接传array
实际上preprocess接受路径,这里我们需要一个接受array的版本,或者重写preprocess
为简化,这里将PIL page保存为临时图片
temp_path = f"temp_page_{i}.jpg"
page.save(temp_path)
processed_img = preprocess_image(temp_path)
page_text = perform_ocr(processed_img)
full_text += page_text + "\n"
os.remove(temp_path) 清理临时文件
except Exception as e:
print(f"PDF处理错误 {file_name}: {e}")
return
处理图片文件
elif file_name.lower().endswith(('.png', '.jpg', '.jpeg')):
processed_img = preprocess_image(file_path)
full_text = perform_ocr(processed_img)
else:
print(f"不支持的文件格式: {file_name}")
return
入库
save_to_db(file_name, full_text, db_path)
if __name__ == "__main__":
初始化环境
input_dir = "input_files"
db_dir = "output_data"
db_path = os.path.join(db_dir, "archive.db")
if not os.path.exists(db_dir):
os.makedirs(db_dir)
init_db(db_path)
遍历输入文件夹
files = [f for f in os.listdir(input_dir) if os.path.isfile(os.path.join(input_dir, f))]
print(f"开始处理 {len(files)} 个文件...")
for file in files:
file_path = os.path.join(input_dir, file)
process_file(file_path, db_path)
print("所有档案处理完毕。")
```
五、数据验证与查询
代码运行完毕后,我们需要验证数据是否正确入库。可以直接使用SQLite命令或Python脚本查询。
在终端或Python交互环境中执行以下代码进行验证:
```python
import sqlite3
conn = sqlite3.connect('output_data/archive.db')
cursor = conn.cursor()
查询最近入库的5条记录
cursor.execute("SELECT file_name, substr(content, 1, 50) as preview FROM documents ORDER BY id DESC LIMIT 5")
rows = cursor.fetchall()
for row in rows:
print(f"文件: {row[0]}")
print(f"内容预览: {row[1]}...")
print("-" 30)
conn.close()
```
常见问题排查:
- 报错"tesseract is not installed":请检查第二节中的路径配置,Windows用户必须显式指定
tesseract_cmd。 - 中文全是乱码:请确保安装了
chi_sim训练数据,并在代码中使用了-l chi_sim参数。 - 识别率为0:检查输入图片分辨率,建议扫描件DPI不低于300。如果图片背景复杂,尝试调整
preprocess_image中的二值化参数。