使用paddleOCR识别PDF文件

使用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
  1. 安装conda

conda 是一个常用的 python 包管理器 安装 conda 后,可以安装 python 环境,以及 numpy 等所需的工具包环境。

设置:路径(查看paddleOCR项目简介:在quickstart.md文件中)

  1. 打开终端并创建Conda环境
#在命令行输入以下命令,创建一个名为 paddle_env 的环境
#这里为了加快下载速度,使用清华源码
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
 #这是一行命令

  1. 激活刚刚创建的Conda 环境(进入了paddle_env环境)
#激活 paddle_env 环境
conda activate paddle_env
#查看python的当前位置
where python
  1. 在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))
### PyCharm 打开文件显示不全的解决方案 当遇到PyCharm打开文件显示不全的情况时,可以尝试以下几种方法来解决问题。 #### 方法一:清理缓存并重启IDE 有时IDE内部缓存可能导致文件加载异常。通过清除缓存再启动程序能够有效改善此状况。具体操作路径为`File -> Invalidate Caches / Restart...`,之后按照提示完成相应动作即可[^1]。 #### 方法二:调整编辑器字体设置 如果是因为字体原因造成的内容显示问题,则可以通过修改编辑区内的文字样式来进行修复。进入`Settings/Preferences | Editor | Font`选项卡内更改合适的字号大小以及启用抗锯齿功能等参数配置[^2]。 #### 方法三:检查项目结构配置 对于某些特定场景下的源码视图缺失现象,可能是由于当前工作空间未能正确识别全部模块所引起。此时应该核查Project Structure里的Content Roots设定项是否涵盖了整个工程根目录;必要时可手动添加遗漏部分,并保存变更生效[^3]。 ```python # 示例代码用于展示如何获取当前项目的根路径,在实际应用中可根据需求调用该函数辅助排查问题 import os def get_project_root(): current_file = os.path.abspath(__file__) project_dir = os.path.dirname(current_file) while not os.path.exists(os.path.join(project_dir, '.idea')): parent_dir = os.path.dirname(project_dir) if parent_dir == project_dir: break project_dir = parent_dir return project_dir print(f"Current Project Root Directory is {get_project_root()}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值