调用百度OCR(高精度版)API实现WORD内图片识别
前段时间在工作中遇到了一个问题,需要将WORD中图片提取出来并转换为文字存入新WORD中,思考了一会,想到可以用百度OCR API来实现,步骤如下:
先定义一下基本属性:
class OcrPictures(object):
def __init__(self):
self.access_token = None # access_token # 百度API的access_token
self.path = # 放上本地图片文件夹路径
self.pic = [] # 将本地图片添加到该列表
self.original_result = None # 调用百度API识别图片的原始结果
self.paragraph = '' # 将结果拆分为段落
self.final_result = [] # 将段落添加到最终结果列表
1.将WORD转换为.zip并解压得到WORD内图片
将WORD后缀名改为.zip
解压该文件
\word\media目录下为WORD内图片
2.百度智能控制台创建应用获取API Key和Secret Key
参考网上教程
3.通过API Key和Secret Key获取的access_token
def get_access_token(self):
# 获取access_token
# client_id 为官网获取的AK, client_secret 为官网获取的SK
# return access_token
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【官网获取的AK】&client_secret=【官网获取的SK】'
response = requests.get(host)
if response:
self.access_token = response.json()['access_token']
4.将文件夹内的图片存入列表并进行排序
def get_pic_list(self):
# 将文件夹内的图片进行排序
for filename in os.listdir(# 此处放入需要识别的图片文件夹路径):
pattern = re.compile(r'\d+', re.I) # 匹配图片数字id
m = pattern.match(filename, 5, 20) # 匹配图片数字id
self.pic.append(int(m.group(0))) # 添加到图片列表
self.pic.sort() # 排序
return self.pic
5.将图片进行base64转码后进行urlencode(二进制方式打开图片并控制识别张数)
def ocr_pic(self):
# 获取图片解析结果
OcrPictures.get_access_token(self)
OcrPictures.get_pic_list(self)
request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic"
# 二进制方式打开图片文件
for id in self.pic: # id是图片编号
f = open(self.path + r'\image{}.jpg'.format(id), 'rb')
img = base64.b64encode(f.read())
params = {"image":img, "paragraph":"true"} # 打开识别段落功能
access_token = self.access_token
request_url = request_url + "?access_token=" + access_token
headers = {'content-type': 'application/x-ww-form-urlencoded'}
response = requests.post(request_url, data=params, headers=headers) # 提交请求
if response:
self.original_result = response.json()
OcrPictures.handle_result(self)
if id == 15: # 控制识别图片张数
break
6、对识别结果进行处理
def handle_result(self):
# 对结果格式进行处理
# 1、提取段落信息
# 2、提取段落内容
for i in self.original_result['paragraphs_result']:
for j in map(lambda x: self.original_result['words_result'][x]['words'], i['words_result_idx']):
self.paragraph = self.paragraph + j
self.final_result.append(self.paragraph)
self.paragraph = ''
for k in self.final_result:
detent_text = textwrap.dedent(k).strip()
print(textwrap.fill(detent_text,
initial_indent=' ',
subsequent_indent='',
width=46))
self.final_result = []
到这里就基本实现了我的需求,后续会继续进行扩展,代码质量不高,求指导交流。
作者:exernity
出处:https://www.cnblogs.com/skyless/
版权:本文版权归作者和博客园共有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
免责声明:此文章仅为个人学习、分享知识用,如有侵权,请联系博主进行删除
出处:https://www.cnblogs.com/skyless/
版权:本文版权归作者和博客园共有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
免责声明:此文章仅为个人学习、分享知识用,如有侵权,请联系博主进行删除

浙公网安备 33010602011771号