Extraire le XML d'un Factur-X en 30 secondes
Un PDF Factur-X, un glisser-deposer, et le XML structure est entre vos mains.
Un fichier Factur-X est un PDF/A-3 dans lequel est embarque, en piece jointe, un fichier nommefactur-x.xml. Ce XML contient toute la facture sous forme structuree, conforme a la norme européenne EN 16931. Pour de nombreux cas d'usage ERP, contrôle qualite, archivage long terme il est utile de recuperer ce XML seul, sans le PDF qui l'enveloppe. Cet article decrit la procédure la plus courte : trois clics dans notre extracteur, ou une commande pour automatiser.
Pourquoi extraire le XML
Le XML embarque dans un Factur-X est la version machine de la facture. Le PDF sert a l'humain : il est lisible a l'ecran, imprimable, et c'est lui qui fait foi visuellement. Le XML, lui, est ce que les systèmes informatiques consomment. Trois grandes raisons de l'extraire en pratique :
- Alimenter un ERP ou un outil comptable : la plupart des logiciels metier (Sage, Cegid, Odoo, EBP, Pennylane) acceptent l'import de factures au format XML UBL ou CII. Le XML d'un Factur-X est du CII (Cross Industry Invoice), directement digerable par les modules conformes EN 16931.
- Contrôler le contenu structure : en cas de divergence entre le visuel PDF et les donnees XML (montants, TVA, identifiants), c'est le XML qui sera utilisé par la chaine de traitement automatique. L'ouvrir permet de vérifier que les champs sont coherents avant transmission ou comptabilisation.
- Archiver la donnee structuree : certains contextes (audits, contrôles fiscaux, intégration data) requierent un acces direct au XML sans avoir a re-extraire le PDF a chaque fois. C'est aussi utile pour alimenter un entrepot de donnees ou un outil de BI sur les factures reçues.
A noter que la specification Factur-X impose que le fichier embarque s'appelle exactementfactur-x.xml, en minuscules, attaché au PDF via la relationAFRelationship /Alternative. Si ce nom ou cette relation n'est pas respecte, le fichier n'est pas un Factur-X valide : voir notre article sur laspecification Factur-X 1.0.08 pour le détail.
Drag-drop dans notre extracteur (3 etapes)
L'outil le plus rapide pour cette operation est notre extracteur Factur-X. Il fonctionne entierement côté serveur, sans installation, et restitue le XML immediatement. La procédure tient en trois etapes :
- Ouvrir l'extracteur. Rendez-vous sur /extraire. La page présente une zone de depot au centre. Aucun compte n'est requis pour les fichiers ponctuels.
- Deposer le PDF Factur-X. Glissez le fichier depuis votre explorateur, ou cliquez sur la zone pour ouvrir une boite de dialogue. Le fichier est envoyé via une connexion HTTPS au backend, qui lit la structure PDF/A-3 et localise la piece jointe
factur-x.xml. - Telecharger factur-x.xml. Si l'extraction reussit, un bouton de telechargement apparaît. Le fichier obtenu est identique a celui embarque dans le PDF, octet pour octet : aucune transformation, reformatage ou recompression n'est appliquee.
Si le PDF ne contient pas de Factur-X, l'outil renvoie un code d'erreur explicite (par exemple NO_FACTURX_XML_EMBEDDED ou PROFILE_NOT_DETECTED) qui permet d'orienter le diagnostic. Pour un PDF dont vous n'etes pas sur qu'il soit bien un Factur-X, commencez plutot par notre visualiseur, qui affiche le profil détecté et liste les champs CII lus.
Cas d'usage du XML obtenu
Une fois factur-x.xml entre vos mains, les usages varient selon le contexte metier. Le tableau ci-dessous resume les principaux scenarios rencontres :
| Cas d'usage | Action sur le XML | Profil suffisant |
|---|---|---|
| Import en comptabilite | Mapping vers le modèle interne (fournisseur, lignes, TVA, total) | BASIC ou supérieur |
| Pre-comptabilisation rapide | Lecture des montants HT/TTC et de la TVA seulement | MINIMUM suffit |
| Reconciliation BC / facture | Recuperer la référence de commande (BT-13) | BASIC WL ou supérieur |
| Détail ligne a ligne | Iterer sur les IncludedSupplyChainTradeLineItem | EN 16931 ou EXTENDED |
| Archivage data legal | Stocker tel quel a côté du PDF | Tous |
Le profil détermine ce que le XML contient reellement. Un Factur-Xprofil MINIMUM ne porte que 18 champs et ne contient pas les lignes de facture, par exemple. Pour une vue d'ensemble des profils, voirnotre comparatif des profils Factur-X. Si vous manipulez aussi des fichiers d'origine allemande, gardez en tête que ZUGFeRD 2.x partage la même structure CII : les bibliothèques de parsing fonctionnent indifferemment sur les deux (cf ZUGFeRD vs Factur-X).
Vérifier le XML extrait
Une fois extrait, il est de bonne pratique de valider le XML avant de l'ingerer dans un système aval. Trois niveaux de contrôle sont possibles :
- Validation XSD : le XML doit être syntaxiquement conforme au schema CII publie par UN/CEFACT. Une erreur XSD signale generalement un fichier corrompu ou un émetteur non conforme.
- Validation Schematron EN 16931 : les règles metier de la norme européenne (totaux coherents, TVA correcte, codes pays valides) sont verifiees par les assertions Schematron maintenues par le CEN/TC 434.
- Règles françaises (CIUS) : la France ajoute quelques contraintes spécifiques au-dessus de l'EN 16931, principalement liees au SIREN et aux mentions obligatoires (article 242 nonies A du CGI).
Notre validateur applique ces trois niveaux en un seul passage et retourne la liste exhaustive des erreurs et avertissements, avec le code de règle et le chemin XPath de l'élément fautif. C'est l'outil a utiliser après extraction si vous avez un doute sur la qualite du XML émis par votre fournisseur.
Automatisation : lib factur-x Akretion en CLI
Pour un traitement en masse extraction quotidienne d'une boite mail fournisseurs, batch sur un repertoire, intégration dans un pipeline CI le drag-drop manuel atteint vite ses limites. Le moyen le plus simple d'automatiser côté serveur est la bibliothèque Python factur-x publiee par Akretion, qui est aussi le moteur que nous utilisons en interne. L'extraction se fait en une ligne :
# Installation
pip install factur-x
# Extraction du XML depuis un PDF
python -c "from facturx import get_facturx_xml_from_pdf; \
pdf = open('facture.pdf', 'rb').read(); \
level, xml = get_facturx_xml_from_pdf(pdf); \
open('factur-x.xml', 'wb').write(xml); \
print('Profile detected:', level)"
La fonction get_facturx_xml_from_pdf retourne un tuple(profile, xml_bytes). Le profil est l'un deminimum, basicwl, basic, en16931 ouextended, lu depuis les metadonnees XMP du PDF/A-3. Cela permet d'orienter le parsing aval : pas la peine de chercher les lignes de facture dans un MINIMUM.
Pour un traitement par lot, encapsuler dans un script qui parcourt un repertoire et écrit chaque XML extrait dans un dossier de destination est trivial. C'est la pratique recommandée pour alimenter un dossier de batch ERP : chaque PDF d'origine et son XML sont archives côté a côté, et seul le XML est ingere par le pipeline metier.
En complement, la même bibliothèque permet le sens inverse : intégrer unfactur-x.xml dans un PDF existant pour produire un Factur-X conforme. C'est ce qui est expose dans notre générateur et détaillé dans laspecification 1.0.08.
Ce qu'il faut retenir
- Le XML embarque dans un Factur-X s'appelle toujours
factur-x.xmlet suit la syntaxe UN/CEFACT CII. - L'extraction est une lecture pure : aucun XML n'est reconstruit, c'est le fichier original embarque qui est restitue.
- Pour un fichier ponctuel, le drag-drop dans l'extracteurtient en moins de 30 secondes. Pour un volume, la lib
factur-xd'Akretion en Python fait le travail en une ligne. - Après extraction, validez systematiquement le XML avant ingestion : notrevalidateur applique XSD, Schematron EN 16931 et règles françaises en un passage.
Pour aller plus loin sur la structure des donnees une fois le XML obtenu, consulterle profil MINIMUM en 18 champs qui détaillé les éléments CII portes par le plus petit profil, ou le comparatifdes profils Factur-X pour choisir le bon niveau de granularite selon le contexte.