背景
有時候我們需要将圖檔中的表格資料提取出來進行再次編輯,但一個字一個字的敲出來是件非常麻煩的事。
有沒有更好的辦法,一鍵提取圖檔中的表格資料,并轉成Excel。
這時候,就需要用到OCR 技術了。
OCR
傳統OCR (Optical Character Recognition,光學字元識别)是指電子裝置(例如掃描器或數位相機)檢查紙上列印的字元,通過檢測暗、亮的模式确定其形狀,然後用字元識别方法将形狀翻譯成計算機文字的過程;即,針對印刷體字元,采用光學的方式将紙質文檔中的文字轉換成為黑白點陣的圖像檔案,并通過識别軟體将圖像中的文字轉換成文本格式,供文字處理軟體進一步編輯加工的技術。
随着深度學習在OCR領域的成功應用,檢測圖像中的文字區域以及識别文字内容已經變得越來越成熟。
圖檔表格轉Excel,先上效果圖
待轉換圖檔
轉換後的Excel
TableOCR
本文使用騰訊的“文字識别OCR”,每月免費1千次,可以滿足大部分普通使用者的需求。
使用準備:
- 申請騰訊雲賬戶secretId,secretKey
- 下載下傳SDK,本文使用的是Python,可通過pip進行安裝:pip install tencentcloud-sdk-python
代碼分享:
import base64from tencentcloud.common import credentialfrom tencentcloud.common.profile.client_profile import ClientProfilefrom tencentcloud.common.profile.http_profile import HttpProfilefrom tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKExceptionfrom tencentcloud.ocr.v20181119 import ocr_client, modelsclass OCR(object): def img_to_excel(self, image_path, secret_id, secret_key): # 執行個體化一個認證對象,入參需要傳入騰訊雲賬戶secretId,secretKey cred = credential.Credential( secret_id, secret_key ) # 執行個體化client對象 httpProfile = HttpProfile() httpProfile.endpoint = "ocr.tencentcloudapi.com" clientProfile = ClientProfile() clientProfile.httpProfile = httpProfile clientProfile.signMethod = "TC3-HMAC-SHA256" client = ocr_client.OcrClient(cred, "ap-guangzhou", clientProfile) # 執行個體化一個請求對象 req = models.GeneralFastOCRRequest() # 讀取圖檔資料,使用Base64編碼 with open(image_path, 'rb') as f: image = f.read() image_base64 = str(base64.b64encode(image), encoding='utf-8') req.ImageBase64 = image_base64 # 通過client對象調用通路接口,傳入請求對象 resp = client.TableOCR(req) # 擷取傳回資料(Data為Base64編碼後的Excel資料) data = resp.Data # 轉換為Excel path_excel = image_path + ".xlsx" with open(path_excel, 'wb') as f: f.write(base64.b64decode(data)) return path_excel
tkGo封裝
import osfrom menu.menu import EMenufrom utils.img.ocr import OCRfrom utils.clipboard.clipboard import Clipboardclass MenuImg(EMenu): LABEL_NAME = "Img" LABEL_IMG_TO_EXCEL = "IMG to Excel" def __init__(self, master=None, cnf={}, **kw): super().__init__(master=master, cnf=cnf, **kw) # 添加主菜單 master.add_cascade(label=self.LABEL_NAME, menu=self) # 添加子菜單-圖檔表格資料轉Excel self.add_command( label=self.LABEL_IMG_TO_EXCEL, command=self.img_to_excel ) @EMenu.thread_run(LABEL_IMG_TO_EXCEL) def img_to_excel(self): # 擷取圖檔檔案路徑 data_type, data_content = Clipboard.get_data() if data_type != Clipboard.DATA_TYPE_FILE: self.msg_box_err("請先複制圖檔檔案", ) return # 使用ocr進行轉換 ocr = OCR() for file in data_content: path_excel = ocr.img_to_excel( image_path=file, secret_id=self.conf.api.TC_OCR_SECRET_ID, secret_key=self.conf.api.TC_OCR_SECRET_KEY ) self.msg_box_info("轉換成功:" + path_excel)
使用說明
步驟1:複制圖檔檔案
步驟2:選擇Img菜單下的IMG to Excel子菜單
步驟3:轉換成功
完整代碼
GitHub上搜尋TheUncleWhoGrowsBeans