Changer de bibliothèque PDF sans tout réécrire

Seule une partie de votre programme écrit des documents. Vos maquettes de page, vos données, vos règles métier et vos écrans ne bougent pas. Ce qui bouge, c’est la poignée de fichiers qui transforment une ligne de données en une page — et ces fichiers reposent sur les mêmes idées que le moteur présenté ici.

Ce que vous remplacez, et ce à quoi 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 deuxième partie change. La première — celle qui a demandé des années de mise au point — n’est pas concernée du tout. Elle continue de fournir les mêmes chiffres. C’est autre chose qui crée les pages.

Rien d’autre ne bouge chez vous non plus : votre base de données, votre serveur web, vos tâches planifiées, la façon dont les documents sont rangés et envoyés, vos tests, votre compilation. Vos clients reçoivent la même facture.

Ce qui est identique

Toute bibliothèque qui écrit du PDF repose sur la même poignée d’idées, parce que le format les a et que personne n’a le droit d’en inventer d’autres. Une page d’une certaine taille. Une police mise dans le fichier. Un bloc de texte qui s’écoule et se coupe quand la place manque. Un tableau avec ses colonnes et ses filets. Une image, placée et mise à l’échelle. Un code-barres. Un champ que quelqu’un remplit. Une signature. Un ensemble de faits sur le document.

Vous retrouvez tout cela ici, sous des noms que nous avons choisis, pour le même travail. Quelqu’un dont le métier est déjà d’écrire des documents reconnaît chacun de ces éléments et n’a que nos noms à apprendre.

Ce qui diffère

Nos noms sont les nôtres, notre manière 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 décrite à nouveau — elle n’est pas réinventée.

Deux autres différences. Notre moteur s’appelle depuis Rust et depuis Python ; si votre programme est écrit dans un autre langage, une interface C est prévue pour une version future, et aujourd’hui vous passeriez plutôt par le serveur — vous lui envoyez ce qu’il faut mettre sur la page, il vous renvoie le document, et cela marche depuis n’importe quel langage. Et la façon 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.

Combien de temps ça prend

Personne ne peut vous le dire au jour près sans voir votre programme. Comptez vos modèles de document — pas vos documents. Une facture est un seul modèle même si vous en envoyez quatre cent mille ; une facture, un avoir, un bon de livraison, un relevé et une relance en font cinq.

Ce qui décide de la durée, c’est ce nombre, la part de votre mise en page occupée par un tableau qui court sur plusieurs pages, et le degré d’imbrication entre le code qui crée le document et le reste de votre programme. Rien d’autre ne pèse : 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 mettez 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.

Quelle que soit la durée de la vôtre, l’équipe reste à vos côtés. Ceux qui écrivent le moteur sont ceux qui répondent à vos messages, en un jour ouvré au plus, le plus souvent moins.

Tout ce que le moteur écrit aujourd’hui

Voici ce que le moteur écrit aujourd’hui. C’est la liste à confronter à vos propres exigences, ligne par ligne.

Texte
vos propres polices incluses dans le fichier, réduites aux lettres réellement utilisées, un texte qui reste sélectionnable et cherchable, un texte qui se poursuit d’une colonne à l’autre et d’une page à l’autre, et un texte que vous pouvez mesurer avant de le tracer.
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 répétés en haut de chaque page, un tableau qui court sur autant de pages qu’il en faut.
Les images
Images JPEG, PNG, BMP et TIFF, placées, mises à l’échelle et découpées à la forme voulue ; un TIFF qui contient plusieurs images se lit image par image.
La couleur et l’impression
les couleurs d’un écran et les quatre encres d’une presse, les profils de couleur ICC, les encres d’accompagnement, la surimpression, et l’indicateur qui dit si le travail a été recouvert. Les repères de coupe et les repères de fond perdu se dessinent sur la page comme le reste, et trois des exemples dessinent les leurs.
Les codes-barres et les codes carrés
les codes-barres de la caisse de magasin, de l’entrepôt et de l’établi — Code 128, Code 39, Code 93, ITF-14, Codabar, EAN-13, UPC-A, EAN-8, UPC-E, GS1 DataBar et les deux compléments — plus les QR codes, DataMatrix, 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-2, PDF/A-3 et 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 bâtie sur la norme européenne EN 16931 — et le balisage complet sous tout cela.
Signature
les signatures PAdES, votre certificat restant sur votre machine et jamais sur la nôtre.
Protection
Le chiffrement AES-256, 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 annotations, ses liens, ses champs, 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 tout format que vous indiquez, un degré de compression au choix, une version du format au choix, les mêmes données rendant les mêmes octets à chaque fois (une date ou une clé de chiffrement vient du programme qui appelle la bibliothèque), et — point qui mérite sa propre page — un document écrit pour que sa première page s’affiche avant que le fichier ait fini d’arriver. Le livre lui-même Comment ça marche, et ce que ça fait gagner

Prévus pour une version future : une interface C, utilisable par tout langage capable d’appeler du C, et le remplacement automatique d’une police manquante.

Techniquement

Deux interfaces de langage sur un seul cœur, que vous reliez chacune à un programme à vous : une bibliothèque Rust et une roue CPython construite sur l’ABI stable, toutes deux hors ligne, toutes deux déterministes, toutes deux figées sur une version et résolvables depuis votre propre magasin d’artefacts. L’interface Python est l’interface Rust — mêmes familles d’objets, mêmes noms d’appels transposés aux conventions de Python — si bien qu’une preuve de concept écrite en Python se transpose en Rust, ou l’inverse, sans reprendre la conception.

Les appels prennent des objets typés, pas des chaînes d’options : vous construisez les objets et vous les remettez à un document. C’est un vrai coût de réécriture partout où les appels sont écrits, et un vrai gain sur tout ce qui vient ensuite — le compilateur attrape à la compilation ce qu’une interface à chaînes attrape à l’exécution, sur la machine du client.

La mise en page se mesure avant d’être arrêtée : demandez la largeur qu’occupera une portion de texte, la plus grande taille à laquelle un titre tient encore dans une largeur donnée, ou demandez à un bloc qui s’écoule jusqu’où il est allé et récupérez l’endroit où il s’est arrêté. C’est ce qui permet de contrôler une migration en la comparant à l’ancienne sortie, au lieu de la juger à l’œil.

Chaque exemple complet de ce site existe en Rust et en Python, et une part croissante d’entre eux une troisième fois sous forme de requête JSON à laquelle le serveur répond. Un script rejoue les trois et compare les résultats : octet par octet là où les deux manières de demander écrivent les mêmes instructions, point par point là où elles ne les écrivent pas. Cette comparaison est déjà écrite, et c’est la forme à recopier pour contrôler 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 l’écran.

Une troisième voie, sans rien à lier dans votre programme : envoyez au serveur une requête JSON qui décrit le document, il vous renvoie le PDF. C’est la voie pour un programme qui n’est écrit ni en Rust ni en Python, et c’est celle par où commencer pendant que la migration elle-même se prépare.

Où regarder ensuite

Tout ce que le moteur met sur une page, groupe par groupe Le moteur dans votre propre programme Demander un document par internet, sans rien installer La facture électronique, et les dates que la loi fixe

Voir les prix Voir les exemples