URL:     https://linuxfr.org/users/etienneaubry72/journaux/un-editeur-pdf-qui-tourne-entierement-dans-le-navigateur
Title:   Un éditeur PDF qui tourne entièrement dans le navigateur
Authors: EtienneAubry72
Date:    2026-10-12T23:44:14+02:00
License: CC By-SA
Tags:    pdf, vie_privée, webassembly et agpl
Score:   -2


Corriger une ligne déjà écrite dans un PDF — une date fausse, un nom mal orthographié — est la fonction que presque tous les services en ligne réservent à leur abonnement. Ajouter du texte par-dessus est gratuit partout ; modifier celui qui est déjà là, non. La raison est simple : ça leur coûte du temps de serveur.

J'ai voulu voir si on pouvait s'en passer complètement. Le résultat est [VoilàPDF](https://voilapdf.com), sous AGPL v3 : <https://github.com/dilmseo/editeur-pdf>

Le site n'a aucun code serveur. Ce sont des fichiers statiques : le document est lu, modifié et réenregistré par l'onglet, en JavaScript et WebAssembly. Il ne peut pas être reçu puisqu'il n'est jamais envoyé — ouvrez un outil, coupez votre connexion, il continue de fonctionner.

# Comment la modification de texte marche

C'est la partie qui m'a demandé le plus de tâtonnements.

`pdf.js` donne la ligne de base, la largeur et le corps exacts de chaque fragment de texte. Les fragments partageant une ligne de base sont regroupés en un bloc modifiable. À l'enregistrement, `pdf-lib` recouvre l'ancienne ligne d'un rectangle rempli de la **couleur moyenne relevée sur le rendu du fond**, puis réécrit le texte sur la même ligne de base.

Au début je quantifiais cette couleur sur une palette réduite : il restait un rectangle gris parfaitement visible sur tout fond légèrement teinté. La moyenne exacte des pixels échantillonnés règle le problème.

Deux détails que j'ai dû mesurer plutôt que supposer :

* **Le gras se détecte par la largeur, pas par le nom de police.** Le nom inscrit dans les métadonnées ment assez souvent pour être inutilisable. Comparer la largeur mesurée de la ligne aux métriques des polices standard identifie la graisse à 0,2 % près, contre 3,4 % quand on se trompe de graisse.
* **L'italique ne se détecte pas.** J'ai essayé de mesurer la pente de l'encre : trois lignes parfaitement droites sur quatre étaient marquées italiques. Une heuristique fausse vaut moins que pas d'heuristique du tout, je l'ai retirée. L'italique se règle à la main.

# Le reste

Vingt-six outils en tout : conversion depuis et vers les formats Office et les images, fusion, découpe, rotation, rognage, numérotation, filigrane, signature, nettoyage des métadonnées. Les PDF scannés passent par `tesseract.js` en français, localement, et la reconnaissance se déclenche toute seule quand il n'y a pas de texte sélectionnable.

Deux outils plus récents utilisent `transformers.js` : un résumé et une traduction français ↔ anglais. Pour le résumé, je n'ai pas trouvé de modèle multilingue qui tienne dans un navigateur — mt5-small pèse 411 Mo et n'est même pas entraîné pour ça. Le résumé par défaut est donc **extractif** : il note chaque phrase sur les mots qu'elle partage avec le document et restitue les mieux notées dans l'ordre d'origine. Instantané, toutes langues, et surtout il n'invente rien, ce qui me paraît préférable sur un contrat. distilbart-cnn reste disponible en option pour l'anglais.

La traduction, elle, est un vrai modèle : opus-mt, 103 Mo téléchargés au premier clic puis gardés en cache par le navigateur. Le modèle descend, le document ne monte jamais.

# Les limites, parce qu'elles comptent

* Le texte modifié **recouvre** l'ancien sans le supprimer du fichier. Ce n'est pas un caviardage : `pdftotext` retrouve l'original. C'est écrit sur chaque page d'outil, parce que quelqu'un finira par vouloir masquer un RIB avec.
* Les polices d'origine ne sont pas réemployées — l'une des 14 polices standard du PDF.
* La compression et le déverrouillage rematricent les pages : le texte devient une image.
* La conversion vers les formats Office reconstruit le contenu, pas la maquette.

Aucun compte, aucun cookie, aucune mesure d'audience, aucun stockage local, et les polices sont servies depuis le domaine du site. Tout est embarqué dans `vendor/`, aucune compilation : `node serveur.js` et c'est en ligne chez vous.

Je prends volontiers les retours, en particulier sur les PDF qui le mettent en défaut — c'est le genre de format où les cas tordus sont la règle plutôt que l'exception.
