|
|
from fastapi import FastAPI, UploadFile, File, Request |
|
|
from fastapi.responses import JSONResponse |
|
|
import requests |
|
|
import easyocr |
|
|
from PIL import Image |
|
|
import numpy as np |
|
|
from io import BytesIO |
|
|
|
|
|
app = FastAPI(title="OCR API", description="OCR through URL or Buffer") |
|
|
|
|
|
reader = easyocr.Reader(['en'], gpu=False) |
|
|
|
|
|
def run_ocr(image_bytes): |
|
|
img = Image.open(BytesIO(image_bytes)).convert("RGB") |
|
|
img_np = np.array(img) |
|
|
results = reader.readtext(img_np) |
|
|
|
|
|
parsed = [] |
|
|
output = [] |
|
|
|
|
|
for box, text, conf in results: |
|
|
parsed.append(str(text)) |
|
|
output.append({ |
|
|
"text": str(text), |
|
|
"confidence": float(conf), |
|
|
"bounding_box": [[float(x), float(y)] for x, y in box] |
|
|
}) |
|
|
|
|
|
final_text = " ".join(parsed) |
|
|
|
|
|
return { |
|
|
"results": output, |
|
|
"parsedText": parsed, |
|
|
"finalText": final_text |
|
|
} |
|
|
|
|
|
@app.get("/ocr") |
|
|
async def ocr_url(url: str): |
|
|
try: |
|
|
img_data = requests.get(url, timeout=10).content |
|
|
data = run_ocr(img_data) |
|
|
return JSONResponse({"success": True, **data}) |
|
|
except Exception as e: |
|
|
return JSONResponse({"success": False, "error": str(e)}, status_code=400) |
|
|
|
|
|
@app.post("/ocr") |
|
|
async def ocr_buffer(file: UploadFile = File(...)): |
|
|
try: |
|
|
image_bytes = await file.read() |
|
|
data = run_ocr(image_bytes) |
|
|
return JSONResponse({"success": True, **data}) |
|
|
except Exception as e: |
|
|
return JSONResponse({"success": False, "error": str(e)}, status_code=400) |
|
|
|