基于PaddleOCR实现文书档案批量识别实战教程

一、开发环境准备与依赖安装

在开始编写代码之前,必须先配置好基础的 Python 运行环境。本指南基于 Python 3.8 或 3.9 版本进行演示,兼容性最佳。请确保你的系统已经安装了 Python,并配置好了环境变量。

我们需要创建一个独立的虚拟环境来隔离项目依赖,避免与其他项目产生冲突。打开终端(Windows 下为 CMD 或 PowerShell,Linux/Mac 下为 Terminal),执行以下命令:

```bash 创建名为 ocr_archive 的虚拟环境 python -m venv ocr_archive 激活虚拟环境 Windows 下执行: ocr_archive\Scripts\activate Linux/Mac 下执行: source ocr_archive/bin/activate ```

环境激活后,接下来安装核心依赖库。PaddleOCR 是百度开源的超轻量级 OCR 模型,识别准确率高且对中文支持极好,非常适合处理文书档案。同时,我们需要安装 PaddlePaddle 作为底层深度学习框架,以及处理 PDF 和 Excel 的辅助库。

执行以下安装命令。请注意,这里默认安装 CPU 版本,确保所有电脑都能直接运行,无需配置显卡驱动:

```bash 安装 PaddlePaddle CPU 版本 pip install paddlepaddle==2.5.1 -i https://mirror.baidu.com/pypi/simple 安装 PaddleOCR 及其模型自动下载工具 pip install paddleocr==2.7.0.3 安装图像处理、PDF转换及表格处理库 pip install Pillow pdf2image pandas openpyxl ```

关键注意点:处理 PDF 文件需要系统安装 Poppler 工具,这是将 PDF 页面转换为图片的必要组件,很多初学者容易在此处卡壳。

  • Windows 用户:访问 https://github.com/oschwartz10612/poppler-windows/releases/ 下载最新版 Release,解压后将 bin 文件夹路径(如 C:\poppler-xx\bin)添加到系统的 Path 环境变量中。
  • Linux 用户:执行 sudo apt-get install poppler-utils
  • Mac 用户:执行 brew install poppler

二、单张文书档案识别核心代码实现

在处理批量档案之前,我们先通过一个简单的脚本验证单张图片的识别效果。PaddleOCR 的使用非常简洁,初始化模型后,直接调用 ocr 方法即可返回结果。

创建一个名为 single_test.py 的文件,输入以下代码:

```python from paddleocr import PaddleOCR import cv2 初始化 PaddleOCR use_angle_cls=True: 启用文字方向分类,识别倒置或侧放的文字 lang="ch": 指定中英文识别模型 ocr = PaddleOCR(use_angle_cls=True, lang="ch", show_log=False) 指定图片路径 img_path = './demo.jpg' 执行识别 result = ocr.ocr(img_path, cls=True) 解析并打印结果 result 是一个三维列表,结构为 [ [ [坐标], (文本, 置信度) ], ... ] if result[0]: for idx in range(len(result[0])): res = result[0][idx] 提取文本内容和置信度 text_content = res[1][0] confidence = res[1][1] 只打印置信度大于 0.5 的结果,过滤噪点 if confidence > 0.5: print(f"识别内容: {text_content} | 置信度: {confidence:.4f}") else: print("未识别到文字") ```

运行此脚本前,请将一张名为 demo.jpg 的文书档案图片放在同级目录下。第一次运行时,程序会自动从官网下载约 4MB 的轻量级模型文件,请保持网络通畅。识别结果会包含文本内容及其在图片中的坐标信息。

三、PDF 文书档案批量转换与处理

实际的文书档案多以 PDF 格式存在,且往往是多页文档。为了提高识别率,我们需要将 PDF 每一页转换为高清晰度的图片,然后再送入 OCR 引擎。

创建一个工具类文件 pdf_utils.py,专门处理 PDF 转图片的逻辑:

```python from pdf2image import convert_from_path import os def pdf_to_images(pdf_path, output_folder, dpi=300): """ 将 PDF 文件转换为图片列表 :param pdf_path: PDF 文件路径 :param output_folder: 图片临时保存目录 :param dpi: 分辨率,越高越清晰但速度越慢,建议 200-300 :return: 图片路径列表 """ if not os.path.exists(output_folder): os.makedirs(output_folder) print(f"正在转换 PDF: {pdf_path} ...") try: 使用 pdf2image 进行转换 thread_count=3 启用多线程加速转换 pages = convert_from_path(pdf_path, dpi=dpi, thread_count=3) image_paths = [] pdf_name = os.path.splitext(os.path.basename(pdf_path))[0] for i, page in enumerate(pages): 保存为 JPG 格式 image_path = os.path.join(output_folder, f"{pdf_name}_page_{i+1}.jpg") page.save(image_path, 'JPEG') image_paths.append(image_path) return image_paths except Exception as e: print(f"PDF 转换失败: {e}") return [] ```

四、完整批量识别与结果导出实战

下面我们将所有逻辑整合,编写一个完整的自动化脚本。该脚本会遍历指定文件夹下的所有 PDF 文件,将其转换为图片,进行 OCR 识别,并将结果结构化地保存到 Excel 表格中。Excel 将包含四列:文件名、页码、识别文本内容、置信度。

