Votre propre design PDF en Factur-X/ZUGFeRD

Comment un PDF de facture au design soigné devient une facture hybride : PDF/A-3, XML intégré, XMP — et ce qui échoue le plus souvent en pratique.

Raw

Beaucoup d’équipes disposent d’un PDF de facture soigneusement mis en page — logo, typographie maison, pied de page avec conditions de règlement — et doivent désormais en faire une facture électronique sans renoncer au design. C’est précisément la raison d’être de Factur-X et de ZUGFeRD : des factures hybrides, lisibles par l’humain comme avant, et porteuses d’un XML structuré pour les machines. Le chemin est bien spécifié, mais il échoue régulièrement en pratique sur une poignée de détails.

Anatomie : un PDF/A-3 avec un XML CII intégré

Une facture Factur-X/ZUGFeRD se compose de trois couches :

Le conteneur est un PDF/A-3. Ni PDF 1.4, ni PDF 1.7, mais la norme d’archivage ISO 19005-3 — la seule variante PDF/A qui autorise des pièces jointes arbitraires. Le PDF/A-3 interdit par ailleurs le chiffrement, le JavaScript et les dépendances externes comme les polices non embarquées.

Le XML intégré est un fichier UN/CEFACT CII dont le nom est normalisé et dépend du standard et de la version : factur-x.xml pour Factur-X 1.0 et ZUGFeRD 2.1+ (xrechnung.xml dans le profil XRECHNUNG), zugferd-invoice.xml pour ZUGFeRD 2.0, ZUGFeRD-invoice.xml pour l’ancien ZUGFeRD 1.0. La pièce jointe doit porter une entrée AFRelationship — en général Alternative pour les profils complets (le XML est une représentation alternative de la même facture), mais Data ou Source pour les profils réduits MINIMUM et BASIC WL.

Les métadonnées XMP du PDF déclarent, via le schéma d’extension Factur-X, ce qui est intégré : DocumentType (INVOICE), DocumentFileName (exactement le nom de la pièce jointe), Version et ConformanceLevel — c’est-à-dire le profil, de MINIMUM à EXTENDED. Les systèmes destinataires lisent cette déclaration avant même de toucher au XML.

Les pièges classiques

Presque toutes les factures hybrides défectueuses relèvent de l’un de ces schémas :

Les outils, en bref

Inutile de réinventer la roue. Dans l’écosystème Java, mustangproject et PDFBox sont des voies éprouvées pour convertir un PDF existant en PDF/A-3 et y joindre le XML avec AFRelationship et XMP ; des bibliothèques comparables existent pour .NET et Python. Le principe reste toujours le même : rendre le PDF au design habituel, puis, dans une seconde étape, convertir le conteneur, intégrer le XML, écrire le XMP.

Une priorité doit rester claire : la partie lisible par machine est ce que les destinataires traitent réellement — le design n’est là que pour l’œil. C’est au XML qu’il faut consacrer le soin : arithmétique des totaux correcte, champs obligatoires complets, bon profil. Un beau PDF avec un XML cassé n’est pas une facture électronique ; un PDF sobre avec un XML propre, si.

Le circuit de vérification : contre-vérifier le résultat

Avant tout envoi, le PDF généré passe par le validateur Billhorse : il extrait le XML intégré directement du conteneur PDF et le valide contre l’EN 16931 et les règles propres au profil — entièrement dans le navigateur, sans téléversement. Si aucun XML de facture n’est trouvé dans le PDF, le résultat est BH-PDF-01 — le symptôme le plus fréquent d’une chaîne de génération qui a simplement oublié l’étape d’intégration. Si le PDF est chiffré, cela est signalé explicitement comme BH-PDF-02, et non comme une vague erreur d’analyse. Testez avec de vrais cas limites : une facture avec remise, un avoir, une facture à plusieurs taux de TVA — c’est là qu’apparaissent les erreurs de mapping que l’exemple nominal ne déclenche jamais.

Obligation : la partie visible et le XML doivent concorder

Un point n’est pas une question de style mais une obligation : le PDF visible et le XML intégré doivent décrire la même facture. Juridiquement, c’est la partie structurée qui fait foi — si le rendu visuel s’en écarte, c’est le XML qui prévaut. Les divergences naissent presque toujours quand PDF et XML sont produits par des chemins de code séparés : le PDF arrondit autrement, le XML ignore la remise, une ligne manque. L’architecture robuste rend les deux représentations depuis la même source de données — un modèle de facture, deux sorties. Construit ainsi dès le départ, la cohérence n’a plus jamais besoin d’être vérifiée à la main.

Vérifiez le résultat directement

Le validateur Billhorse vérifie Factur-X, XRechnung et ZUGFeRD directement dans votre navigateur — votre fichier n'est jamais envoyé.

Ouvrir le validateur

← Tous les guides · Mis à jour: 2026-07-04