from fastapi import FastAPI , File , UploadFile , Form from datetime import datetime from pydantic import BaseModel import mrzscanner import PIL import json import uvicorn from mrz.checker.td1 import TD1CodeChecker from mrz.checker.td2 import TD2CodeChecker from mrz.checker.td3 import TD3CodeChecker from mrz.checker.mrva import MRVACodeChecker from mrz.checker.mrvb import MRVBCodeChecker import cv2 import uuid import numpy as np import gradio as gr CUSTOM_PATH = "/gradio" app = FastAPI() def check(lines): try: td1_check = TD1CodeChecker(lines) if bool(td1_check): return "TD1", td1_check.fields() except Exception as err: pass try: td2_check = TD2CodeChecker(lines) if bool(td2_check): return "TD2", td2_check.fields() except Exception as err: pass try: td3_check = TD3CodeChecker(lines) if bool(td3_check): return "TD3", td3_check.fields() except Exception as err: pass try: mrva_check = MRVACodeChecker(lines) if bool(mrva_check): return "MRVA", mrva_check.fields() except Exception as err: pass try: mrvb_check = MRVBCodeChecker(lines) if bool(mrvb_check): return "MRVB", mrvb_check.fields() except Exception as err: pass return 'No valid MRZ information found' import cv2 def get_info(scanner,img,file_type): s="" if file_type=="image": image_np=np.frombuffer(img,dtype=np.uint8) img_np=cv2.imdecode(image_np,cv2.IMREAD_COLOR) elif file_type=="pdf": img_np = np.array(img) else: img_np = np.array(img) results = scanner.decodeMat(img_np) lst1=[] lst=[] for result in results: s += result.text + '\n' lst1.append(result.text+ '\n') str1="" str1=str1.join(lst1[-2:]) if check(str1[:-1]) == "No valid MRZ information found": try: ed=(TD3CodeChecker(str1[:-1],check_expiry=False,compute_warnings=True)) lst.append(ed.fields()) return lst except: return [] else: lst.append(check(str1[:-1])) return lst def extract_result(lst): x=0 final_lst=[] if type(lst[x])==tuple: temp_lst=[] surname=lst[x][1][0] name=lst[x][1][1] country=lst[x][1][2] nationality=lst[x][1][3] try: birth_date=datetime.strptime(lst[x][1][4], '%y%m%d').strftime('%d/%m/%Y') print(birth_date) expiry_date=datetime.strptime(lst[x][1][5], '%y%m%d').strftime('%d/%m/%Y') year=datetime.strptime(lst[x][1][5], '%y%m%d').year month=datetime.strptime(lst[x][1][5], '%y%m%d').month day=datetime.strptime(lst[x][1][5], '%y%m%d').day if nationality=='TWN': year-=5 else: year-=10 if nationality=='IND' or nationality=='CHN' or nationality=='BRA' or nationality=='IMD' or country=='IMD': if str(day)=="31": day=1 month+=1 else: day+=1 str_day=day str_month=month if len(str(day))==1: str_day="0"+str(day) if len(str(month))==1: str_month="0"+str(month) issue_date=str(str_day)+"/"+str(str_month)+"/"+str(year) except: # print("I am in 1st except") birth_date=lst[x][1][4]#datetime.strptime(lst[x][1][4], '%y%m%d').strftime('%d/%m/%Y') expiry_date=lst[x][1][5]#datetime.strptime(lst[x][1][5], '%y%m%d').strftime('%d/%m/%Y') # print(birth_date) issue_date=expiry_date document_type=lst[x][1][7] document_number=lst[x][1][8] # print(document_number) temp_lst.append([surname,name,country,birth_date,expiry_date,document_number,issue_date]) #temp_lst.append([surname,name,country,nationality,birth_date,expiry_date,document_type,document_number]) final_lst.append(temp_lst) else: temp_lst=[] surname=lst[x][0] name=lst[x][1] country=lst[x][2] nationality=lst[x][3] try: birth_date=datetime.strptime(lst[x][4], '%y%m%d').strftime('%d/%m/%Y') # print(birth_date) expiry_date=datetime.strptime(lst[x][5], '%y%m%d').strftime('%d/%m/%Y') year=datetime.strptime(lst[x][5], '%y%m%d').year month=datetime.strptime(lst[x][5], '%y%m%d').month day=datetime.strptime(lst[x][5], '%y%m%d').day if nationality=='TWN': year-=5 else: year-=10 if country=='IND' or nationality=='CHN' or nationality=='BRA' or nationality=='IMD' or country=='IMD' : if str(day)=="31": day=1 month+=1 else: day+=1 str_day=day str_month=month if len(str(day))==1: str_day="0"+str(day) if len(str(month))==1: str_month="0"+str(month) issue_date=str(str_day)+"/"+str(str_month)+"/"+str(year) except: birth_date=lst[x][4]#datetime.strptime(lst[x][4], '%y%m%d').strftime('%d/%m/%Y') expiry_date=lst[x][5]#datetime.strptime(lst[x][5], '%y%m%d').strftime('%d/%m/%Y') issue_date=expiry_date # print("I am in 2nd except") #print(birth_date) # print(datetime.strptime(lst[x][4], '%y%m%d').strftime('%d/%m/%Y')) # print(datetime.strptime(lst[x][4], '%y%m%d')) document_type=lst[x][7] document_number=lst[x][8] # print(document_number) if document_type=="P" or document_type=="p":# or document_type=="PM" or document_type=="PO": temp_lst.append([surname,name,country,birth_date,expiry_date,document_number,issue_date]) print(temp_lst) else: print(lst) temp_lst.append("The attached document is not a Passport") #temp_lst.append([surname,name,country,nationality,birth_date,expiry_date,document_type,document_number]) final_lst.append(temp_lst) return temp_lst def return_df(final_lst): if final_lst[0]=="The attached document is not a Passport": return "The attached document is not a Passport" else: columns = ['family_name','given_name','country','date_of_birth','expiration','passport_number','issue_date'] #columns = ['family_name','given_name','country','nationality','date_of_birth','expiration','document_type','passport_number'] res = {columns[i]: final_lst[0][i] for i in range(len(columns))} json_en=json.dumps(res) return json.loads(json_en) class encodedImage(BaseModel): base64img:str @app.post('/') async def _file_upload(img:UploadFile = File(...)): file_type="" if "pdf" in img.filename: file_type="pdf" import pypdfium2 as pdfium img1 = await img.read() # <-- Important! pdf = pdfium.PdfDocument(img1) for x in range(len(pdf)): page = pdf.get_page(x) pil_image = page.render_to(pdfium.BitmapConv.pil_image,) pil_image.filename = f"{uuid.uuid4()}.jpg" mrzscanner.initLicense("DLS2eyJoYW5kc2hha2VDb2RlIjoiMTAxNjIyNjAzLVRYbEVaWE5yZEc5d1VISnZhbDlrYkhJIiwib3JnYW5pemF0aW9uSUQiOiIxMDE2MjI2MDMiLCJjaGVja0NvZGUiOjE4ODA3MzYyNzN9") # mrzscanner.initLicense("DLS2eyJoYW5kc2hha2VDb2RlIjoiMjAwMDAxLTE2NDk4Mjk3OTI2MzUiLCJvcmdhbml6YXRpb25JRCI6IjIwMDAwMSIsInNlc3Npb25QYXNzd29yZCI6IndTcGR6Vm05WDJrcEQ5YUoifQ==") scanner = mrzscanner.createInstance() scanner.loadModel(mrzscanner.get_model_path()) lst=get_info(scanner, pil_image,file_type) if lst: break else: file_type="image" img.filename = f"{uuid.uuid4()}.jpg" contents = await img.read() # <-- Important! mrzscanner.initLicense("DLS2eyJoYW5kc2hha2VDb2RlIjoiMTAxNjIyNjAzLVRYbEVaWE5yZEc5d1VISnZhbDlrYkhJIiwib3JnYW5pemF0aW9uSUQiOiIxMDE2MjI2MDMiLCJjaGVja0NvZGUiOjE4ODA3MzYyNzN9") # mrzscanner.initLicense("DLS2eyJoYW5kc2hha2VDb2RlIjoiMjAwMDAxLTE2NDk4Mjk3OTI2MzUiLCJvcmdhbml6YXRpb25JRCI6IjIwMDAwMSIsInNlc3Npb25QYXNzd29yZCI6IndTcGR6Vm05WDJrcEQ5YUoifQ==") scanner = mrzscanner.createInstance() scanner.loadModel(mrzscanner.get_model_path()) lst=get_info(scanner, contents,file_type) if lst: final_lst=extract_result(lst) json_file=return_df(final_lst) success=False errorMessage="error" isPassport=True if json_file=="The attached document is not a Passport": success=False errorMessage="The attached document is not a Passport" isPassport=False json_file="" else: success=True errorMessage="None" x = {"success": success,"errorMessage": errorMessage,"isPassport":isPassport, "data": [json_file]} else: x = {"success": False,"errorMessage": "Image Not identified","isPassport":False, "data": []} return json.loads(json.dumps(x)) def func(): return "Parsing International Passports" def main(img): # set license. mrzscanner.initLicense("DLS2eyJoYW5kc2hha2VDb2RlIjoiMTAxNjIyNjAzLVRYbEVaWE5yZEc5d1VISnZhbDlrYkhJIiwib3JnYW5pemF0aW9uSUQiOiIxMDE2MjI2MDMiLCJjaGVja0NvZGUiOjE4ODA3MzYyNzN9") #mrzscanner.initLicense("DLS2eyJoYW5kc2hha2VDb2RlIjoiMjAwMDAxLTE2NDk4Mjk3OTI2MzUiLCJvcmdhbml6YXRpb25JRCI6IjIwMDAwMSIsInNlc3Npb25QYXNzd29yZCI6IndTcGR6Vm05WDJrcEQ5YUoifQ==") scanner = mrzscanner.createInstance() scanner.loadModel(mrzscanner.get_model_path()) lst=get_info(scanner,img) final_lst=extract_result(lst) json_file=return_df(final_lst) return json_file import gradio as gr io = gr.Interface(func,None,"label") #io = gr.Interface(lambda x: "Hello, " + x + "!", "textbox", "textbox") #io = gr.Interface(fn=main, inputs="image", outputs="json") app = gr.mount_gradio_app(app, io,"/",gradio_api_url="http://localhost:7860/") #gradio_app = gr.routes.App.create_app(io) #app = gr.mount_gradio_app(app, block, "/", gradio_api_url="http://localhost:7860/") #app.mount("/img", StaticFiles(directory="images", html=True), name="images") uvicorn.run(app, host="0.0.0.0", port=7860) #app.mount(CUSTOM_PATH, gradio_app) #io.launch()