Spaces:
Running
Running
| from fastapi import FastAPI, HTTPException, Body | |
| from pydantic import BaseModel | |
| import numpy as np | |
| import cv2 | |
| import base64 | |
| from typing import Dict, List, Any | |
| import os | |
| import sys | |
| # Add current directory to path to ensure imports work | |
| sys.path.append(os.path.dirname(os.path.abspath(__file__))) | |
| from ocr_processors import OCRManager | |
| from unified_extractors import Vendor, VendorSchemaManager | |
| app = FastAPI(title="OCR Service") | |
| # Initialize managers globally | |
| ocr_manager = OCRManager() | |
| schema_manager = VendorSchemaManager() | |
| class OCRRequest(BaseModel): | |
| image: str # Base64 encoded image | |
| vendor_id: str | |
| def health_check(): | |
| return {"status": "ok", "service": "OCR Service"} | |
| def process_image(request: OCRRequest): | |
| try: | |
| # Decode image | |
| image_data = base64.b64decode(request.image) | |
| nparr = np.frombuffer(image_data, np.uint8) | |
| image = cv2.imdecode(nparr, cv2.IMREAD_COLOR) | |
| if image is None: | |
| raise HTTPException(status_code=400, detail="Invalid image data") | |
| # Resolve vendor | |
| try: | |
| vendor = Vendor(request.vendor_id) | |
| except ValueError: | |
| # Fallback for unknown vendors if necessary, or error | |
| # For now, let's assume valid vendor or default | |
| vendor = Vendor.DEFAULT | |
| # Extract text using the EXACT same logic as the original app | |
| # The OCRManager inside this service is the original code | |
| results = ocr_manager.extract_text_with_positions( | |
| image, | |
| vendor, | |
| schema_manager | |
| ) | |
| return {"status": "success", "text_blocks": results} | |
| except Exception as e: | |
| print(f"ERROR in OCR Service: {str(e)}") | |
| import traceback | |
| traceback.print_exc() | |
| raise HTTPException(status_code=500, detail=str(e)) | |
| if __name__ == "__main__": | |
| import uvicorn | |
| uvicorn.run(app, host="0.0.0.0", port=7860) | |