Sans installation · sans serveur Vos fichiers ne quittent pas l'onglet pdf.js · Apache-2.0

Transforme un PDF en Markdown propre

Si vous construisez des pipelines documentaires ou du RAG, vous connaissez le problème : les tableaux se mélangent, les colonnes se chevauchent, et le contexte s'effondre avant même d'atteindre le modèle. The Better Inspector nettoie le document à la source, dans votre navigateur.

0Octet envoyé sur le réseau
4Classes de document
25 MoPar document
sortie markdown · exemple
# Rapport annuel 2025
   rapport-annuel.pdf · 12 pages

## Chiffres clés
| Indicateur | 2025 | 2024 |
|---|---:|---:|

- Ouverture de trois bureaux
- Lancement de la plateforme
type de documentTexte natif sortieMarkdown structuré jetons estimés≈ 1 840
Classes de documentTexte natif · Scanné
Image · Mixte
Mise en pagecolonnes détectées
ordre de lecture reconstruit
Structuretitres · listes · tableaux
césures recollées
Exécutionentièrement locale
aucun envoi réseau

[N.01/05]>Démo navigateur

Déposez un PDF.
Repartez avec du Markdown.

Le fichier est décodé dans un worker : regroupement des fragments par ligne de base, détection de la gouttière, remise en ordre des colonnes, classement des niveaux de titre, puis émission Markdown. Aucun octet ne sort de l'onglet, il n'y a pas de serveur derrière ce formulaire.

Analyse localeChargement du moteur… Le PDF reste dans votre navigateur
Déposez un PDF ici Documents à texte natif · jusqu'à 25 Mo

Tout se passe ici : le fichier est lu en mémoire, converti, puis oublié dès que vous quittez la page. Aucun envoi, aucun compte, aucune trace côté serveur, puisqu'il n'y a pas de serveur.

Sortie Markdown
Type de document
Pages
Traitement
Jetons estimés

          

[N.02/05]>Économie de jetons

Un PDF déposé tel quel,
votre modèle le paie cher.

Nourrir un modèle avec un PDF brut est un cauchemar : il le rend page par page en image, ou en tire un texte où les colonnes s'entrelacent et les en-têtes se répètent. Vous payez des jetons pour de la mise en forme, et le modèle lit un document qu'il comprend mal. Nettoyer à la source règle les deux problèmes d'un coup.

// PDF brut → assistant

Ce que vous envoyez aujourd'hui

  • Chaque page rendue en image, ou un texte brut sans structure
  • En-têtes, pieds de page et numéros répétés à chaque page
  • Colonnes entrelacées : les phrases d'une page se mélangent
  • Mots coupés en fin de ligne, tableaux aplatis en bouillie
  • Le temps de rendu du document s'ajoute à celui de la réponse
// converti → assistant

Ce que vous pourriez envoyer

  • Du texte, rien que du texte, aucune image à facturer
  • Titres, listes et tableaux dans une syntaxe que le modèle connaît
  • Ordre de lecture reconstruit, césures recollées
  • Nettoyage économe : chaque jeton envoyé porte du contenu
  • Conversion locale, en quelques dizaines de millisecondes

La démonstration ci-dessus affiche le coût en jetons de votre propre document, et son coût par page. Un PDF envoyé tel quel est rendu page par page en image, et une image coûte bien plus qu'une page de texte : le rapport exact dépend de votre modèle, comparez avec vos propres tarifs. Le compte retenu est l'approximation usuelle d'environ quatre caractères par jeton.

[N.03/05]>Capacités

Six fonctions, et c'est tout.

Il n'y a pas de modèle, pas de service, pas de dépendance en dehors du lecteur de format. Six fonctions font le travail, et chaque carte porte le nom de celle qui l'exécute dans le fichier de cette page.

//001 clusterRows()

Regroupement par ligne de base

