e329d3398a
Add FastAPI/React app with Docker deployment, Ubuntu one-click install, and docs for junior/senior high score tracking and mistake bank. Co-authored-by: Cursor <cursoragent@cursor.com>
41 lines
1.1 KiB
Python
41 lines
1.1 KiB
Python
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
|