Changer de bibliothèque PDF sans tout réécrire
La partie de votre programme qui écrit les documents est plus petite qu'elle n'en a l'air. Vos maquettes, vos données, vos règles de gestion et vos écrans ne bougent pas. Ce qui bouge, c'est la poignée de fichiers qui transforme une ligne de données en page — et les idées qu'ils contiennent sont les mêmes idées ici.
Ce que vous remplacez, et ce que vous ne touchez pas
Prenez votre logiciel de facturation. Il y a la partie qui décide de ce qui va sur une facture : quel client, quelles lignes, quels totaux, quelles règles dans quel pays. Et il y a la partie qui met tout ça sur le papier : ce texte-ci, ce tableau-là, le logo en haut à gauche, le code-barres en bas à droite.
Seule la seconde partie change. La première — celle que personne ne veut toucher, celle qui a mis des années à être juste — n'est pas concernée du tout. Elle continue de tendre les mêmes chiffres. C'est autre chose qui les dessine.
Rien d'autre ne bouge chez vous non plus : votre base de données, votre serveur web, vos traitements planifiés, la façon dont les documents sont rangés et envoyés, vos tests, votre chaîne de construction. Vos clients reçoivent le même document.
Ce qui se ressemble
Toutes les bibliothèques qui écrivent du PDF reposent sur la même poignée d'idées, parce que le format les porte et que personne n'a le droit d'en inventer d'autres. Une page d'un certain format. Une police d'écriture mise dans le fichier. Un bloc de texte qui coule et se coupe là où la place manque. Un tableau avec ses colonnes et ses filets. Une image, posée et mise à l'échelle. Un code-barres. Une case que quelqu'un remplit. Une signature. Un jeu d'informations sur le document.
Vous connaissez déjà tout ça. Vous retrouverez tout ça ici, sous des noms que nous avons choisis, à faire le même travail. Quelqu'un qui a déjà écrit des documents pour vivre est productif le deuxième jour, pas le deuxième mois.
Ce qui diffère
Nous n'avons copié la manière d'appeler de personne, et nous n'allons pas prétendre le contraire. Nos noms sont les nôtres, notre façon de composer une page est la nôtre, et vos programmeurs réécrivent les appels.
Ce qu'ils ne réécrivent pas, c'est la maquette. La page que vous avez aujourd'hui, avec le logo à cette hauteur et le tableau qui commence à cette ligne, est redécrite — elle n'est pas réinventée. C'est toute la raison d'être de cette page.
Deux autres différences honnêtes, dites maintenant plutôt que découvertes plus tard. Notre moteur s'appelle depuis Rust et depuis Python ; si votre programme est écrit dans un autre langage, la porte d'entrée pour lui est prévue pour une version future, et aujourd'hui vous passeriez par le serveur — vous lui envoyez ce qu'il faut dessiner et il vous rend le document, ce qui marche depuis n'importe quel langage. Et la manière de demander les choses est écrite en entier sur ce site, page par page, avec un document à télécharger pour chacune : vous pouvez tout lire avant de vous engager à quoi que ce soit.
Combien de temps ça prend
Personne ne peut vous le dire au jour près sans voir votre programme, alors voici comment le calculer vous-même. Comptez vos modèles de document — pas vos documents. Une facture est un modèle même si vous en envoyez quatre cent mille ; une facture, un avoir, un bon de livraison, un relevé et une relance, ça fait cinq.
Ce qui décide de la durée, c'est ce compte, la part de vos maquettes qui est un tableau courant sur beaucoup de pages, et la façon dont le dessin est mêlé au reste de votre programme. Rien d'autre ne pèse dessus : vos données, vos règles et vos écrans restent où ils sont.
Quelle que soit la taille, faites ceci d'abord : prenez votre document le plus compliqué, réécrivez-le chez nous, et posez les deux côte à côte. Si celui-là sort juste, le reste est de la répétition. S'il ne sort pas juste, vous l'avez appris au début plutôt qu'à la fin.
La liste, sans trous
Voici ce que le moteur écrit aujourd'hui. C'est la liste à confronter à vos propres exigences, ligne par ligne.
- Texte
- vos propres polices d'écriture portées dans le fichier, seules les lettres réellement utilisées voyageant avec, du texte qui reste sélectionnable et cherchable, du texte qui coule sur plusieurs colonnes et plusieurs pages, et du texte que vous pouvez mesurer avant de le dessiner.
- Les tableaux
- des colonnes que vous dimensionnez ou que le moteur dimensionne, filets et bordures côte à côte, cellules fusionnées, en-têtes redessinés en haut de chaque page, un tableau qui court sur autant de pages qu'il en faut.
- Les images
- JPEG, PNG et BMP, posées, mises à l'échelle et détourées ; d'autres formats d'image sont prévus pour une version future.
- Les couleurs et l'impression
- les couleurs de l'écran et les quatre encres de la presse, les profils de couleur ICC, les encres d'accompagnement, la surimpression et le recouvrement, les traits de coupe et le débord.
- Les codes-barres et les codes carrés
- les codes-barres du commerce et de la logistique, les QR codes, Data Matrix, PDF417 et Aztec.
- Les formulaires
- des cases où l'on tape, où l'on coche, où l'on choisit dans une liste, et où l'on signe.
- Les normes
- PDF/A-1 à PDF/A-4 pour garder un document lisible, PDF/X-4 pour l'imprimerie, PDF/UA-1 et PDF/UA-2 pour un document lisible sans voir la page, Factur-X pour la facture électronique — celle qui repose sur la norme européenne EN 16931 — et le balisage complet sous tout ça.
- La signature
- les signatures PAdES, votre certificat restant sur votre machine et jamais sur la nôtre.
- Protection
- le brouillage sous une clé de 256 bits, un mot de passe avant que la première page s'affiche, et des autorisations par action.
- La lecture d'un PDF que vous avez déjà
- ouvrir un fichier écrit par un autre programme, lire ses pages, ses informations, ses liens, ses cases, ses signets, ses calques et sa structure, et reprendre une page entière dans le document que vous écrivez.
- Le fichier lui-même
- tous les formats de page usuels et n'importe quel format que vous nommez, le serrage de votre choix, la version de format de votre choix, les mêmes chiffres redonnant les mêmes octets à chaque fois, et — celle qui mérite une page à elle seule — un document écrit pour que sa première page s'affiche avant que le fichier ait fini d'arriver. Comment ça marche, et ce que ça fait gagner
Prévus pour une version future : une porte d'entrée pour les langages qui appellent en C, les formats d'image JBIG2 et JPEG 2000, et le remplacement automatique d'une police d'écriture manquante.
Techniquement
Deux façades sur un noyau : un crate Rust et une roue CPython construite contre l'ABI stable, toutes deux hors ligne, toutes deux déterministes, toutes deux figées sur une version et résolvables depuis votre propre dépôt d'artefacts. La surface Python est la surface Rust — mêmes familles d'objets, mêmes noms d'appel transposés aux conventions Python — donc une maquette en Python se transporte en Rust, ou l'inverse, sans reconception.
Aucune API par chaînes d'options, aucune émulation de la surface d'appel de qui que ce soit : vous construisez des objets typés et vous les remettez à un document. C'est un vrai coût de réécriture sur les sites d'appel et un vrai gain sur tout ce qui vient après — le compilateur attrape à la construction ce qu'une API par chaînes attrape à l'exécution, sur la machine du client.
La mise en page se mesure avant d'être engagée : demander la largeur qu'occupera un texte, demander la plus grande taille à laquelle un titre tient encore dans une largeur donnée, demander à un bloc qui coule jusqu'où il est allé et récupérer où il s'est arrêté. C'est ce qui permet de vérifier une migration contre l'ancienne sortie au lieu de la juger à l'œil.
Chaque exemple de ce site existe en Rust et en Python, et une part croissante une troisième fois en requête JSON que le serveur honore. Un script relance les trois et compare ce qui en sort, octet à octet là où les deux manières de demander écrivent les mêmes instructions, point à point là où elles ne les écrivent pas. C'est votre harnais de parité, déjà écrit, et c'est la forme à copier pour vérifier votre propre migration : l'ancien fichier et le nouveau, page par page, comparés par un programme plutôt que par quelqu'un qui fait défiler.
Troisième façade, sans une ligne de code : envoyez au serveur une requête JSON qui décrit le document et il vous rend le PDF. C'est la voie pour un programme écrit ni en Rust ni en Python, et c'est la voie par où commencer pendant que la vraie migration se prépare.
Où regarder ensuite
Tout ce que le moteur pose sur une page, famille par famille Le moteur à l'intérieur de votre propre programme Demander un document par internet, sans rien installer La facture électronique, et les dates que la loi fixe