Les fragments renvoyés par le moteur sont dispersés. Ils sont regroupés par ordonnée, avec une tolérance dérivée de la taille de corps médiane de la page.

//002 findGutter()

Détection de gouttière

La gouttière est l'abscisse centrale que le moins de rangées traversent d'un seul tenant, et qui court sur au moins 45 % de la hauteur, ce qui la distingue d'un simple écart entre colonnes d'un tableau.

//003 orderLines()

Ordre de lecture, bande par bande

Chaque rangée est scindée à la gouttière. Colonne de gauche puis colonne de droite ; une ligne pleine largeur (titre, résumé, figure) clôt la bande et sépare deux blocs à deux colonnes.

//004 sizeLevels()

Niveaux de titre

Les seuils absolus échouent : un article scientifique titre à 1,2× le corps, un rapport à 2×. On classe donc les tailles réellement présentes sur la page, plus une heuristique pour les intertitres numérotés ou en capitales.

//005 segments()

Reconnaissance de tableaux

Deux rangées consécutives dont les segments s'alignent à moins de dix points près forment un tableau. Il ressort en syntaxe pipe, en-tête compris.

//006 classify()

Classification du document

Densité de texte et opérateurs d'image par page donnent quatre classes : texte natif, scanné, image ou mixte. Le texte pivoté (tampons arXiv, filigranes de marge) est écarté avant tout traitement.

[N.04/05]>Architecture

Six étapes,
aucune boîte noire.

Le document n'est lu qu'une fois. Chaque étape a un rôle étroit et porte le nom de la fonction qui l'exécute dans le fichier de cette page, que vous pouvez lire.

toMarkdown()<script type="module">
Entrée

Le fichier déposé

Lu en mémoire par la page. Aucune requête réseau n'est émise à partir d'ici.

Étape 1
readPage()Fragments positionnés, polices, opérateurs d'image
classify()Texte natif · scanné · image · mixte
Étape 2
clusterRows()Fragments regroupés par ordonnée
findGutter()Abscisse de séparation des colonnes
Étape 3
orderLines()Rangées scindées, bandes ordonnées
sizeLevels()Niveaux de titre présents sur la page
Sortie

Markdown + estimation de jetons

Titres, listes, tableaux en syntaxe pipe, césures recollées. Le compte de jetons est calculé sur le résultat.

Tout se passe dans l'onglet. pdf.js décode le format dans un worker ; le reste (regroupement, colonnes, titres, tableaux) est écrit à la main dans cette page.

[N.05/05]>Limites

Ce qu'il ne fait pas.

Un outil qui ne dit pas où il s'arrête vous le fait découvrir au mauvais moment. Voici les bornes, toutes lisibles dans le code de cette page.

// hors de portée

Ce que l'outil laisse passer

  • Pas d'OCR. Un PDF scanné est détecté et signalé, mais pas converti, il n'y a aucun texte à extraire.
  • Ni formules ni figures. Les mathématiques et les images ne sont pas transcrites ; seule la légende ressort, si elle est en texte.
  • Des heuristiques, pas un modèle. Une mise en page très inhabituelle peut être mal découpée.
// bornes chiffrées

Les plafonds

  • 40 pages. Au-delà, seules les 40 premières sont traitées, et la démo vous le dit explicitement.
  • 25 Mo. Un fichier plus lourd est refusé avec sa taille réelle affichée.
  • ~4 caractères par jeton. L'estimation est une approximation ; le découpage exact dépend du modèle.

Essayez tout de suite

Rien à installer, rien à configurer, aucun compte. Déposez un document, le Markdown apparaît.

déposez un PDF à texte natif copiez le Markdown

Regardez sous le capot

Le convertisseur tient dans le fichier de cette page. Aucune minification, aucun paquet : le code que vous lisez est celui qui tourne.

  • Un seul fichier HTML, lisible tel quel
  • Aucun appel réseau pendant la conversion
  • pdf.js pour la lecture, le reste est écrit à la main