Ingestion : parsing, OCR, métadonnées, synchronisation
Transformer les PDF, Word, Excel, mails et scans d'un cabinet en texte structuré et étiqueté (dossier, ACL, page), puis le maintenir à jour et supprimer proprement.
L'essentiel
- Un cabinet produit des PDF natifs, des PDF scannés, des documents Word et Excel, des mails (souvent
.msgou.pst) et des images de pièces. Le parseur doit couvrir tout cela en local, sans envoyer un octet à l'extérieur. - Docling (MIT, IBM Research) est le candidat principal : mise en page, tableaux, OCR, export structuré, chunking natif, « air-gapped » 1. Unstructured et Tika servent de filet pour les formats exotiques.
- Plusieurs outils réputés ont des licences piégeuses pour une entité commerciale : PyMuPDF (AGPL ou commercial), Marker (poids non libres au-delà de 5 M$ de revenus), MinerU (licence custom), Nougat (poids CC BY-NC), extract-msg (GPL v3). À lire avant d'installer.
- Chaque document ingéré porte ses métadonnées (dossier, client, date, type, page) et ses droits d'accès, copiés sur chaque chunk : sans cela, le filtre de permissions est impossible.
- La synchronisation est incrémentale (hash du fichier) et la suppression d'un document supprime tous ses chunks et vecteurs ; ces deux mécanismes sont testés, pas supposés.
Ce qu'il faut extraire, et pourquoi c'est difficile
Un acte, une assignation, un contrat ou un jugement ont une structure (titres, articles, clauses, pieds de page répétés, numéros de page) que la recherche doit exploiter et que la citation doit restituer (« pièce 12, p. 4 »). Trois difficultés reviennent :
- Les scans : une part importante des pièces arrive en PDF image (courriers reçus, pièces adverses). Sans OCR, elles n'existent pas pour le RAG.
- Les tableaux : bordereaux, décomptes, échéanciers. Un extracteur qui linéarise un tableau ligne par ligne produit des chunks inutilisables.
- Les mails : le corps, les pièces jointes, le fil de réponses cité. Un
.pstde plusieurs gigaoctets contient des milliers de messages et de pièces jointes à rattacher au bon dossier.
Outils de parsing et d'OCR
| Outil | Licence | Points forts | Réserves | Source |
|---|---|---|---|---|
| Docling (IBM, LF AI & Data) | MIT | PDF, DOCX, PPTX, XLSX, HTML, images ; layout + tableaux ; OCR multiples ; export Markdown/JSON/DocTags ; HybridChunker ; exécution locale | qualité sur le juridique français à mesurer | 1 |
| Unstructured | Apache 2.0 | 60+ formats dont e-mails ; stratégies fast / hi_res / ocr_only | fonctions avancées « reserved for the commercial Unstructured Pipelines platform » ; dépendances système lourdes | 2 |
| Apache Tika 3.x | Apache 2.0 | plus de 1 000 formats ; défaut proposé par Open WebUI | pas de structure de mise en page | 10 |
| PyMuPDF / pymupdf4llm | AGPL-3.0 ou commercial | extraction très rapide, OCR Tesseract intégré | AGPL à analyser pour une Box distribuée | 5 |
| pdfplumber | MIT | tableaux dans les PDF natifs | pas d'OCR | — |
| Marker (Datalab) | code Apache 2.0 (lecture actuelle) ; poids « Modified AI2 Open RAIL-M », gratuits sous 5 M$ de revenus | OCR Surya, bons benchmarks éditeur | éligibilité d'un cabinet à vérifier ; historique GPL-3.0 | 3 |
| MinerU (OpenDataLab) | licence custom (ex-AGPL) | OCR 109 langues, mise en page | GPU 4 à 8 Go VRAM minimum, CUDA à vérifier sur AMD ; conditions à lire | 4 |
| Nougat (Meta) | code MIT, poids CC BY-NC | documents académiques | non commercial, hors cible | 6 |
| Tesseract 5 | Apache 2.0 | fra.traineddata, CPU, mature | précision variable sur scans médiocres | 7 |
| PaddleOCR 3.0 | Apache 2.0 | détection de mise en page | compatibilité ROCm non vérifiée | 8 |
| OCRmyPDF | MPL-2.0 | ajoute une couche texte aux PDF scannés, conserve l'image | dépend de Tesseract et Ghostscript | 9 |
| RAGFlow DeepDoc | Apache 2.0 | layout, OCR, tableaux intégrés à la plateforme | lié à RAGFlow (Elasticsearch, MySQL, Redis, MinIO) | 15 |
Chaîne recommandée (hypothèse)
- Détection : PDF natif (texte présent) ou scanné (pas de couche texte, ou couche texte vide).
- Pré-OCR des scans avec OCRmyPDF + Tesseract
fra(oufra+engpour les dossiers internationaux) : le PDF garde son image et gagne une couche texte réutilisable par n'importe quel outil, y compris le lecteur PDF de l'avocat 9. - Parsing avec Docling : structure (titres, paragraphes, listes), tableaux, numéros de page, coordonnées des blocs (pour surligner le passage cité) 1.
- Secours : Tika ou Unstructured pour un format que Docling refuse.
- Contrôle qualité : taux de caractères non alphabétiques, longueur moyenne des mots, pages vides ; un document sous le seuil est marqué « OCR douteux » et remonté à l'utilisateur plutôt qu'indexé silencieusement.
PaddleOCR est à comparer à Tesseract sur les scans difficiles ; les deux tournent sur CPU, ce qui compte sur la machine candidate où le GPU est réservé au LLM.
Formats de messagerie
| Format | Outil | Licence | Remarques |
|---|---|---|---|
.eml (MIME) | module email de Python ; Tika ; Unstructured | PSF / Apache 2.0 | format cible : tout le reste y est converti |
.msg (Outlook) | extract-msg | GPL v3 12 | à isoler dans un processus de conversion vers .eml |
.pst (archives Outlook) | libratom (Python, libpff) : un .eml par message 11 ; pffexport | libpff : à confirmer | archives volumineuses ; les pièces jointes deviennent des documents à part, rattachés au même dossier |
Métadonnées spécifiques aux mails : expéditeur, destinataires, date, sujet, identifiant de fil (Message-ID, In-Reply-To), pièce jointe parente. Le rattachement au dossier se fait par convention (sous-dossier Outlook exporté par affaire) ou par règle (adresse du client, référence dans l'objet) ; les mails non rattachés vont dans une zone de quarantaine visible du seul propriétaire.
Nettoyage
Avant chunking : supprimer les en-têtes et pieds de page répétés (détectés par répétition sur plusieurs pages), les numéros de page isolés, les lignes de signature de mail, les avertissements de confidentialité répétés ; normaliser les espaces et les apostrophes ; conserver les numéros d'articles et de clauses, qui sont des ancres de citation. Dédoublonner par hash de contenu (la même pièce est souvent présente trois fois dans un dossier : originale, scan, pièce jointe d'un mail) tout en gardant tous les chemins pour la citation.
Métadonnées
Chaque document, puis chaque chunk, porte :
| Champ | Exemple | Origine |
|---|---|---|
doc_id, chunk_id | UUID | pipeline |
dossier_id, client_id | 2026-0042, client-… | chemin SMB, SharePoint, ou choix à l'import |
acl_groups | ["associes", "avocat-a"] | ACL source ou table de la Box, voir permissions |
type | contrat, jugement, courrier, mail, pièce | règle ou classification légère |
date_document, date_ingestion | métadonnées fichier, contenu, pipeline | |
chemin, nom_fichier, hash | système de fichiers | |
page_debut, page_fin, bbox | Docling | |
section | « Article 4 — Prix » | structure Docling |
langue | fr | détection |
ocr | true/false, score qualité | pipeline |
Le champ acl_groups est dupliqué sur chaque chunk à dessein : Azure AI Search documente que les champs de permission suivent les fragments quand le document est découpé 13. Cette dénormalisation impose que la resynchronisation des ACL réécrive les métadonnées de tous les chunks concernés.
Synchronisation incrémentale
Le connecteur (voir documents) parcourt les sources à intervalle régulier et compare chemin + taille + mtime + hash. Trois cas :
- Nouveau ou modifié : réingestion complète du document (parsing, chunking, embeddings), remplacement atomique des anciens chunks par les nouveaux, puis mise à jour des ACL.
- Déplacé (même hash, autre chemin) : mise à jour des métadonnées ; si le déplacement change de dossier, les ACL changent aussi, ce qui est un événement de sécurité à journaliser.
- Supprimé : suppression de tous les chunks, vecteurs et entrées BM25, puis du journal d'ingestion (le journal d'accès est conservé selon sa propre durée).
L'état d'avancement (documents en attente, échecs d'OCR, dernier passage) est exposé au monitoring ; un document en échec est visible dans l'interface d'administration avec sa raison.
Comparaison avec le RAG intégré d'Open WebUI
Open WebUI propose Tika, Docling ou Mistral OCR comme moteur d'extraction et un splitter par caractères ou tokens 14. Cela suffit pour un POC sur quelques documents déposés à la main. Cela ne couvre pas : la synchronisation depuis un partage, la propagation des ACL, le rattachement des mails aux dossiers, le contrôle qualité OCR. C'est l'un des arguments pour un service d'ingestion séparé dès le POC (interface).
Questions ouvertes
Ce qu'il reste à tester
Sources
- 1Docling — README et documentation chunking (MIT, HybridChunker)GitHubFiabilité hauteDocling / IBM Research / LF AI & Data · publié v2.127.0, 14/09/2026 · consulté le 16 sept. 2026 · fiche source
- 2Unstructured — README (Apache 2.0, stratégies, limites open source)GitHubFiabilité hauteUnstructured · publié lu le 16/09/2026 · consulté le 16 sept. 2026 · fiche source
- 3Marker — README (licence code et poids des modèles)GitHubFiabilité moyenneDatalab · publié lu le 16/09/2026 · consulté le 16 sept. 2026 · fiche source
- 4MinerU — README (licence custom, prérequis GPU)GitHubFiabilité moyenneOpenDataLab · publié v3.4, 18/06/2026 · consulté le 16 sept. 2026 · fiche source
- 5PyMuPDF — licence AGPL-3.0 ou commercialeDocumentation officielleFiabilité hauteArtifex · publié lu le 16/09/2026 · consulté le 16 sept. 2026 · fiche source
- 6Nougat (Meta) — code MIT, poids CC BY-NCGitHubFiabilité hauteMeta · publié lu le 16/09/2026 · consulté le 16 sept. 2026 · fiche source
- 7Tesseract — tessdata_best (Apache 2.0, fra.traineddata)GitHubFiabilité hauteTesseract OCR · publié lu le 16/09/2026 · consulté le 16 sept. 2026 · fiche source
- 8PaddleOCR 3.0 — rapport technique et licenceÉtudeFiabilité moyennePaddlePaddle · publié juillet 2025 · consulté le 16 sept. 2026 · fiche source
- 9OCRmyPDF — licence MPL-2.0GitHubFiabilité hauteOCRmyPDF · publié lu le 16/09/2026 · consulté le 16 sept. 2026 · fiche source
- 10Apache Tika 3.x — licence et formatsDocumentation officielleFiabilité hauteApache Software Foundation · publié lu le 16/09/2026 · consulté le 16 sept. 2026 · fiche source
- 11libratom — extraction PST / mbox (libpff)GitHubFiabilité moyenneLibratom · publié lu le 16/09/2026 · consulté le 16 sept. 2026 · fiche source
- 12extract-msg — parsing .msg (GPL v3)Documentation officielleFiabilité hautePyPI (extract-msg) · publié lu le 16/09/2026 · consulté le 16 sept. 2026 · fiche source
- 13Azure AI Search — Document-Level Access ControlDocumentation officielleFiabilité hauteMicrosoft · publié 08/08/2026 (mise à jour 31/08/2026) · consulté le 16 sept. 2026 · fiche source
- 14Open WebUI — fonctions RAG (knowledge, hybride, extraction)Documentation officielleFiabilité hauteOpen WebUI · publié lu le 16/09/2026 · consulté le 16 sept. 2026 · fiche source
- 15RAGFlow — README (Apache 2.0, DeepDoc, prérequis)GitHubFiabilité hauteInfiniFlow · publié v0.27.2, lu le 16/09/2026 · consulté le 16 sept. 2026 · fiche source