Was eine ZUGFeRD-Rechnung ist
Eine Datei, zwei Leser: Menschen lesen die PDF-Seite, die Buchhaltungssoftware liest das XML darin.
ZUGFeRD ist das deutsche hybride Rechnungsformat. Es wird vom Forum elektronische Rechnung Deutschland (FeRD) gepflegt. Außen ist es ein PDF/A-3-Dokument, das wie jede Rechnung aussieht. Innen steckt eine XML-Datei in der Syntax Cross Industry Invoice (CII). Dieses XML enthält jedes Feld der Rechnung in der Form, die die EN 16931 vorgibt.
Seit Version 2.1 sind ZUGFeRD und das französische Factur-X derselbe Standard. Beide betten eine Datei namens factur-x.xml ein und beschreiben sie in denselben PDF-Metadaten. Ein deutscher Kunde, der ZUGFeRD verlangt, und ein französischer, der Factur-X will, öffnen dieselbe Datei.
- Das PDF ist PDF/A-3b: Schriften eingebettet, Farben definiert, keine Verschlüsselung.
- Das XML ist als zugeordnete Datei eingebettet, mit der Beziehung Alternative.
- Die PDF-Metadaten nennen das Profil, damit ein Programm weiß, was es erwartet.
- Die Seite rendert Chromium, Ihr HTML und CSS sehen also so aus, wie Sie sie gestaltet haben.
Das ZUGFeRD-XML: was drinsteht
Das eingebettete XML ist der rechtlich führende Teil der Rechnung. Es enthält Rechnungsnummer und Datum, Verkäufer und Käufer mit Anschrift und USt-IdNr., jede Position mit Menge, Einheit und Nettopreis, die Steuer je Steuersatz, die Summen und die Zahlungsdaten.
Jeder PDF-Viewer zeigt die Seite. Programme, die Anhänge auflisten, zeigen auch factur-x.xml. Diese Datei liest die Buchhaltung Ihres Kunden ein, ohne dass jemand Beträge abtippt. Stimmen Seite und XML nicht überein, gilt das XML. Deshalb erzeugt CastPDF beide aus einer Berechnung.
Wie viel das XML enthält, legt das Profil fest. Nehmen Sie EN 16931, wenn Ihr Kunde nichts anderes verlangt. Die Profile MINIMUM und BASIC WL enthalten keine Positionen und gelten in Deutschland nicht als Rechnung.
ZUGFeRD 2.4 und die Versionen
Die erste Version von ZUGFeRD erschien 2014. Für die E-Rechnungspflicht zählt ZUGFeRD ab Version 2.0.1, so steht es in den Schreiben des Bundesfinanzministeriums. Aktuell ist ZUGFeRD 2.4, das das FeRD Anfang 2026 in Kraft gesetzt hat.
Der Aufbau ist seit Version 2.1 gleich geblieben: ein PDF/A-3 mit factur-x.xml in CII-Syntax und dieselben Profile. Neue Versionen pflegen vor allem Regeln und Codelisten. CastPDF schreibt ZUGFeRD 2.x im Aufbau von Factur-X. Unsere Testsuite prüft jedes erzeugte XML mit den offiziellen Regeldateien von Factur-X 1.09 und der EN 16931.
ZUGFeRD 1.0 und 2.0 nutzten andere Dateinamen für das XML. CastPDF erzeugt nur den heutigen Aufbau mit factur-x.xml, den Empfänger seit Version 2.1 erwarten.
ZUGFeRD oder XRechnung?
Beide Formate sind E-Rechnungen im Sinne der deutschen Regeln. Sie tragen dieselben Daten nach EN 16931. Der Unterschied liegt darin, wie die Datei aussieht und wer sie erwartet.
| ZUGFeRD | XRechnung | |
|---|---|---|
| Die Datei | Ein PDF mit dem XML darin | Nur das XML |
| Wer sie meist verlangt | Unternehmen | Öffentliche Auftraggeber und ihre Portale |
| Ohne Software lesbar | Ja | Nein |
| Zusätzliche Pflichtfelder | Keine über EN 16931 hinaus | Leitweg-ID, Kontakt des Verkäufers, elektronische Adressen |
| In CastPDF | "standard": "zugferd" | "standard": "xrechnung-cii" oder "xrechnung-ubl" |
Es gibt auch einen Mittelweg. Das ZUGFeRD-Profil XRECHNUNG bettet ein XRechnung-XML in ein lesbares PDF ein. Behördenportale wollen trotzdem meist das reine XML. Mehr dazu auf unserer Seite zur XRechnung.
ZUGFeRD-Rechnung erstellen: kostenlos oder per API
Für einzelne Rechnungen reicht der kostenlose E-Rechnungs-Generator. Sie füllen ein Formular aus und laden die ZUGFeRD-Datei herunter, ohne Konto. Entstehen Ihre Rechnungen in einem eigenen System, sendet es die Rechnung als JSON an die API. Eine Vorlage brauchen Sie nicht, die eingebaute Rechnungsvorlage erzeugt die Seite.
{
"e_invoice": {
"standard": "zugferd",
"profile": "en16931",
"invoice": {
"number": "RE-2026-0816",
"issue_date": "2026-10-11",
"currency": "EUR",
"seller": {
"name": "Lindqvist Software GmbH",
"vat_id": "DE123456789",
"tax_number": "37/123/45678",
"address": { "line1": "Kastanienallee 12", "city": "Berlin", "postal_code": "10435", "country_code": "DE" },
"contact": { "name": "Buchhaltung", "email": "[email protected]" }
},
"buyer": {
"name": "Brightwater Kaffee GmbH",
"vat_id": "DE987654321",
"address": { "line1": "Speicherstadt 4", "city": "Hamburg", "postal_code": "20457", "country_code": "DE" }
},
"payment": { "iban": "DE89370400440532013000", "due_date": "2026-11-10", "terms": "Zahlbar innerhalb von 30 Tagen ohne Abzug." },
"lines": [
{ "name": "Supportvertrag, Oktober", "quantity": 1, "unit_code": "MON", "unit_price": "650.00", "vat": { "category": "S", "rate": 19 } },
{ "name": "Schulung vor Ort", "quantity": 6, "unit_code": "HUR", "unit_price": "95.00", "vat": { "category": "S", "rate": 19 } }
]
}
},
"filename": "RE-2026-0816"
}curl https://api.castpdf.com/v1/pdf \
-H "Authorization: Bearer $CASTPDF_API_KEY" \
-H "Content-Type: application/json" \
-d @RE-2026-0816.json \
-o RE-2026-0816.pdfDie Antwort ist das PDF mit dem Header x-e-invoice: zugferd/en16931. Mit "response": "url" erhalten Sie stattdessen einen signierten Download-Link und e_invoice.xml_filename im JSON. Beträge dürfen Zahlen oder Dezimal-Strings sein. Strings schließen jeden Zweifel an Nachkommastellen aus.
ZUGFeRD validieren
Bevor Sie eine Rechnung verschicken, lohnt sich ein Blick auf das XML. Unser kostenloser Validator liest das XML aus dem ZUGFeRD-PDF. Er prüft Pflichtfelder, Codelisten, Steuerregeln und die Summen nach EN 16931 und zeigt, was das PDF über sich selbst angibt.
Das ist eine schnelle Prüfung, nicht die offizielle Validierung mit XSD und Schematron. Für die XRechnung und EN-16931-Dateien ist der KoSIT-Validator das Referenzwerkzeug. Der beste Test bleibt eine Probe-Rechnung an Ihren Kunden.
ZUGFeRD in PHP, Java oder Python
Wer ZUGFeRD selbst erzeugen will, findet freie Bibliotheken: das Mustang-Projekt für Java, horstoeko/zugferd für PHP und factur-x für Python. Damit bauen Sie das XML selbst, rechnen die Summen selbst und betten das XML in ein PDF/A-3 ein, das Sie ebenfalls selbst erzeugen.
Mit der API entfällt dieser Teil. Jede Sprache, die eine HTTPS-Anfrage senden kann, sendet die Rechnung als JSON und erhält die fertige Datei. Beispiele für Ihre Sprache finden Sie auf den Entwicklerseiten zu PHP, Java und Python.
Woran ZUGFeRD-Dateien oft scheitern
- Ein Cent Unterschied. Rundet Ihr System die Steuer pro Position, weicht die Summe von der EN 16931 ab. CastPDF rechnet die Steuer einmal je Steuersatz.
- Gemischte Steuersätze. Eine Leistung zu 19 % und ein Buch zu 7 % ergeben je Steuersatz eine eigene Zeile, im XML und auf der Seite.
- Gutschriften. Senden Sie
type_code381 und die ursprüngliche Rechnungsnummer inpreceding_invoice. - Reverse Charge. Nutzen Sie die Steuerkategorie
AEmit der USt-IdNr. des Käufers. Den passenden Befreiungstext ergänzt die API. - Lange Rechnungen. Die Rechnungsvorlage wiederholt den Tabellenkopf auf jeder Seite, und das XML enthält jede Position.
Fehlen Angaben oder passen sie nicht zusammen, antwortet die API mit invalid_e_invoice und nennt jedes Problem mit seinem Feld. Erst wenn die Rechnung stimmt, wird etwas erzeugt und gezählt.