Puis-je créer des PDF conformes Factur-X?

Centre d'Aide

DocuGenerate gère automatiquement l’empaquetage technique requis par les normes de facturation électronique telles que Factur-X et XRechnung. Une fois que vous joignez un fichier XML conforme à un PDF généré, DocuGenerate le détecte et ajoute les métadonnées requises par la norme, sans paramètre ni configuration supplémentaire de votre part.

Comment Fonctionne la Détection

DocuGenerate recherche des balises spécifiques qui identifient le fichier XML comme un document UN/CEFACT Cross Industry Invoice (CII), la structure utilisée par Factur-X, ZUGFeRD 2.1+ et XRechnung. Lorsque ces balises sont présentes, l’identifiant de directive intégré dans le XML est utilisé pour déterminer le profil de conformité. Les profils pris en charge sont :

Profile Description
MINIMUM Contient uniquement les données comptables minimales requises à des fins de TVA.
BASIC WL Ajoute des informations au niveau de l’en-tête en plus de MINIMUM, sans lignes de facture.
BASIC Inclut toutes les lignes de facture, en suivant un sous-ensemble du modèle EN 16931.
EN 16931 Entièrement conforme à la norme européenne de facturation électronique EN 16931.
EXTENDED Prend en charge des processus métier complexes avec des données supplémentaires au-delà d’EN 16931.
XRECHNUNG Le profil de référence allemand pour les factures envoyées aux administrations publiques.

Cela s’applique uniquement aux fichiers XML qui suivent l’une de ces normes, tandis que les autres pièces jointes sont traitées comme des fichiers ordinaires.

Ajout de Métadonnées XMP

Les balises XMP suivantes sont écrites dans les métadonnées du PDF généré, ainsi que la déclaration de schéma d’extension PDF/A correspondante :

Tag Description
fx:DocumentType Le type de document. Toujours INVOICE.
fx:DocumentFileName Le nom du fichier XML joint, comme factur-x.xml.
fx:Version La version du schéma utilisé par le fichier XML joint.
fx:ConformanceLevel Le profil détecté, comme MINIMUM, BASIC WL, BASIC, EN 16931, EXTENDED ou XRECHNUNG.

Voici un exemple des balises XMP ajoutées aux métadonnées d’un PDF pour un fichier XML avec le profil MINIMUM :

<rdf:Description rdf:about="" xmlns:fx="urn:factur-x:pdfa:CrossIndustryDocument:invoice:1p0#">
  <fx:DocumentType>INVOICE</fx:DocumentType>
  <fx:DocumentFileName>factur-x.xml</fx:DocumentFileName>
  <fx:Version>1.0</fx:Version>
  <fx:ConformanceLevel>MINIMUM</fx:ConformanceLevel>
</rdf:Description>

Nommage des Fichiers

Les normes Factur-X et ZUGFeRD exigent que le fichier XML intégré utilise un nom spécifique selon le profil : factur-x.xml pour la plupart des profils, et xrechnung.xml pour le profil XRECHNUNG. Si vous spécifiez un nom de fichier, celui-ci est utilisé tel quel. Si vous joignez le fichier sous forme de data URI sans propriété name, DocuGenerate attribue automatiquement le nom de fichier correct une fois le profil détecté.

Relation du Fichier

Chaque fichier joint se voit également attribuer la valeur PDF/A-3 AFRelationship qui correspond le mieux à son rôle. Pour les profils MINIMUM et BASIC WL, celle-ci est définie sur Data, car le PDF contient généralement plus d’informations que le fichier structuré. Pour les autres profils, le fichier XML joint sous son nom officiel est défini sur Alternative, indiquant que le PDF et le XML représentent le même contenu de facture.

Exemple

Joignez votre fichier XML Factur-X ou XRechnung de la même manière que vous joindriez tout autre fichier, en utilisant le format de sortie .pdf/a-3b :

