Skip to content

ZUGFeRD / Factur-X e-Invoice

Créez une facture électronique ZUGFeRD / Factur-X -- un PDF hybride que les humains peuvent lire et les machines peuvent analyser automatiquement.

Qu'est-ce que ZUGFeRD / Factur-X ?

ZUGFeRD (Allemagne) et Factur-X (France / UE) sont le même standard sous deux noms. Une facture conforme contient :

  1. PDF visuel -- une facture lisible par l'homme rendue en PDF/A-3 (ou PDF/A-4f)
  2. XML intégré -- données de facture lisibles par machine au format UN/CEFACT Cross Industry Invoice (CII), attachées dans le PDF

Cela permet un traitement entièrement automatisé tout en conservant un document visuel familier pour les comptables et auditeurs.

Profils

ProfilUtilisation typique
MinimumNuméro de facture, date, totaux, taxe
Basic WL+ Postes, conditions de paiement
Basic+ Postes détaillés
EN 16931 (Comfort)Conformité marchés publics UE
ExtendedFactures multi-taxes complexes
XRechnungFacturation secteur public allemand

Exigence PDF/A

ZUGFeRD nécessite que le PDF hôte soit PDF/A-3 ou PDF/A-4f (ISO 19005). La variante "f" autorise les fichiers intégrés. TCPDF-Next gère automatiquement les métadonnées de conformité, l'output intent et les indicateurs de pièces jointes.

Exemple de code complet

php
<?php

declare(strict_types=1);

require __DIR__ . '/vendor/autoload.php';

use TcpdfNext\Document;
use TcpdfNext\Enums\PdfALevel;
use TcpdfNext\Archive\OutputIntent;
use TcpdfNext\Archive\EmbeddedFile;
use TcpdfNext\Archive\AFRelationship;

// ── 1. Créer un document PDF/A-4f ──────────────────────────────────────
$pdf = Document::create()
    ->setPdfALevel(PdfALevel::A4F)
    ->setOutputIntent(OutputIntent::sRGB())
    ->setTitle('Invoice INV-2026-0042')
    ->setAuthor('Acme GmbH')
    ->setSubject('Invoice for Order PO-2026-0815');

// ── 2. Rendre la facture visuelle ───────────────────────────────────────
$invoiceHtml = <<<'HTML'
<h1 style="color:#1a2634;">INVOICE</h1>
<table style="width:100%; margin-bottom:20px;">
    <tr>
        <td><strong>Acme GmbH</strong><br>Friedrichstr. 123<br>10117 Berlin, DE</td>
        <td style="text-align:right;"><strong>INV-2026-0042</strong><br>Date: 2026-02-15<br>Due: 2026-03-17</td>
    </tr>
</table>
<table border="1" cellpadding="6" style="width:100%; border-collapse:collapse;">
    <thead>
        <tr style="background:#1a2634; color:#fff;">
            <th>#</th><th>Description</th><th style="text-align:right;">Amount</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>1</td>
            <td>Professional Services -- February 2026</td>
            <td style="text-align:right;">EUR 1,000.00</td>
        </tr>
    </tbody>
    <tfoot>
        <tr><td colspan="2" style="text-align:right;">Net</td><td style="text-align:right;">EUR 1,000.00</td></tr>
        <tr><td colspan="2" style="text-align:right;">VAT 19%</td><td style="text-align:right;">EUR 190.00</td></tr>
        <tr style="font-weight:bold;">
            <td colspan="2" style="text-align:right;">Total</td>
            <td style="text-align:right;">EUR 1,190.00</td>
        </tr>
    </tfoot>
</table>
HTML;

$pdf->addPage()
    ->setFont('helvetica', size: 10)
    ->writeHtml($invoiceHtml);

