Import campagne : la table des matieres du PDF guide la structuration

Les bookmarks PDF (doc.get_toc, gratuits) sont injectes dans chaque prompt MAP
comme referentiel commun de nommage : les morceaux traites separement nomment
desormais les memes chapitres a l identique, et la fusion par nom du _TreeMerger
recolle les chapitres coupes au lieu de creer des doublons. Bornee (2 niveaux,
80 entrees) pour ne pas gonfler le prompt ; absente sur les scans -> inchange.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-10 15:15:50 +02:00
parent 91069525a5
commit e7aa67bc42
3 changed files with 73 additions and 10 deletions

View File

@@ -320,11 +320,26 @@ class ExtractedPage:
used_ocr: bool
@dataclass(frozen=True)
class TocEntry:
"""Une entrée de la table des matières (bookmarks/outline) du PDF.
`level` : profondeur 1-based (1 = chapitre, 2 = section…). `page` : 1-based.
"""
level: int
title: str
page: int
@dataclass(frozen=True)
class ExtractedDocument:
"""Résultat brut de l'extraction d'un PDF : une entrée par page."""
pages: list[ExtractedPage]
# Table des matières (bookmarks PDF). Vide si le PDF n'en a pas — fréquent
# pour les scans ; les livres born-digital en ont presque toujours une.
toc: list[TocEntry] = field(default_factory=list)
@property
def page_count(self) -> int: