Python 调用 Umi-OCR API 批量识别图片/PDF文档数据 Python 调用 Umi-OCR API 实现批量识别图片/PDF文档数据

目录

一、需求分析

二、方案设计(概要/详细)

三、技术选型

四、OCR 测试 Demo

五、批量文件识别完整代码实现 

六、总结


一、需求分析

        市场部同事进行采购或给客户报价时,往往基于过往采购合同数据,给出现在采购或报价的金额区间,现需要整合过往已有合同数据进行录入,以Excel 表格形式,方便市场部同事查找和计算。

二、方案设计(概要/详细)

        由于合同文件数据类型多样,格式复杂(样式不固定,且不是单纯的文本文字)于是在数据录入过程中需要进行如下几步操作:

  • 数据分类

如果一个PDF包含图像,通常是由扫描仪或者拍照设备生成的PDF。遍历所有的文件判断每一页是否含有图像。把所有文件分成两类,有图(扫描或拍照生成的PDF)或无图(Word转PDF)

  • 数据清洗刷选,校准

a.对于格式相对固定的Word转PDF文件,将数据可以全部获取,使用模板匹配提取关键字段(如采购名称、数量、价格、日期等)。在按照关键词(金额,时间等)匹配,并写道Excel A中,并对得到的数据内容进行验证校准。

b.扫描或拍照生成的PDF,使用OCR光学识别,将PDF页面转化成图片,然后再识别图片内容,进行关键词匹配并写道Excel B中,并对得到的数据内容进行验证校准。

  • 数据整合

设计好最终需要的Excel要有哪些字段,然后将Excel A 和 Excel B 按照时间排序归并到最终的Excel中 (所有的数据按照时间都存到一个sheet中,方便后期直接查询)

三、技术选型

        由于要用到一些数据处理上的方法,使用 Python 会简单一点 ,同时这只是一个简单的需求,不算是一个正规的项目,应该越快越简单越好 Python 作为脚本语言是很好的选择 ,于是采用的技术栈就是 Python + OCR 

四、OCR 测试 Demo

import pytesseract
import codecs
from PIL import Image
if __name__ == '__main__':
 # 指定 Tesseract 安装路径
 pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
 im = Image.open('./test.png')
 result = pytesseract.image_to_string(im, lang='chi_sim')
 print(result)
 # 首先导入codecs库,用codecs.open()方法创建并打开一个名为output.txt的文件,以utf-8编码模式写入result
 with codecs.open('output.txt', 'w', encoding='utf-8') as f:
 f.write(result)

        这种方式只能识别简单的图片文本内容,但是对于拍照,扫描版,以及图片中含有表格的形式,都无法识别。 

 

识别结果

        于是更换思路,自己实现OCR难度较大且识别效果不好,经过调研之后,发现GitHub 上有一个开源的OCR 识别工具,可以直接调用里面的API接口,不用自己写OCR 识别方法了。

        Umi-OCR总结有几大特点:免费、方便、高效、灵活 支持繁中、英语、日语等语言,使用不同的识别引擎就能识别不同种类的文字,并且给开发者提供Http服务,使用api的方式,让不同的编程语言都调用接口。

Release Umi-OCR v2.1.4 · hiroi-sora/Umi-OCR

下面给出安装包的下载地址 

Release Umi-OCR v2.1.4 · hiroi-sora/Umi-OCR

测试结果:

说明:在测试的时候,OCR工具记得打开,否则连接不上

五、批量文件识别完整代码实现 

import requests
import json
import openpyxl
import os
import base64
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
from PIL import Image
from io import BytesIO
from openpyxl import Workbook
from openpyxl.drawing.image import Image as ExcelImage
import fitz # PyMuPDF
# compress_image 功能:压缩图片,确保其文件大小不超过指定的最大值。 参数:image_path (str): 图片文件的路径。 max_size_kb (int, 默认值 1024): 图片的最大文件大小(单位:KB)。
# 逻辑:
# 打开图片并获取其 EXIF 信息。
# 获取原始图片的尺寸。
# 使用循环尝试不同的质量参数,直到文件大小小于或等于 max_size_kb 或质量参数降到 10 以下。
# 保存压缩后的图片,确保其尺寸与原始图片一致。
# 返回压缩后的图片对象。
def compress_image(image_path, max_size_kb=1024):
 print("进入压缩方法")
 # 打开图片
 img = Image.open(image_path)
 # 保留图片的 EXIF 信息
 exif_data = img.info.get('exif', None)
 # 获取原始图片的尺寸
 original_size = img.size
 # 尝试不同的质量参数,直到文件大小小于或等于 max_size_kb
 quality = 95
 while True:
 # 保存压缩后的图片,保留 EXIF 信息
 img.save(image_path, format=img.format, optimize=True, quality=quality, exif=exif_data)
 # 检查文件大小
 file_size_kb = os.path.getsize(image_path) / 1024
 if file_size_kb 

六、总结

        当然,以上只是根据实际情况简单实现了一下后端数据录入的工作,要实现数据闭环还需要匹配对应的文件上传功能以及前端页面展示,在此不给予展示实现过程。

作者:白白白鲤鱼原文地址:https://blog.csdn.net/weixin_49171365/article/details/144087476

%s 个评论

要回复文章请先登录注册