Comment extraire des tableaux de PDF volumineux et vérifier les chiffres
Un flux de travail pratique pour extraire des tableaux de PDF volumineux via l'API Gemini : concevoir des schémas autorisant les valeurs null, choisir l'API Files, demander des citations et des numéros de page comme indices de recherche, et rapprocher les données extraites du document original avant l'exportation finale.
Sommaire

Lors du traitement de documents PDF complexes — tels que des rapports d’inspection d’équipements de plusieurs pages ou des états financiers —, un texte uniforme et propre constitue l’exception plutôt que la règle. Dans les documents d’entreprise réels, les pages numériques côtoient des feuilles numérisées, les tableaux manquent de bordures nettes et les indicateurs critiques sont souvent dissimulés dans des notes de bas de page denses.
Transmettre directement de tels fichiers à un modèle multimodal et injecter la sortie sans filtre dans une base de données de production est risqué. Les modèles fondationnels demeurant des systèmes probabilistes, un pipeline d’extraction fiable ne peut reposer sur une confiance aveugle. Il doit au contraire être articulé autour d’une conception rigoureuse du schéma, de la collecte d’indices contextuels d’audit et d’une vérification minutieuse a posteriori par rapport à l’original visuel.
1. Schéma de données : fixer les champs et autoriser les valeurs null
Le mécanisme des Gemini Structured Outputs garantit que les réponses du modèle respectent strictement un schéma déclaré, produisant ainsi un JSON syntaxiquement valide. Si une propriété est déclarée comme numérique, aucun texte conversationnel parasite ne viendra polluer la valeur.
Cependant, la conformité syntaxique au schéma ne protège que contre les erreurs de structure — elle ne garantit en rien la vérité sémantique :
- Un modèle peut confondre des lignes adjacentes ou intervertir des colonnes dans des tableaux denses et sans bordures ;
- Sur des numérisations dégradées, le chiffre
8peut facilement être confondu avec un3, et les points décimaux disparaissent fréquemment ; - Lorsqu’une mesure est absente ou masquée, un modèle qui n’est pas explicitement autorisé à omettre des valeurs risque de fabriquer un nombre plausible.
Pour atténuer les risques d’hallucination, les schémas doivent déclarer les champs comme pouvant être nuls (Optional ou null), avec des instructions explicites dans le prompt demandant de renvoyer null dès qu’un nombre ne peut pas être déchiffré avec un haut niveau de confiance. Bien que l’autorisation des valeurs nulles réduise considérablement l’incitation à deviner, elle ne constitue pas en soi une garantie absolue contre les hallucinations.
2. Ingestion des fichiers : quand choisir l’API Files
Selon la documentation officielle sur le traitement des documents de Gemini, les limites opérationnelles sont fixées à jusqu’à 50 MB ou jusqu’à 1 000 pages par fichier PDF (les contraintes relatives à la taille du fichier et au nombre de pages s’appliquent simultanément, sans garantie que les deux plafonds puissent être atteints ensemble — le traitement s’arrête dès que la première limite est atteinte).
La méthode de transmission optimale dépend de la taille du document et du modèle opérationnel :
- La transmission inline (directe dans la requête) convient particulièrement aux petits documents et aux appels d’extraction ponctuels.
- L’API Files (
client.files.upload) est conçue pour les fichiers plus volumineux et les flux multi-étapes où un même document est interrogé au fil d’opérations consécutives (par exemple, une première classification des sections suivie d’une extraction ciblée de tableaux). L’utilisation de l’API Files évite de téléverser à nouveau l’intégralité du contenu du document à chaque appel.
3. Requêtage des données : schéma, indices de citation et réponse hypothétique
Pour rendre les données extraites auditables, demandez au modèle de renvoyer des métadonnées auxiliaires en plus des valeurs cibles : un numéro de page approximatif (page_number) et un court extrait de citation textuelle (evidence_quote).
Distinction cruciale :
page_numberetevidence_quotene sont pas des preuves factuelles ; ce sont strictement des indices de recherche heuristiques. Comme le modèle génère lui-même ces champs, les extraits cités peuvent comporter des artefacts d’OCR ou fusionner des lignes adjacentes, et le numéro de page visuel indiqué peut différer de l’indice physique du feuillet dans le conteneur PDF.
Configuration hypothétique du problème
Considérons une configuration de problème hypothétique (aucun PDF réel n’a été fourni, téléversé ou analysé, et aucune requête API en temps réel n’a été exécutée) : la modélisation de l’extraction de métriques récapitulatives à partir d’un rapport hypothétique d’inspection de pompes. Dans cet exemple illustratif, nous examinons un tableau hypothétique de deux lignes :
| Identifiant | Pression (MPa) | Vibration (mm/s) | Statut | Remarques |
|---|---|---|---|---|
| Н-101-А | 1.45 | 2.1 | Normal (В норме) | Inspection planifiée |
| Н-102-В | (illisible) | 7.8 | Attention (Внимание) | Jeu accru |
Voici un exemple de schéma défini avec Pydantic ainsi que la syntaxe d’appel pour le SDK officiel :
from google import genai
from pydantic import BaseModel, Field
from typing import List, Optional
class PumpRecord(BaseModel):
unit_id: str = Field(
description="Идентификатор агрегата точно как в таблице"
)
inlet_pressure_mpa: Optional[float] = Field(
default=None,
description="Давление в МПа. Если значение неразборчиво или отсутствует — null"
)
vibration_mms: Optional[float] = Field(
default=None,
description="Уровень вибрации в мм/с. При отсутствии данных — null"
)
status: str = Field(
description="Статус узла (например, 'В норме', 'Внимание')"
)
page_number: Optional[int] = Field(
default=None,
description="Оценочный номер страницы документа (подсказка для аудитора, не подтверждена)"
)
evidence_quote: Optional[str] = Field(
default=None,
description="Короткий фрагмент строки (до 10 слов), откуда взяты числа (подсказка, не подтверждена)"
)
class InspectionPayload(BaseModel):
records: List[PumpRecord]
client = genai.Client()
uploaded_file = client.files.upload(file="hypothetical_inspection.pdf")
response = client.interactions.create(
model="gemini-3.8-flash",
input=[
{
"type": "document",
"uri": uploaded_file.uri,
"mime_type": uploaded_file.mime_type,
},
{
"type": "text",
"text": (
"Извлеки показатели агрегатов в соответствии со схемой. "
"Если число неразборчиво или отсутствует, возвращай null. "
"Для каждой записи заполни номер страницы и короткую цитату-подтверждение."
),
},
],
response_format={
"type": "text",
"mime_type": "application/json",
"schema": InspectionPayload.model_json_schema(),
},
)
payload = InspectionPayload.model_validate_json(response.output_text)
Réponse JSON illustrative du modèle
Le code JSON suivant illustre une réponse hypothétique du modèle à cette requête. Soulignons-le : cette sortie constitue une illustration structurelle hypothétique, et non le résultat d’une exécution réelle de l’API ou d’une mesure physique effective :
{
"records": [
{
"unit_id": "Н-101-А",
"inlet_pressure_mpa": 1.45,
"vibration_mms": 2.1,
"status": "В норме",
"page_number": 12,
"evidence_quote": "Н-101-А 1.45 2.1 В норме"
},
{
"unit_id": "Н-102-В",
"inlet_pressure_mpa": null,
"vibration_mms": 7.8,
"status": "Внимание",
"page_number": 12,
"evidence_quote": "Н-102-В [пятно] 7.8 Внимание"
}
]
}
Dans cette réponse hypothétique, les deux occurrences de page_number: 12 ainsi que les deux valeurs de evidence_quote ont le statut d’indices non vérifiés. Bien que le modèle ait correctement renvoyé null pour la valeur de pression illisible du second groupe, aucun des attributs extraits n’est considéré a priori comme un fait avéré.
4. Rapprochement avec l’original visuel et règles d’exportation
Les enregistrements extraits ne peuvent pas être directement écrits dans les bases de données de production sans validation. Un audit de bout en bout comparant chaque champ au rendu visuel de la page PDF source est indispensable.
Clarification importante concernant l’exemple : Le tableau de deux lignes, la page 12, le décalage physique au 14e feuillet, le département des compresseurs et la procédure de vérification visuelle constituent une illustration exclusivement hypothétique du processus. Aucun document PDF réel n’a été fourni ou examiné, et les étapes décrites ci-dessous reflètent ce qu’un réviseur vérifierait en pratique, formulant des décisions conditionnelles dans l’hypothèse où le rendu visuel confirmerait les valeurs indiquées.
Vérification pas à pas des enregistrements : ce qu’un réviseur contrôlerait
-
Groupe
Н-101-А:- Page et localisation : Le modèle a renvoyé l’indice
page_number: 12. Le réviseur examinerait le rendu visuel de la page 12 (ou du feuillet 14 si les pages liminaires créaient un décalage physique) et localiserait le tableau cible du département des compresseurs. - Identifiant : Dans la première colonne, le réviseur vérifierait la correspondance exacte de l’identifiant
Н-101-А. - Pression et unités : Dans la colonne de pression à l’admission, le réviseur vérifierait que la valeur
1.45est nettement lisible et que les unités d’ingénierie correspondent aux spécifications du schéma (МПа/MPa). - Vibration et unités : Sous la colonne vibration, le réviseur rechercherait la valeur
2.1et vérifierait la dénomination de l’unité (мм/с/mm/s). - Statut : Sous la colonne d’état opérationnel, le réviseur confirmerait la présence du statut
В норме(Normal). - Décision conditionnelle : Si la page rendue valide l’ensemble des champs, des valeurs et des unités physiques, la ligne serait approuvée pour l’exportation (Export / Accepté).
- Page et localisation : Le modèle a renvoyé l’indice
-
Groupe
Н-102-В:- Page et localisation : Dans le même tableau hypothétique, le réviseur passerait à la seconde ligne.
- Identifiant : Le réviseur confirmerait la présence de l’identifiant
Н-102-В. - Vibration et statut : Le réviseur recouperait la valeur de vibration
7.8et le statutВнимание(Attention / Avertissement) avec la couche visuelle. - Pression : Le modèle a renvoyé
null. Le réviseur examinerait la cellule correspondante sur le rendu de la page : si une tache sombre et estompée (défaut de numérisation) est observée à la place d’une valeur, cela valide la décision du modèle de renvoyernull, mais une mesure physique essentielle demeure absente. - Décision conditionnelle : La confirmation visuelle établissant qu’une mesure critique de pression est manquante, la ligne serait bloquée pour l’exportation automatisée et placée en révision manuelle (En attente de révision manuelle), nécessitant une nouvelle numérisation opérationnelle ou un recoupement avec les registres de maintenance de secours.
Données contrôlées après vérification (Checked Output)
Le tableau récapitulatif détaille exactement ce que le réviseur inspecterait et quelle décision d’acheminement conditionnelle le pipeline de validation déclencherait en cas de confirmation visuelle :
| Groupe | Pression (MPa) | Vibration (mm/s) | Statut | Ce que le réviseur vérifierait (vérification hypothétique) | Décision conditionnelle du pipeline (si le rendu confirme les valeurs) |
|---|---|---|---|---|---|
| Н-101-А | 1.45 | 2.1 | В норме (Normal) | Vérifierait la correspondance de l’identifiant, des valeurs numériques et des unités (MPa, mm/s) par rapport au rendu | Exportation approuvée (Prêt pour l’ingestion) — conditionnée à la confirmation visuelle complète de tous les champs |
| Н-102-В | null (omis) | 7.8 | Внимание (Warning) | Confirmerait le défaut de numérisation (tache) dans la cellule de pression et recouperait la valeur de vibration | Retenu pour révision manuelle (Tri opérateur) — en raison de l’absence confirmée d’une mesure critique |
Modèle architectural de validation
Un pipeline robuste d’ingestion de documents sépare les enregistrements traités en deux flux distincts :
- Couloir vert (Exportation vérifiée / Green Corridor) : Réservé exclusivement aux lignes dont chaque champ obligatoire est visuellement corroboré par rapport au rendu de la page source et dont toutes les unités physiques sont normalisées selon les standards du schéma.
- File de révision (Mise en quarantaine / Review Queue) : Tous les enregistrements présentant
nulldans des champs critiques, des unités de mesure contradictoires ou des citations ambiguës sont placés en quarantaine pour une révision manuelle par un opérateur humain.