Elektronische Rechnungen auf der Basis von XRechnung und ZUGFeRD zu erstellen, ist ein kleiner Klimmzug. Die Mühe lohnt sich jedoch.
Im ersten Teil dieser Serie [1] führten wir Sie in die beiden Formate XRechnung und ZUGFeRD ein, die seit Anfang 2025 die Basis für den Austausch von elektronischen Rechnungen bilden. Wir haben gezeigt, wie Sie eine XRechnung aus einem ZUGFeRD-PDF auspacken und danach auf Plausibilität überprüfen. Nun sehen wir uns an, wie Sie solche Dokumente aufsetzen. Sie erfahren, welche Daten eine elektronische Rechnung enthalten muss, womit Sie die XML-Daten für eine XRechnung erzeugen und wie Sie ein ZUGFeRD-konformes PDF-Dokument mit dem XML erstellen.
Außerdem stellen wir soweit möglich passende Open-Source-Werkzeuge dazu vor. Im Folgenden konzentrieren wir uns auf das Vorgehen anhand von LaTeX/TeXLive [2]. Das hat den Vorteil, dass Sie einen direkten Einblick in die einzelnen Felder und Daten erhalten, die dabei verarbeitet werden. Obendrein nutzen etliche freie und kommerzielle ERP-Systeme wie Lx-Office [3] und dessen Nachfolger Kivitendo [4] im Hintergrund auf LaTeX basierende Vorlagen [5]. Somit betreffen die nachfolgenden Anmerkungen auch diese Systeme beziehungsweise deren Funktionen.
Wichtige Daten
Die Tabelle “XRechnung: Inhalte (Auszug)” listet in vereinfachter Form auf, welche Inhalte die elektronische Rechnung enthalten muss. Der Abschnitt Leistungen kann wiederholt vorkommen, je nachdem, wie viele einzelne Posten die Rechnung tatsächlich umfasst. Die Bezeichnungen der Felder stammen aus unterschiedlichen Quellen und haben daher eine voneinander abweichende Schreibweise.
|
Bereich/Feld |
Bedeutung |
|---|---|
|
Allgemein |
|
|
|
Dokumententyp |
|
|
Rechnungsnummer |
|
|
Rechnungsdatum |
|
|
Lieferdatum |
|
|
Steuergruppe |
|
|
Steuersatz (Prozent) |
|
|
Währung |
|
|
Zahlungsbedingungen |
|
|
Fälligkeitsdatum |
|
Zahlung ( |
|
|
|
Transaktionstyp |
|
|
IBAN |
|
|
Kontoinhaber |
|
|
BIC oder Bankleitzahl |
|
Verkäufer ( |
|
|
|
Rechnungsaussteller |
|
|
Postleitzahl |
|
|
Ort |
|
|
Land |
|
|
Straße |
|
|
Umsatzsteuernummer |
|
|
Kontaktdaten |
|
|
|
|
Käufer ( |
|
|
|
Käuferreferenz oder Leitweg-ID |
|
|
Rechnungsempfänger |
|
|
Postleitzahl |
|
|
Ort |
|
|
Land |
|
|
Straße |
|
|
Umsatzsteuernummer |
|
|
|
|
Leistungen |
|
|
|
Position |
|
|
Beschreibung |
|
|
Nettopreis |
|
|
Anzahl |
|
|
Steueranteil |
|
|
Zwischensumme |
|
Gesamtbetrag |
|
|
|
Gesamtsumme |
|
|
Summe der Einzelbeträge |
|
|
zu versteuernder Betrag |
|
|
Gesamtbetrag an Steuern |
|
|
Bruttobetrag |
XML-Daten erstellen
Es gibt mehrere Möglichkeiten, um die XML-Daten zu erzeugen. Im Idealfall hat Ihr (kommerzielles) Buchhaltungsprogramm ein Modul, das eine XRechnung aus Ihren Rechnungsdaten baut. Ansonsten erstellen Sie mit einem Texteditor zunächst eine Vorlage entsprechend der Spezifikation zur XRechnung in Form einer XML-Datei und passen sie dann für jede Rechnung (per Hand) an. Alternativ nutzen Sie ein Modul oder Makro für eine Textverarbeitung, das die XRechnung als separate Datei erzeugt. Prüfen Sie die bislang genutzten Werkzeuge auf eine zukünftige Einsatzfähigkeit. Klären Sie, ob Sie damit eine XRechnung generieren können, die den rechtlichen Rahmenbedingungen entspricht.
Für LaTeX/TeXLive entstand unter der Federführung von Marei Peischl [6] seit 2019 ein passendes Makropaket namens Zugferd [7]. Seit dem Sommer 2024 beziehen Sie dieses Paket direkt vom Comprehensive TeX Archive Network (CTAN [8]). Stand Mai 2025 ist es noch nicht in der aktuellen Veröffentlichung von TeXLive integriert. Sie müssen es daher anhand der beigefügten Dokumentation manuell einrichten, was jedoch mit wenigen Schritten gelingt.
Voraussetzung für den Einsatz der Vorlage ist TeXLive ab Version 2023-11-01. Die aktuelle, stabile Veröffentlichung von Debian 12 “Bookworm” enthält noch die dafür ungeeignete Version 2022.20230122-3. Die Recherche nach Backports war negativ. Daher blieb im Test nur die Integration mit dem Nachfolger Debian 13 “Trixie”, der TeXLive 2024.20241115-1 mitbringt. Das funktionierte anstandslos.
Um das Makropaket Zugferd zu benutzen, müssen Sie zunächst die im Makropaket mitgelieferte ZUGFeRD-Vorlage an Ihre Bedürfnisse anpassen. Die Vorlage steuert dann das eigentliche Makropaket an und sorgt für das Erzeugen des XML-Anteils, also der XRechnung. Gleichzeitig erstellt das Makro anhand der Vorlage die Tabelle mit den einzelnen Rechnungsposten samt Kalkulation für Steuern und Gesamtbeträge. Falls Ihnen das Aussehen der Tabelle nicht gefällt, dürfen Sie hier nach Belieben herumfeilen.
Danach stehen noch einige weitere Arbeiten an. Dazu gehören das Ergänzung des LaTeX-Dokuments um die Metadaten für PDF/A-3, das Einbinden der ZUGFeRD-Vorlage, das Erfassen der Metadaten zur Rechnung für Verkäufer und Käufer sowie das Eintragen der einzelnen Rechnungsposten mit deren Einzelsummen und Steueranteil.
Listing 1 beinhaltet die Abschnitte A (Zeile 2 bis 5) und B (Zeile 7) sowie den Rumpf für Abschnitt C (Zeilen 9 bis 11). Darin tragen Sie die Daten in eine Reihe von Feldern analog zu Tabelle “XRechnung: Inhalte (Auszug)” ein, die dann als XML-Anhang im erzeugten PDF auftauchen – sprich: der XRechnung-Anteil. Ihn besprechen wir weiter unten gesondert. In den Zeilen 14 und 15 sehen Sie zwei Rechnungsposten (\AddInvoiceItem): sechs Schaltkreise zu je 5 Euro sowie einmalige Versandkosten von 5 Euro. Mit \PrintInvoiceTabular (Zeile 16) geben Sie die Tabelle aus. Beide Kommandos sind bereits in der ZUGFeRD-Vorlage definiert (Zeile 9ff).
Listing 1
PDF-Metadaten und XML-Format
% Abschnitt A: Metadaten
\DocumentMetadata{
pdfstandard=a-3b, % PDF-Version A-3b
lang=de % Sprache: Deutsch
}
% Abschnitt B: ZUGFeRD-Vorlage
\usepackage[format=xrechnung3.0]{zugferd-invoice}
% Abschnitt C: XRechnung
\SetZUGFeRDData{ % Metadaten Abschnitt C
... % Inhalt siehe Listing 2
}
% Rechnungsposten
\begin{document} % Beginn des LaTeX-Dokuments
\AddInvoiceItem{6}{Schaltkreise FFX-43, unkonfektioniert}{5.00}
\AddInvoiceItem{1}{Versand}{5.00}
\PrintInvoiceTabular
\end{document} % Ende des LaTeX-Dokuments
Die einzelnen Felder für die XRechnung füllen wir anhand eines Beispiels aus: einer Bestellung, deren Inhalte von Marc-Uwe Klings satirischer Buchreihe Qualityland [9] inspiriert wurden. Hierbei fungiert als Rechnungsaussteller der in Qualityland beheimatete The Shop, den man unter der fiktiven E-Mail-Adresse mailto:info@theshop.ql erreicht.
Rechnungsempfänger ist Peter Arbeitsloser, die liebenswerte Hauptfigur aus der Buchreihe. Er hat einen Posten Schaltkreise zur Reparatur des Roboters Kalliope bestellt, zu 10 Euro netto plus 19 Prozent Umsatzsteuer, also insgesamt 35,70 Euro. Als weitere Daten sind die Bankverbindung, das Zahlungsziel sowie die Art des Transfers (Überweisung bis zum 1. Februar 2025) erfasst. Listing 2 zeigt die Daten zur Bestellung.
Listing 2
Digitale Rechnungsdaten
\SetZUGFeRDData{
document-type = commercial-invoice, % Dokumententyp
id = 20250001, % Rechnungsnummer
date = auto, % Rechnungsdatum
delivery-date = auto, % Lieferdatum
tax/category = S, % Steuergruppe
tax/rate = 19, % 19 Prozent
seller/name = {The Shop}, % Rechnungsaussteller
seller/postcode = {12345}, % - Postleitzahl
seller/city = {Qualityland}, % - Ort
seller/country = QL, % - Land
seller/address = {Im Untergrund 1}, % - Straße
seller/vatid = {QL123456789}, % - Umsatzsteuernummer
seller/contact = { % - Kontakt
TheSeller\\+4900000000\\info@theshop.ql
},
seller/email = {info@theshop.ql}, % - E-Mail
buyer/reference = {12345}, % Käufer-/Leitweg-ID
buyer/name = {Peter Arbeitsloser}, % Rechnungsempfänger
buyer/postcode = {67890}, % - Postleitzahl
buyer/city = {Qualityland}, % - Ort
buyer/country
= QL, % - Land
buyer/address = {Im Hinterhof\\Nebengebäude}, % - Straße
buyer/vatid = {QL123456790}, % - Umsatzsteuernummer
buyer/email = {rn@peters-werkstatt.ql}, % - E-Mail
currency = EUR, % Währung
payment-terms = {Zahlbar sofort}, % Zahlungsziel als Text
due-date = {20250201}, % ... oder Datumsangabe
payment-means/type = 58, % Transaktionstyp
payment-means/iban = QL12875500001234567890, % - IBAN
payment-means/account-holder = {The Shop}, % - Kontoinhaber
payment-means/bic = GENODEM1GLS % - BIC
}
Das daraus entstehende Rechnungsdokument enthält alle Angaben. Wie bereits erwähnt, werden alle Zahlenwerte für Summen und Steuern mitberechnet. Dazu kommt intern das Makropaket Fp [10] zum Einsatz. Das fertige LaTeX-Dokument übersetzen Sie einfach in gewohnter Weise in ein PDF, beispielsweise mittels Pdflatex. Als Ergebnis fallen zwei Dokumente heraus: ein PDF-Dokument nach dem ZUGFeRD-Format und ein XML-Dokument im Format XRechnung. Abbildung 1 zeigt einen Ausschnitt aus der mit LaTeX erzeugten Rechnung.
Alternativen
An dieser Stelle sei erwähnt, dass es auch Implementierungen zur elektronischen Rechnung für Open/LibreOffice gibt. Neben Makros [11] unterschiedlichster Qualität [12] liefern auch Fakturama [13] und Gnuaccounting [14] die XML-Daten als XRechnung beziehungsweise können eine solche verarbeiten. Über die Qualität der beiden Programme und deren Handhabung können wir keine Aussage treffen, freuen uns aber über Ihr Feedback dazu.
Das freie Buchhaltungsprogramm GnuCash [15] kann nach unserem Wissensstand derzeit weder XRechnung noch ZUGFeRD verarbeiten. Dagegen kommen sowohl Lin-HaBu [16] als auch Hibiscus [17] mit dem Format XRechnung zurecht. Bevorzugen Sie hingegen eine webbasierte Erstellung von XRechnung und ZUGFeRD ohne vorherige Installation, wartet die Plattform PDF24 [18] mit einem passenden und bislang kostenfreien Service auf (Abbildung 2).
ZUGFeRD-konformes PDF
Zum Erzeugen eines ZUGFeRD-konformen PDF-Dokuments gibt es zwei Möglichkeiten. Im besten Fall verfügt Ihr (kommerzielles) Buchhaltungsprogramm (beispielsweise Lexware [19]) über ein Modul, das PDFs im ZUGFeRD-Format erzeugt. Anderenfalls ergänzen Sie Ihr PDF mit der Rechnung um die XRechnung als PDF-Anhang. Das bügelt den Fall aus, dass der Rechnungsempfänger in seinem Ablauf ZUGFeRD statt XRechnung einsetzt.
Das Anhängen der XML-Daten an das PDF gelingt über die Werkzeuge aus dem Mustang Project [20], mittels Facturx-pdfgen aus dem Projekt Factur-X [21] oder durch einen Aufruf des für Sie vielleicht geläufigeren Werkzeugs Pdftk aus dem PDF Toolkit [22]. Pdftk kennt die recht praktische Option attach_files. Mit dem Aufruf aus Listing 3 fügt Pdftk die XRechnung rechnung.xml der Originalrechnung rechnung.pdf hinzu, das Endergebnis landet in der Datei rechnung-komplett.pdf.
Listing 3
XRechnung mit PDF-Datei
$ pdftk rechnung.pdf attach_files rechnung.xml output rechnung-komplett.pdf
Wichtig ist hier, dass sich im Vergleich zum bisher gewohnten Vorgehen das Aussehen eines PDF-Dokuments nicht ändert und auch keine weiteren Elemente hinzukommen, wie ein QR-Code. Ungeachtet dessen müssen Sie gewährleisten, dass das erzeugte Dokument dem Format PDF/A-3 entspricht, um die rechtlichen Vorgaben zu erfüllen. Es gilt also, bislang genutzte Werkzeuge daraufhin zu prüfen, ob Sie damit PDF/A-3-Dokumente generieren können.
Fazit
Das LaTeX-Makropaket Zugferd erleichtert das Erstellen von Rechnungen, die dem Standard entsprechen, ungemein. Der LaTeX-Quellcode für die jeweiligen Rechnungen fällt damit kleiner aus als vorher. Das Anpassen der Vorlage, die das Makropaket ansteuert, macht allerdings eine Menge Arbeit – unterschätzen Sie das nicht.
Da die Standards XRechnung und ZUGFeRD offenliegen, steht der Entwicklung eigener Programme nichts im Weg. Als Basis dazu stehen neben Implementierungen für PHP (mittels Zugferd [23]) und Python (mittels Python-drafthorse [24]) Bibliotheken für Go, Java und .NET bereit, wie beispielsweise Konik [25]. Bei Interesse finden Sie Zusammenstellungen weiterer Werkzeuge auf den Webseiten Zugferd.org [26] und Ferd-net.de [27]. (jlu)
Danksagung
Der Autor bedankt sich bei Werner Heuser, Karina Hiedler, Thomas Osterried, Thomas Winde, Wolfram Eifler, Werner Staub, Veit Schiele und Gerold Rupprecht für ihre kritischen Anmerkungen und Ergänzungen zum Artikel.
Der Autor
Frank Hofmann arbeitet zumeist von unterwegs aus als Entwickler, Trainer und Autor. Bevorzugte Arbeitsorte sind Berlin, Genf und Kapstadt. Er gehört zu den Verfassern des Debian-Paketmanagement-Buchs [28].
Infos
-
ZUGFeRD/XRechnung (Teil 1): Frank Hofmann, “Holpriger Galopp”, LU 06/2025, S. 16, https://www.linux-community.de/51811
-
TeXLive: https://www.tug.org/texlive/
-
Lx-Office: https://de.wikipedia.org/wiki/Lx-Office
-
Kivitendo: https://www.kivitendo.de
-
ZUGFeRD-Rechnungen (Kivitendo): https://www.kivitendo.de/kivi/doc/html/ch03s10.html
-
PeiTEX TEXnical Solutions: https://www.peitex.de
-
Zugferd-Paket: https://ctan.org/pkg/zugferd
-
CTAN: https://ctan.org
-
Qualityland: https://qualityland.de
-
Makropaket Fc: https://ctan.org/pkg/fc
-
“Mit LibreOffice XRechnungen auslesen und erstellen”: https://de.blog.documentfoundation.org/2024/02/22/mit-libreoffice-xrechnungen-auslesen-und-erstellen/
-
LibreOffice Factur-X Extension: https://github.com/akretion/factur-x-libreoffice-extension
-
Fakturama: https://www.fakturama.info/
-
Gnuaccounting: https://www.gnuaccounting.org
-
GnuCash: Daniel Tibi, “Eingebucht”, LU 06/2017, S. 56, https://www.linux-community.de/39081
-
Lin-HaBu 20.2: Erik Bärwaldt, “Finanzjongleur”, LU 10/2020, S. 32, https://www.linux-community.de/45266
-
OpenSuse-Tipps: Online-Banking: Peter Kreußel, “Bank im Homeoffice”, LU 11/2021, S. 62, https://www.linux-community.de/46700
-
PDF24: https://tools.pdf24.org
-
Lexware: https://www.lexware.de
-
The Mustang Project: https://github.com/ZUGFeRD/mustangproject
-
Zugferd für PHP: https://github.com/horstoeko/zugferd
-
Python-drafthorse: https://github.com/pretix/python-drafthorse
-
Konik: https://konik.io
-
“ZUGFeRD Open-Source Libraries and Tools”: https://zugferd.org/e-invoicing/1.0.0/index.en.html
-
Ferd.net: https://www.ferd-net.de
-
Debian-Paketmanagement-Buch: https://dpmb.org







