diff --git a/anonymizer_core_refactored_onnx.py b/anonymizer_core_refactored_onnx.py index 1b851b8..171c7c1 100644 --- a/anonymizer_core_refactored_onnx.py +++ b/anonymizer_core_refactored_onnx.py @@ -4279,6 +4279,30 @@ def process_pdf( cfg = load_dictionaries(config_path) pages_text, tables_lines, ocr_used, ocr_word_map = extract_text_with_fallback_ocr(pdf_path) + # Q-1 B-3 : pré-flight texte vide. Si moins de SEUIL_TEXTE_MINI caractères + # extraits, c'est probablement un scan non-OCRisé ou un document corrompu. + # On NE traite PAS — quarantaine totale, le doc original est copié pour + # ré-essai manuel. + extracted_chars = sum(len(p) for p in pages_text) + if extracted_chars < SEUIL_TEXTE_MINI: + log.warning("Preflight failed for %s: only %d chars extracted (seuil=%d)", + pdf_path.name, extracted_chars, SEUIL_TEXTE_MINI) + if quarantine_mgr is not None: + quarantine_mgr.flag( + doc_name=pdf_path.stem, + reason="preflight_text_too_short", + detail=f"Only {extracted_chars} chars extracted from {len(pages_text)} pages (seuil={SEUIL_TEXTE_MINI})", + severity="full", + extracted_chars=extracted_chars, + ) + try: + quarantine_mgr.quarantine_dir.mkdir(parents=True, exist_ok=True) + shutil.copy(pdf_path, quarantine_mgr.quarantine_dir / pdf_path.name) + except Exception as copy_err: + log.warning("Could not copy original PDF to quarantine for %s: %s", + pdf_path.name, copy_err) + return {} + # 1) Regex rules + NER-first cross-validation # Passer les NER managers pour que anonymise_document_regex exécute le NER # sur le texte original (non masqué) et valide les noms extraits par regex