Numériser des documents sans les envoyer

Passeports, contrats, bulletins de paie, courriers médicaux. Les documents qui méritent le plus d'être numérisés sont précisément ceux qui méritent le moins d'être confiés au serveur d'un inconnu. ScanPDF a été conçu pour que cette remise ne fasse pas partie du marché.

Ce que fait un convertisseur en ligne classique

Le site « photo vers PDF » habituel est un formulaire web devant un serveur. Votre fichier est envoyé, converti quelque part que vous ne voyez pas, puis restitué en téléchargement. Quelque part dans les conditions figure une promesse de le supprimer au bout d'une heure ou d'une journée.

Cette promesse est peut-être tenue. Mais c'est une promesse, pas un mécanisme, et elle ne couvre pas ce dont on ne vous a jamais parlé : par combien de machines le fichier est passé, ce qui a été journalisé, quel sous-traitant a conservé la sauvegarde, ou ce qu'exposera une future fuite. Pour une pièce d'identité ou un contrat signé, l'évaluation honnête du risque est la suivante : une fois l'envoi terminé, l'issue ne vous appartient plus.

Ce que fait ScanPDF à la place

Il n'y a pas d'étape d'envoi, parce qu'il n'y a nulle part où envoyer. ScanPDF est une page statique. Votre navigateur lit la photo sur le disque, et tout ce qui suit se passe dans l'onglet :

  • La détection des bords s'exécute sur une compilation WebAssembly d'OpenCV, sur votre propre processeur.
  • La correction de perspective et les filtres sont appliqués en mémoire à l'image en pleine résolution.
  • Le PDF est assemblé localement avec pdf-lib puis remis au navigateur comme un téléchargement ordinaire.

Aucune requête ne transporte les données de vos images, parce qu'une telle requête n'existe pas dans le code. L'ensemble fonctionne câble réseau débranché, une fois l'application chargée. Les photos que vous envoyez depuis une autre application via Partager puis ScanPDF sont elles aussi remises sur l'appareil : le service worker de l'application répond lui-même à cette requête, et rien n'est transmis. Un cas limite mérite d'être connu : si vous effacez les données du site alors que l'application est encore installée sur Android, il ne reste rien sur l'appareil pour recevoir le partage suivant, et le navigateur envoie alors ces photos à l'hébergeur, qui ne les accepte pas. Ouvrez l'application une fois après avoir effacé ses données, et le partage reste de nouveau sur l'appareil.

Vérifiable, et pas seulement affirmé

Une promesse de confidentialité que l'on ne peut pas contrôler ne vaut pas grand-chose ; celle-ci est donc organisée pour être contrôlable de trois façons.

  • Constatez-le vous-même. Ouvrez les outils de développement de votre navigateur, passez à l'onglet réseau et numérisez un document. Une fois les fichiers de l'application chargés, plus rien n'est émis.
  • Lisez le code. L'application entière est sous licence MIT et vit sur GitHub : quelques centaines de lignes de modules JavaScript ordinaires, sans étape de compilation pour les masquer, et deux dépendances figées par URL et SHA-256.
  • Laissez le navigateur l'imposer. Le conteneur auto-hébergé embarque une Content-Security-Policy stricte qui limite les connexions à sa propre origine. Sous ce régime, une requête accidentelle vers un hôte externe est bloquée par le navigateur, et pas seulement absente du code.

La démo hébergée face à l'auto-hébergement

Cette différence mérite d'être énoncée précisément, car la plupart des sites ne le font pas.

La démo sur scanpdf.io est le même code, servi depuis GitHub Pages. Le traitement y est lui aussi entièrement côté client, et vos documents ne quittent toujours pas votre machine. Ce qui change, c'est qui contrôle les en-têtes de réponse : sur GitHub Pages, c'est GitHub, si bien que la CSP stricte de la configuration nginx du projet ne s'y applique pas. GitHub voit également la requête web ordinaire portant sur la page elle-même, comme le ferait n'importe quel hébergeur.

Si vous voulez que la garantie soit imposée par le navigateur plutôt que fondée sur le fait que le code est bien ce qu'il prétend être, faites-le tourner vous-même. Une seule commande démarre le conteneur, et il n'a besoin d'aucun accès réseau à l'exécution.

Essayez

Ouvrez le scanner et déposez-y un document que vous n'auriez envoyé nulle part. C'est précisément l'intérêt. Si vous photographiez du papier pour la première fois, le guide de numérisation explique comment obtenir un résultat propre dès le premier essai.