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进行灰度化、二值化和去噪处理。

Python+Tesseract实现档案数字化入库全流程实操方案

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中的二值化参数。
AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

扫码咨询
安答联动微信公众号二维码

微信扫码关注安答联动

申请试用
热线电话
申请试用

安答联动档案管理系统