调用百度OCR(高精度版)API实现WORD内图片识别

时间:2024-03-11 07:14:31

        前段时间在工作中遇到了一个问题,需要将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 = []

到这里就基本实现了我的需求,后续会继续进行扩展,代码质量不高,求指导交流。