#!/usr/bin/env python3 """ Test d'anonymisation sur un document réel avec analyse des résultats. """ import sys from pathlib import Path # Importer le système d'anonymisation from anonymizer_core_refactored_onnx import anonymize_pdf_file # Importer les outils d'évaluation from evaluation import LeakScanner def main(): # Sélectionner un document simple pdf_path = Path("tests/ground_truth/pdfs/003_simple_compte_rendu_CRO_23155084.pdf") if not pdf_path.exists(): print(f"✗ Document introuvable: {pdf_path}") return 1 print("="*80) print("TEST D'ANONYMISATION SUR UN DOCUMENT RÉEL") print("="*80) print(f"\n📄 Document: {pdf_path.name}") print(f" Type: Compte-rendu opératoire (CRO)") print(f" Complexité: Simple (1 page)") # Créer le répertoire de sortie output_dir = Path("tests/ground_truth/pdfs/anonymized_test") output_dir.mkdir(exist_ok=True) print(f"\n📁 Répertoire de sortie: {output_dir}") # Anonymiser le document print("\n🔄 Anonymisation en cours...") print(" (Cela peut prendre quelques secondes)") try: result = anonymize_pdf_file( pdf_path=str(pdf_path), output_dir=str(output_dir), use_ner=True, # Activer le NER use_vlm=False, # Désactiver le VLM pour ce test (plus rapide) raster_dpi=150, force_raster=False ) print("\n✓ Anonymisation terminée !") # Afficher les résultats if result: audit_path = output_dir / f"{pdf_path.stem}.audit.jsonl" redacted_pdf = output_dir / f"{pdf_path.stem}.redacted_raster.pdf" if not redacted_pdf.exists(): redacted_pdf = output_dir / f"{pdf_path.stem}.redacted_vector.pdf" print(f"\n📊 Fichiers générés:") print(f" - PDF anonymisé: {redacted_pdf.name}") print(f" - Audit: {audit_path.name}") # Compter les PII détectés if audit_path.exists(): with open(audit_path, 'r', encoding='utf-8') as f: pii_count = sum(1 for line in f if line.strip()) print(f"\n🔍 PII détectés: {pii_count}") # Afficher les premiers PII print("\n📋 Premiers PII détectés:") with open(audit_path, 'r', encoding='utf-8') as f: for i, line in enumerate(f): if i >= 10: # Limiter à 10 break if line.strip(): import json pii = json.loads(line) print(f" {i+1}. {pii.get('kind', 'UNKNOWN'):15s} : {pii.get('original', '')[:50]}") if pii_count > 10: print(f" ... et {pii_count - 10} autres") # Scanner les fuites print("\n🔒 Scan de fuite en cours...") scanner = LeakScanner() if redacted_pdf.exists(): leak_report = scanner.scan(redacted_pdf, audit_path) if leak_report.is_safe: print(" ✓ DOCUMENT SÛR - Aucune fuite détectée") else: print(f" ✗ ATTENTION - {leak_report.leak_count} fuite(s) détectée(s)") # Afficher les fuites par sévérité for severity, count in sorted(leak_report.severity_counts.items()): print(f" - {severity}: {count}") # Afficher les premières fuites print("\n Détails des fuites:") for i, leak in enumerate(leak_report.leaks[:5], 1): print(f" {i}. [{leak['severity']}] {leak['message']}") if leak_report.leak_count > 5: print(f" ... et {leak_report.leak_count - 5} autres") else: print(" ⚠ PDF anonymisé introuvable, impossible de scanner") print("\n" + "="*80) print("✨ Test terminé avec succès !") print("="*80) print(f"\n📂 Fichiers disponibles dans: {output_dir}") print("\n💡 Pour voir le PDF anonymisé:") print(f" xdg-open {redacted_pdf}") return 0 else: print("\n✗ Erreur lors de l'anonymisation") return 1 except Exception as e: print(f"\n✗ Erreur: {e}") import traceback traceback.print_exc() return 1 if __name__ == "__main__": sys.exit(main())