// ── 3. Construire le XML Factur-X (profil EN 16931) ───────────────────────
$xml = <<<'XML'
<?xml version="1.0" encoding="UTF-8"?>
<rsm:CrossIndustryInvoice
    xmlns:rsm="urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100"
    xmlns:ram="urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100"
    xmlns:udt="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100">
  <rsm:ExchangedDocumentContext>
    <ram:GuidelineSpecifiedDocumentContextParameter>
      <ram:ID>urn:factur-x.eu:1p0:en16931</ram:ID>
    </ram:GuidelineSpecifiedDocumentContextParameter>
  </rsm:ExchangedDocumentContext>
  <rsm:ExchangedDocument>
    <ram:ID>INV-2026-0042</ram:ID>
    <ram:TypeCode>380</ram:TypeCode>
    <ram:IssueDateTime>
      <udt:DateTimeString format="102">20260215</udt:DateTimeString>
    </ram:IssueDateTime>
  </rsm:ExchangedDocument>
  <rsm:SupplyChainTradeTransaction>
    <ram:ApplicableHeaderTradeAgreement>
      <ram:SellerTradeParty>
        <ram:Name>Acme GmbH</ram:Name>
        <ram:SpecifiedTaxRegistration>
          <ram:ID schemeID="VA">DE123456789</ram:ID>
        </ram:SpecifiedTaxRegistration>
      </ram:SellerTradeParty>
      <ram:BuyerTradeParty>
        <ram:Name>Customer Corp</ram:Name>
      </ram:BuyerTradeParty>
    </ram:ApplicableHeaderTradeAgreement>
    <ram:ApplicableHeaderTradeSettlement>
      <ram:InvoiceCurrencyCode>EUR</ram:InvoiceCurrencyCode>
      <ram:SpecifiedTradeSettlementHeaderMonetarySummation>
        <ram:LineTotalAmount>1000.00</ram:LineTotalAmount>
        <ram:TaxBasisTotalAmount>1000.00</ram:TaxBasisTotalAmount>
        <ram:TaxTotalAmount currencyID="EUR">190.00</ram:TaxTotalAmount>
        <ram:GrandTotalAmount>1190.00</ram:GrandTotalAmount>
        <ram:DuePayableAmount>1190.00</ram:DuePayableAmount>
      </ram:SpecifiedTradeSettlementHeaderMonetarySummation>
    </ram:ApplicableHeaderTradeSettlement>
  </rsm:SupplyChainTradeTransaction>
</rsm:CrossIndustryInvoice>
XML;

// ── 4. Intégrer le XML comme fichier associé ─────────────────────────────
$pdf->addEmbeddedFile(
    EmbeddedFile::create()
        ->setFilename('factur-x.xml')
        ->setMimeType('text/xml')
        ->setContent($xml)
        ->setRelationship(AFRelationship::Alternative)
        ->setDescription('Factur-X EN 16931 invoice data')
);

// ── 5. Définir les métadonnées XMP ZUGFeRD ────────────────────────────────────────
$pdf->getMetadata()
    ->setXmpProperty('fx:DocumentType', 'INVOICE')
    ->setXmpProperty('fx:DocumentFileName', 'factur-x.xml')
    ->setXmpProperty('fx:Version', '1.0')
    ->setXmpProperty('fx:ConformanceLevel', 'EN 16931');

// ── 6. Sauvegarder ────────────────────────────────────────────────────────────
$pdf->save(__DIR__ . '/INV-2026-0042.pdf');

echo 'ZUGFeRD invoice created.' . PHP_EOL;

Validation

bash
# Conformité PDF/A
verapdf --flavour 4f INV-2026-0042.pdf

# Schéma XML Factur-X
java -jar Mustang-CLI.jar --action validate --source INV-2026-0042.pdf

TIP

Mustangproject est un validateur open source gratuit pour factures ZUGFeRD/Factur-X.

Diagramme de workflow

Données ERP / facturation
        |
        v
  Génération TCPDF-Next
        |
        v
  PDF/A-4f + factur-x.xml intégré
        |
        v
  (optionnel) Signature numérique PAdES
        |
        +-------+-------+-------+
        |       |       |       |
      Email   Portail PEPPOL  Archive

Lecture complémentaire

Distribué sous licence LGPL-3.0-or-later.