## 使用阿里云的读光ocr来把图片表格转为Excel
## @suyin
## 2020-06-19
## 读光 高精版 还有个一般精度的,可以搜索
https://duguang.aliyun.com/document/%E9%AB%98%E7%B2%BE%E7%89%88.html
# {
# //图像数据:base64编码,要求base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,和url参数只能同时存在一个
# "img": "",
# //图像url地址:图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,和img参数只能同时存在一个
# "url": "",
# //是否需要识别结果中每一行的置信度,默认不需要。 true:需要 false:不需要
# "prob": false,
# //是否需要单字识别功能,默认不需要。 true:需要 false:不需要
# "charInfo": false,
# //是否需要自动旋转功能,默认不需要。 true:需要 false:不需要
# "rotate": false,
# //是否需要表格识别功能,默认不需要。 true:需要 false:不需要
# "table": false,
# //字块返回顺序,false表示从左往右,从上到下的顺序,true表示从上到下,从左往右的顺序,默认false
# "sortPage": false
# }
import urllib.request
import urllib.parse
import json
import time
import base64
jpg_path = 'test_orc__v3'
with open(jpg_path + '.jpg', 'rb') as f: # 以二进制读取本地图片
data = f.read()
encodestr = str(base64.b64encode(data),'utf-8')
#请求头
# 请修改为你自己的appcode,可从云市场订单或者api网关处获得
# 去注册了就在后台可以看到,把xxxxx改为你的appcode就好了
AppCode = "xxxxxx"
headers = {
'Authorization': 'APPCODE ' + AppCode,
'Content-Type': 'application/json; charset=UTF-8'
}
def posturl(url, data={}):
try:
params = json.dumps(dict).encode(encoding='UTF8')
req = urllib.request.Request(url, params, headers)
r = urllib.request.urlopen(req)
html =r.read()
r.close();
return html.decode("utf8")
except urllib.error.HTTPError as e:
print(e.code)
print(e.read().decode("utf8"))
time.sleep(1)
url_request = "https://ocrapi-advanced.taobao.com/ocrservice/advanced"
dict = {'img': encodestr,
'rotate': True,
'table': True}
html = posturl(url_request, data=dict)
# print(html)
text = json.loads(html)
# text
# text['prism_tablesInfo']
# //表格中单元格id,和prism_wordsInfo信息中的tableCellId对应
# "tableCellId": 0,
# //单元格中的文字
# "word": ":2017",
# //xStartCell缩写,表示横轴方向该单元格起始在第几个单元格,第一个单元格值为0
# "xsc": 0,
# //xEndCell缩写,表示横轴方向该单元格结束在第几个单元格,第一个单元格值为0,如果xsc和xec都为0说明该文字在横轴方向占据了一个单元
# 格并且在第一个单元格内
# "xec": 0,
# //yStartCell缩写,表示纵轴方向该单元格起始在第几个单元格,第一个单元格值为0
# "ysc": 0,
# //yEndCell缩写,表示纵轴方向该单元格结束在第几个单元格,第一个单元格值为0
# "yec": 0,
# //单元格位置,按照单元格四个角的坐标顺时针排列,分别为左上XY坐标、右上XY坐标、右下XY坐标、左下XY坐标
# "pos": [
# {
# "x": 107,
# "y": 203
# },
# {
# "x": 247,
# "y": 203
# },
xCellSize = text['prism_tablesInfo'][0]['xCellSize']
yCellSize = text['prism_tablesInfo'][0]['yCellSize']
word = text['prism_tablesInfo'][0]['cellInfos'][0]['word']
xsc = text['prism_tablesInfo'][0]['cellInfos'][0]['xsc']
xec = text['prism_tablesInfo'][0]['cellInfos'][0]['xec']
ysc = text['prism_tablesInfo'][0]['cellInfos'][0]['ysc']
yec = text['prism_tablesInfo'][0]['cellInfos'][0]['yec']
print('xCellSize:', xCellSize)
print('yCellSize:', yCellSize)
print('word:', word)
print('xsc:', xsc)
print('xec:', xec)
print('ysc:', ysc)
print('yec:', yec)
# !pip install xlwt
# http://www.ityouknow.com/python/2019/12/29/python-excel-103.html
# workbook = xlwt.Workbook(encoding='utf-8')
# worksheet = workbook.add_sheet('sheet1')
# #通过worksheet调用merge()创建合并单元格
# #第一个和第二个参数单表行合并,第三个和第四个参数列合并,
# #合并第0列到第2列的单元格
# worksheet.write_merge(0, 0, 0, 2, 'first merge')
# #合并第1行第2行第一列的单元格
# worksheet.write_merge(0, 1, 0, 0, 'first merge')
# workbook.save('students.xls')
# 导入 xlwt 库
import xlwt
# 创建 xls 文件对象
wb = xlwt.Workbook()
# 新增两个表单页
sheet_name = 'test'
sh1 = wb.add_sheet(sheet_name, cell_overwrite_ok=True)
# 数据写入Excel
# len(text['prism_tablesInfo'])
# 有多个table
prism_tablesInfo = text['prism_tablesInfo']
for table in prism_tablesInfo:
cellInfos = table['cellInfos']
for cell in cellInfos:
word = cell['word']
xsc = cell['xsc']
xec = cell['xec']
ysc = cell['ysc']
yec = cell['yec']
sh1.write(ysc, xsc, word)
# sh1.write_merge(ysc, yec, xsc, xec, word)
# print('word:', word, '-xsc:', xsc, 'xec:', xec, 'ysc:', ysc, 'yec:', yec)
# 最后保存文件即可
save_file = 'ocr测试__V4'
wb.save(save_file + '.xls')