# Import FastAPI Libs from pydantic import BaseModel # Import Qcloud OCR Service Libs from tencentcloud.common import credential from tencentcloud.common.profile.client_profile import ClientProfile from tencentcloud.common.profile.http_profile import HttpProfile from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException from tencentcloud.ocr.v20181119 import ocr_client, models # Import Other Common Libs import json import base64 import os # ------------------------------------------------ # Define constants # ------------------------------------------------ c_ret_code_success = 0 c_ret_code_error = 1 region = 'ap-shanghai' user_name = 'ocr-program' credential_file = '/home/oracle/python/apex/credential/credential.json' # credential_file = 'C://PyCharmProjects//qcloud-service//config//credential.json' # ------------------------------------------------ # Define OCR Request Service Request and Response # ------------------------------------------------ class ocr_req_basemodel(BaseModel): ocr_tool: str # Q: Qcloud, LP: Local PaddleOCR dir: str file_name: str class ocr_res_basemodel(BaseModel): result: int result_message: str detected_text: list # ------------------------------------------------ # Get credentials # ------------------------------------------------ def get_credentials(file: str, user_name: str) -> tuple: try: # Open and read the JSON file with open(file, "r") as credential_file: data = json.load(credential_file) # Access data from the JSON secret_id = data['ocr'][user_name]['secret_id'] secret_key = data['ocr'][user_name]['secret_key'] return secret_id, secret_key except Exception as e: print(e) return None, None # ------------------------------------------------ # Function of OCR request to Qcloud COS # ------------------------------------------------ def get_detected_text(ocr_req: ocr_req_basemodel) -> tuple: ret_code = c_ret_code_success err_msg = "" try: secret_id, secret_key = get_credentials(credential_file, user_name) # 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密 # 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305 # 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 cred = credential.Credential(secret_id, secret_key) # 实例化一个http选项,可选的,没有特殊需求可以跳过 httpProfile = HttpProfile() httpProfile.endpoint = "ocr.tencentcloudapi.com" # 实例化一个client选项,可选的,没有特殊需求可以跳过 clientProfile = ClientProfile() clientProfile.httpProfile = httpProfile # 实例化要请求产品的client对象,clientProfile是可选的 client = ocr_client.OcrClient(cred, region, clientProfile) # 打开文件 file_location = os.path.normpath(os.path.join(ocr_req.dir, ocr_req.file_name)) with open(file_location, "rb") as image_file: encoded_string = base64.b64encode(image_file.read()).decode('utf-8') # print(encoded_string) # Remove file os.remove(file_location) # 实例化一个请求对象,每个接口都会对应一个request对象 req = models.GeneralHandwritingOCRRequest() params = { "ImageBase64": encoded_string } req.from_json_string(json.dumps(params)) # 返回的resp是一个GeneralHandwritingOCRResponse的实例,与请求对象对应 resp = client.GeneralHandwritingOCR(req) # 输出json格式的字符串回包 # print(resp.to_json_string()) list_detected_text = [] for text_detection in (json.loads(resp.to_json_string()))['TextDetections']: # print(text_detection['DetectedText']) list_detected_text.append(text_detection['DetectedText']) ocr_res = ocr_res_basemodel( result = ret_code, result_message = err_msg, detected_text = list_detected_text ) return ocr_res except TencentCloudSDKException as err: ret_code = c_ret_code_error err_msg = str(err) ocr_res = ocr_res_basemodel( result = ret_code, result_message = err_msg, detected_text = [] ) return ocr_res