前段时间在工作中遇到了一个问题,需要将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 = []
到这里就基本实现了我的需求,后续会继续进行扩展,代码质量不高,求指导交流。