使用paddleOCR识别PDF文件
业务场景:通过识别pdf文件来获取数据,然后填充到表单上展示数据,
为什么会有这样的功能:填写数据主要有两种方式:第一种:通过手动的方式在表单上填写数据,第二种:通过识别文件或者第三方手段获取数据
这里采用的是第二种:通过识别pdf文件获取数据最后在表单上展示数据
一、paddleOCR介绍
PaddleOCR 是一个基于 PaddlePaddle 深度学习框架的 OCR(光学字符识别)工具。它旨在为用户提供快速、准确的文本检测和识别功能。以下是 PaddleOCR 的一些主要特点和功能介绍:
1. 功能特点
- 多语言支持:PaddleOCR 支持多种语言的文本识别,包括中文、英文、法文、德文、日文、韩文等。用户可以根据需要选择特定语言的模型。
- 强大的模型库:提供了多种预训练的模型,包括:
- 文本检测模型(如 DB、EAST、FCE等)
- 文本识别模型(如 CRNN、SVTR、PP-OCR)
- 布局分析模型(如 LayoutXLM)
- 高效的文本检测:能够快速检测图像中的文本区域,支持多种文本布局,包括水平文本和倾斜文本。
- 易于使用:PaddleOCR 提供简单易用的接口,用户只需调用少量函数即可实现文本识别功能。
- 开源:PaddleOCR 是一个开源项目,用户可以在其 GitHub 页面上找到源代码和文档。
2. 应用场景
PaddleOCR 可以广泛应用于各种场景,包括但不限于:
- 文档数字化:将纸质文档中的文本转换为电子文本,方便存档和检索。
- 名片识别:自动提取名片上的信息,如姓名、公司和联系方式。
- 票据识别:从发票、收据等票据中提取文本信息。
- 自动翻译:与翻译系统结合,将图像中的文本进行翻译。
- 自动化表单填写:从表单中提取文本并填入系统中。
二、环境搭建
注意:
- 需要具备python环境
- 安装conda
- 安装conda
conda 是一个常用的 python 包管理器 安装 conda 后,可以安装 python 环境,以及 numpy 等所需的工具包环境。
设置:路径(查看paddleOCR项目简介:在quickstart.md文件中)
- 打开终端并创建Conda环境
#在命令行输入以下命令,创建一个名为 paddle_env 的环境
#这里为了加快下载速度,使用清华源码
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
#这是一行命令
- 激活刚刚创建的Conda 环境(进入了paddle_env环境)
#激活 paddle_env 环境
conda activate paddle_env
#查看python的当前位置
where python
- 在paddle_env环境中安装PaddlePaddle 2.0(CPU版本)
pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple
三、测试效果
from paddleocr import PaddleOCR, draw_ocr
# Paddleocr目前支持的多语言语种可以通过修改lang参数进行切换
# 例如`ch`, `en`, `fr`, `german`, `korean`, `japan`
PAGE_NUM = 23 # 将识别页码前置作为全局,防止后续打开pdf的参数和前文识别参数不一致 / Set the recognition page number
pdf_path = './imgs/test_2024-09-23.pdf'
ocr = PaddleOCR(use_angle_cls=True, lang="ch", page_num=PAGE_NUM) # need to run only once to download and load model into memory
# ocr = PaddleOCR(use_angle_cls=True, lang="ch", page_num=PAGE_NUM,use_gpu=0) # 如果需要使用GPU,请取消此行的注释 并注释上一行 / To Use GPU,uncomment this line and comment the above one.
result = ocr.ocr(pdf_path, cls=True)
for idx in range(len(result)):
res = result[idx] # result:是每一页的数组
if res == None: # 识别到空页就跳过,防止程序报错 / Skip when empty result detected to avoid TypeError:NoneType
print(f"[DEBUG] Empty page {idx+1} detected, skip it.")
continue
for line in res:
print(line)
# 显示结果
import fitz
from PIL import Image
import cv2
import numpy as np
imgs = []
with fitz.open(pdf_path) as pdf:
for pg in range(0, PAGE_NUM):
page = pdf[pg]
mat = fitz.Matrix(2, 2)
pm = page.get_pixmap(matrix=mat, alpha=False)
# if width or height > 2000 pixels, don't enlarge the image
if pm.width > 2000 or pm.height > 2000:
pm = page.get_pixmap(matrix=fitz.Matrix(1, 1), alpha=False)
img = Image.frombytes("RGB", [pm.width, pm.height], pm.samples)
img = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
imgs.append(img)
for idx in range(len(result)):
res = result[idx]
if res == None:
continue
image = imgs[idx]
boxes = [line[0] for line in res]
txts = [line[1][0] for line in res]
scores = [line[1][1] for line in res]
im_show = draw_ocr(image, boxes, txts, scores, font_path='doc/fonts/simfang.ttf')
im_show = Image.fromarray(im_show)
im_show.save('result_page_{}.jpg'.format(idx))