import logging from pathlib import Path from typing import List, Optional import easyocr logger = logging.getLogger(__name__) class TweetOCRExtractor: """ Classe responsable de l'extraction de texte à partir de captures d'écran en utilisant EasyOCR. """ def __init__(self, languages: Optional[List[str]] = None): """ Initialise le lecteur EasyOCR. :param languages: Liste des langues à charger (par défaut ['fr', 'en']). """ if languages is None: languages = ['fr', 'en'] self.languages = languages self._reader = None @property def reader(self) -> easyocr.Reader: """ Initialisation tardive (lazy loading) d'EasyOCR pour économiser de la mémoire si non utilisé. """ if self._reader is None: logger.info("Initialisation de l'OCR EasyOCR (ceci peut prendre quelques secondes)...") self._reader = easyocr.Reader(self.languages) return self._reader def extract_text(self, image_path: Path) -> str: """ Extrait le texte d'une image. :param image_path: Chemin vers le fichier image. :return: Texte brut extrait. """ if not image_path.exists(): raise FileNotFoundError(f"Le fichier image n'existe pas : {image_path}") try: # easyocr accepte un chemin de fichier sous forme de string results = self.reader.readtext(str(image_path)) # On joint les blocs de texte détectés text_blocks = [text for (_, text, _) in results] extracted_text = " ".join(text_blocks).strip() return extracted_text except Exception as e: logger.error(f"Erreur lors de l'extraction OCR sur {image_path.name} : {e}") raise RuntimeError(f"Échec de l'OCR : {e}") from e