基于PaddleOCR实现文书档案批量识别实战教程

创建主程序文件 archive_ocr_main.py

```python import os import pandas as pd from paddleocr import PaddleOCR from pdf_utils import pdf_to_images import time class ArchiveOCR: def __init__(self, input_folder, output_excel): self.input_folder = input_folder self.output_excel = output_excel 初始化 OCR 模型,全局只初始化一次,提高效率 self.ocr = PaddleOCR(use_angle_cls=True, lang="ch", show_log=False) self.temp_img_folder = "./temp_images" self.all_results = [] def process_single_image(self, img_path, pdf_name, page_num): """处理单张图片并提取文本""" try: result = self.ocr.ocr(img_path, cls=True) if not result or not result[0]: return for line in result[0]: text = line[1][0] conf = float(line[1][1]) 过滤低置信度和非文本字符 if conf > 0.6 and text.strip(): row_data = { "文件名": pdf_name, "页码": page_num, "识别内容": text.strip(), "置信度": conf } self.all_results.append(row_data) print(f"[{pdf_name}-P{page_num}] {text}") except Exception as e: print(f"识别图片出错 {img_path}: {e}") def run(self): start_time = time.time() 遍历输入文件夹 files = os.listdir(self.input_folder) pdf_files = [f for f in files if f.lower().endswith('.pdf')] if not pdf_files: print("未在文件夹中找到 PDF 文件") return print(f"共发现 {len(pdf_files)} 个 PDF 文件,开始处理...") for pdf_file in pdf_files: pdf_path = os.path.join(self.input_folder, pdf_file) pdf_name = os.path.splitext(pdf_file)[0] 1. PDF 转图片 image_paths = pdf_to_images(pdf_path, self.temp_img_folder) 2. 逐页识别 for idx, img_path in enumerate(image_paths): self.process_single_image(img_path, pdf_name, idx + 1) 清理临时图片文件,节省磁盘空间 if os.path.exists(img_path): os.remove(img_path) 3. 保存结果到 Excel if self.all_results: df = pd.DataFrame(self.all_results) 按文件名和页码排序 df.sort_values(by=['文件名', '页码'], inplace=True) df.to_excel(self.output_excel, index=False, engine='openpyxl') print(f"\n处理完成!结果已保存至: {self.output_excel}") else: print("\n未识别到任何有效文本内容") end_time = time.time() print(f"总耗时: {end_time - start_time:.2f} 秒") if __name__ == "__main__": 配置输入输出路径 INPUT_DIR = "./archives" 请在此处放置你的 PDF 文件 OUTPUT_FILE = "./ocr_result.xlsx" if not os.path.exists(INPUT_DIR): os.makedirs(INPUT_DIR) print(f"已创建输入文件夹 {INPUT_DIR},请将 PDF 文件放入其中后重新运行。") else: app = ArchiveOCR(INPUT_DIR, OUTPUT_FILE) app.run() ```

五、实操步骤与验证

为了确保你能零门槛运行上述代码,请严格按照以下步骤操作:

1. 准备目录结构:
在代码同级目录下创建一个名为 archives 的文件夹,将你需要识别的文书档案 PDF 文件复制进去。

2. 运行脚本:
在终端中执行:

```bash python archive_ocr_main.py ```

3. 观察输出:
终端会实时打印正在处理的文件名和识别出的关键文本片段。如果第一次运行,你会看到提示下载模型文件的进度条。模型文件会自动缓存到 ~/.paddleocr/ 目录下,后续运行无需重新下载。

4. 检查结果:
程序运行结束后,打开目录下生成的 ocr_result.xlsx。你应该能看到所有档案中的文字已被提取出来。如果识别结果有乱码或漏字,通常是因为 PDF 分辨率过低或扫描件有噪点,可以在 pdf_utils.py 中将 dpi 参数调整为 400 或更高。

六、常见报错与参数调优

在实操过程中,你可能会遇到以下特定问题,这里给出直接的解决方案:

1. 报错:FileNotFoundError: 'poppler' not found
这完全是因为没有按照第二章节的说明安装 Poppler 或者环境变量未生效。请检查 Poppler 的 bin 目录是否已添加到 Path 中,并在安装后重启 IDE 或终端。

2. 识别速度慢
默认使用 CPU 运行,处理大量高分辨率 PDF 会较慢。如果电脑有 NVIDIA 显卡且安装了 CUDA,可以卸载 CPU 版 PaddlePaddle 并安装 GPU 版:

```bash pip uninstall paddlepaddle pip install paddlepaddle-gpu==2.5.1 ```

3. 识别率不高(如手写字体、繁体)
修改初始化代码中的 lang 参数。PaddleOCR 支持多种语言模型:

  • lang="ch": 简体中文(默认)
  • lang="chinese_cht": 繁体中文
  • lang="en": 英文

如果是表格类的文书档案,可以使用 PaddleOCR 的 Structure 模式,但需要加载更大的模型,参数改为 use_angle_cls=True, lang="ch", table=True,此时返回结果会包含 HTML 格式的表格结构。

AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

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

微信扫码关注安答联动

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

安答联动档案管理系统