from pathlib import Path from app.core.config import settings _ocr_engine = None def get_ocr_engine(): global _ocr_engine if _ocr_engine is None: from paddleocr import PaddleOCR _ocr_engine = PaddleOCR(use_angle_cls=True, lang="ch", show_log=False) return _ocr_engine def run_ocr(image_path: str) -> str: engine = get_ocr_engine() result = engine.ocr(image_path, cls=True) if not result or not result[0]: return "" lines = [] for line in result[0]: if line and len(line) >= 2: text = line[1][0] if text: lines.append(text) return "\n".join(lines) def save_upload_file(user_id: str, question_id: str, filename: str, content: bytes) -> str: ext = Path(filename).suffix.lower() or ".jpg" if ext not in {".jpg", ".jpeg", ".png", ".webp"}: ext = ".jpg" user_dir = Path(settings.UPLOAD_DIR) / user_id user_dir.mkdir(parents=True, exist_ok=True) rel_path = f"{user_id}/{question_id}{ext}" full_path = Path(settings.UPLOAD_DIR) / rel_path full_path.write_bytes(content) return rel_path