Skip to content

ZUGFeRD / Factur-X e-Invoice

Buat invoice elektronik ZUGFeRD / Factur-X -- PDF hybrid yang bisa dibaca manusia dan diproses mesin secara otomatis.

Apa itu ZUGFeRD / Factur-X?

ZUGFeRD (Jerman) dan Factur-X (Prancis / EU) adalah standar yang sama dengan dua nama. Invoice yang sesuai berisi:

  1. PDF Visual -- invoice yang bisa dibaca manusia di-render sebagai PDF/A-3 (atau PDF/A-4f)
  2. XML Tertanam -- data invoice yang bisa dibaca mesin dalam format UN/CEFACT Cross Industry Invoice (CII), dilampirkan di dalam PDF

Ini memungkinkan pemrosesan yang sepenuhnya otomatis sambil tetap menjaga dokumen visual yang familiar bagi akuntan dan auditor.

Profil

ProfilPenggunaan Umum
MinimumNomor invoice, tanggal, total, pajak
Basic WL+ Item baris, syarat pembayaran
Basic+ Item baris detail
EN 16931 (Comfort)Kepatuhan pengadaan publik EU
ExtendedInvoice multi-pajak yang kompleks
XRechnungFaktur sektor publik Jerman

Persyaratan PDF/A

ZUGFeRD mensyaratkan PDF host harus PDF/A-3 atau PDF/A-4f (ISO 19005). Varian "f" memungkinkan file tertanam. TCPDF-Next menangani metadata kepatuhan, output intent, dan flag lampiran file secara otomatis.

Contoh Kode Lengkap

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. Buat dokumen 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. Render invoice visual ------------------------------------------------
$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. Bangun 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. Embed XML sebagai associated file ------------------------------------
$pdf->addEmbeddedFile(
    EmbeddedFile::create()
        ->setFilename('factur-x.xml')
        ->setMimeType('text/xml')
        ->setContent($xml)
        ->setRelationship(AFRelationship::Alternative)
        ->setDescription('Factur-X EN 16931 invoice data')
);

// -- 5. Set metadata 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. Simpan ---------------------------------------------------------------
$pdf->save(__DIR__ . '/INV-2026-0042.pdf');

echo 'ZUGFeRD invoice created.' . PHP_EOL;

Validasi

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

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

TIP

Mustangproject adalah validator open-source gratis untuk invoice ZUGFeRD/Factur-X.

Diagram Alur Kerja

Data ERP / billing
        |
        v
  TCPDF-Next generate
        |
        v
  PDF/A-4f + embedded factur-x.xml
        |
        v
  (opsional) tanda tangan digital PAdES
        |
        +-------+-------+-------+
        |       |       |       |
      Email   Portal  PEPPOL  Arsip

Bacaan Lanjutan

Didistribusikan di bawah lisensi LGPL-3.0-or-later.