curl -X 'POST' \
  'https://api.docugenerate.com/v1/document' \
  -H 'accept: application/json' \
  -H 'Authorization: 491c000c5fad32ed7787005b0723ad55' \
  -H 'Content-Type: multipart/form-data' \
  -F 'template_id=7VYocxLnIupLU3YT4iLr' \
  -F 'attach="data:text/xml;name=factur-x.xml;base64,77u/PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KPHJzbTpDcm9zc0luZHVzdHJ5SW52b2ljZSB4bWxuczpxZHQ9InVybjp1bjp1bmVjZTp1bmNlZmFjdDpkYXRhOnN0YW5kYXJkOlF1YWxpZmllZERhdGFUeXBlOjEwMCIKeG1sbnM6cmFtPSJ1cm46dW46dW5lY2U6dW5jZWZhY3Q6ZGF0YTpzdGFuZGFyZDpSZXVzYWJsZUFnZ3JlZ2F0ZUJ1c2luZXNzSW5mb3JtYXRpb25FbnRpdHk6MTAwIgp4bWxuczpyc209InVybjp1bjp1bmVjZTp1bmNlZmFjdDpkYXRhOnN0YW5kYXJkOkNyb3NzSW5kdXN0cnlJbnZvaWNlOjEwMCIKeG1sbnM6dWR0PSJ1cm46dW46dW5lY2U6dW5jZWZhY3Q6ZGF0YTpzdGFuZGFyZDpVbnF1YWxpZmllZERhdGFUeXBlOjEwMCIKeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+CiAgICAgPHJzbTpFeGNoYW5nZWREb2N1bWVudENvbnRleHQ+CiAgICAgICAgICA8cmFtOkJ1c2luZXNzUHJvY2Vzc1NwZWNpZmllZERvY3VtZW50Q29udGV4dFBhcmFtZXRlcj4KICAgICAgICAgICAgICAgPHJhbTpJRD5TMTwvcmFtOklEPgogICAgICAgICAgPC9yYW06QnVzaW5lc3NQcm9jZXNzU3BlY2lmaWVkRG9jdW1lbnRDb250ZXh0UGFyYW1ldGVyPgogICAgICAgICAgPHJhbTpHdWlkZWxpbmVTcGVjaWZpZWREb2N1bWVudENvbnRleHRQYXJhbWV0ZXI+CiAgICAgICAgICAgICAgIDxyYW06SUQ+dXJuOmZhY3R1ci14LmV1OjFwMDptaW5pbXVtPC9yYW06SUQ+CiAgICAgICAgICA8L3JhbTpHdWlkZWxpbmVTcGVjaWZpZWREb2N1bWVudENvbnRleHRQYXJhbWV0ZXI+CiAgICAgPC9yc206RXhjaGFuZ2VkRG9jdW1lbnRDb250ZXh0PgogICAgIDxyc206RXhjaGFuZ2VkRG9jdW1lbnQ+CiAgICAgICAgICA8cmFtOklEPkYyMDI2MDAyMzwvcmFtOklEPgogICAgICAgICAgPHJhbTpUeXBlQ29kZT4zODA8L3JhbTpUeXBlQ29kZT4KICAgICAgICAgIDxyYW06SXNzdWVEYXRlVGltZT4KICAgICAgICAgICAgICAgPHVkdDpEYXRlVGltZVN0cmluZyBmb3JtYXQ9IjEwMiI+MjAyNjAxMzE8L3VkdDpEYXRlVGltZVN0cmluZz4KICAgICAgICAgIDwvcmFtOklzc3VlRGF0ZVRpbWU+CiAgICAgPC9yc206RXhjaGFuZ2VkRG9jdW1lbnQ+CiAgICAgPHJzbTpTdXBwbHlDaGFpblRyYWRlVHJhbnNhY3Rpb24+CiAgICAgICAgICA8cmFtOkFwcGxpY2FibGVIZWFkZXJUcmFkZUFncmVlbWVudD4KICAgICAgICAgICAgICAgPHJhbTpCdXllclJlZmVyZW5jZT5TRVJWRVhFQzwvcmFtOkJ1eWVyUmVmZXJlbmNlPgogICAgICAgICAgICAgICA8cmFtOlNlbGxlclRyYWRlUGFydHk+CiAgICAgICAgICAgICAgICAgICAgPHJhbTpOYW1lPkNvbXBhbnkgSW5jLjwvcmFtOk5hbWU+CiAgICAgICAgICAgICAgICAgICAgPHJhbTpTcGVjaWZpZWRMZWdhbE9yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgIDxyYW06SUQgc2NoZW1lSUQ9IjAwMDIiPjEyMzQ1Njc4MjwvcmFtOklEPgogICAgICAgICAgICAgICAgICAgIDwvcmFtOlNwZWNpZmllZExlZ2FsT3JnYW5pemF0aW9uPgogICAgICAgICAgICAgICAgICAgIDxyYW06UG9zdGFsVHJhZGVBZGRyZXNzPgogICAgICAgICAgICAgICAgICAgICAgICAgPHJhbTpDb3VudHJ5SUQ+RlI8L3JhbTpDb3VudHJ5SUQ+CiAgICAgICAgICAgICAgICAgICAgPC9yYW06UG9zdGFsVHJhZGVBZGRyZXNzPgogICAgICAgICAgICAgICAgICAgIDxyYW06U3BlY2lmaWVkVGF4UmVnaXN0cmF0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgPHJhbTpJRCBzY2hlbWVJRD0iVkEiPkZSMTExMjM0NTY3ODI8L3JhbTpJRD4KICAgICAgICAgICAgICAgICAgICA8L3JhbTpTcGVjaWZpZWRUYXhSZWdpc3RyYXRpb24+CiAgICAgICAgICAgICAgIDwvcmFtOlNlbGxlclRyYWRlUGFydHk+CiAgICAgICAgICAgICAgIDxyYW06QnV5ZXJUcmFkZVBhcnR5PgogICAgICAgICAgICAgICAgICAgIDxyYW06TmFtZT5BY21lIENvcnA8L3JhbTpOYW1lPgogICAgICAgICAgICAgICAgICAgIDxyYW06U3BlY2lmaWVkTGVnYWxPcmdhbml6YXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICA8cmFtOklEIHNjaGVtZUlEPSIwMDAyIj45ODc2NTQzMjE8L3JhbTpJRD4KICAgICAgICAgICAgICAgICAgICA8L3JhbTpTcGVjaWZpZWRMZWdhbE9yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgPC9yYW06QnV5ZXJUcmFkZVBhcnR5PgogICAgICAgICAgICAgICA8cmFtOkJ1eWVyT3JkZXJSZWZlcmVuY2VkRG9jdW1lbnQ+CiAgICAgICAgICAgICAgICAgICAgPHJhbTpJc3N1ZXJBc3NpZ25lZElEPlBPMjAxOTI1NDc4PC9yYW06SXNzdWVyQXNzaWduZWRJRD4KICAgICAgICAgICAgICAgPC9yYW06QnV5ZXJPcmRlclJlZmVyZW5jZWREb2N1bWVudD4KICAgICAgICAgIDwvcmFtOkFwcGxpY2FibGVIZWFkZXJUcmFkZUFncmVlbWVudD4KPHJhbTpBcHBsaWNhYmxlSGVhZGVyVHJhZGVEZWxpdmVyeS8+CiAgICAgICAgICA8cmFtOkFwcGxpY2FibGVIZWFkZXJUcmFkZVNldHRsZW1lbnQ+CiAgICAgICAgICAgICAgIDxyYW06SW52b2ljZUN1cnJlbmN5Q29kZT5FVVI8L3JhbTpJbnZvaWNlQ3VycmVuY3lDb2RlPgogICAgICAgICAgICAgICA8cmFtOlNwZWNpZmllZFRyYWRlU2V0dGxlbWVudEhlYWRlck1vbmV0YXJ5U3VtbWF0aW9uPgogICAgICAgICAgICAgICAgICAgIDxyYW06VGF4QmFzaXNUb3RhbEFtb3VudD4xNTAwLjAwPC9yYW06VGF4QmFzaXNUb3RhbEFtb3VudD4KICAgICAgICAgICAgICAgICAgICA8cmFtOlRheFRvdGFsQW1vdW50IGN1cnJlbmN5SUQ9IkVVUiI+MC4wMDwvcmFtOlRheFRvdGFsQW1vdW50PgogICAgICAgICAgICAgICAgICAgIDxyYW06R3JhbmRUb3RhbEFtb3VudD4xNTAwLjAwPC9yYW06R3JhbmRUb3RhbEFtb3VudD4KICAgICAgICAgICAgICAgICAgICA8cmFtOkR1ZVBheWFibGVBbW91bnQ+MTUwMC4wMDwvcmFtOkR1ZVBheWFibGVBbW91bnQ+CiAgICAgICAgICAgICAgIDwvcmFtOlNwZWNpZmllZFRyYWRlU2V0dGxlbWVudEhlYWRlck1vbmV0YXJ5U3VtbWF0aW9uPgogICAgICAgICAgPC9yYW06QXBwbGljYWJsZUhlYWRlclRyYWRlU2V0dGxlbWVudD4KICAgICA8L3JzbTpTdXBwbHlDaGFpblRyYWRlVHJhbnNhY3Rpb24+CjwvcnNtOkNyb3NzSW5kdXN0cnlJbnZvaWNlPg=="' \
  -F 'data={ "Company Name": "Acme Corp", "Invoice No": "INV-123456", "Street Address": "123 Main St", "City": "Springfield", "State": "IL", "Zip Code": "62701", "Invoice Date": "2025-02-26", "Phone": "(555) 123-4567", "Description": "Consulting services for Q1 2025", "Quantity": "10", "Amount": "150.00", "Total": "1500.00" }' \
  -F 'output_format=.pdf/a-3b'

Le PDF résultant contient à la fois la facture visuelle et le fichier XML intégré, avec les métadonnées déjà en place. Il passe avec succès la validation sur un service tiers :

PDF Factur-X généré passant la validation sur un service tiers

Limitations

DocuGenerate ne génère ni ne valide le contenu du fichier XML lui-même. Vous êtes responsable de fournir un fichier XML conforme au schéma XSD et aux règles Schematron de la norme que vous avez choisie. DocuGenerate gère uniquement l’empaquetage PDF/A-3 et les métadonnées qui décrivent le fichier joint, et non les données qu’il contient.

Pour un tutoriel complet et détaillé couvrant la création de modèles, la préparation du XML et la génération de PDF, consultez Comment Créer des Factures PDF ZUGFeRD / Factur-X avec DocuGenerate.