Elektronische Abrechnungen mit XRechnung und ZUGFeRD automatisieren (Teil 2)

Aus LinuxUser 06/2025

Elektronische Abrechnungen mit XRechnung und ZUGFeRD automatisieren (Teil 2)

© Marya Sushchina / 123RF.com

Davongetrabt

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

document-type

Dokumententyp

id

Rechnungsnummer

date

Rechnungsdatum

delivery-date

Lieferdatum

tax/category

Steuergruppe

tax/rate

Steuersatz (Prozent)

currency

Währung

payment-terms

Zahlungsbedingungen

due-date

Fälligkeitsdatum

Zahlung (payment-means)

type

Transaktionstyp

iban

IBAN

account-holder

Kontoinhaber

bic

BIC oder Bankleitzahl

Verkäufer (seller)

name

Rechnungsaussteller

postcode

Postleitzahl

city 

Ort

country

Land

address

Straße

vatid 

Umsatzsteuernummer

contact

Kontaktdaten

email 

E-Mail

Käufer (buyer)

reference

Käuferreferenz oder Leitweg-ID

name 

Rechnungsempfänger

postcode

Postleitzahl

city 

Ort

country

Land

address

Straße

vatid 

Umsatzsteuernummer

email 

E-Mail

Leistungen

AssociatedDocumentLineDocument / LineID

Position

SpecifiedTradeProduct / Name

Beschreibung

SpecifiedLineTradeAgreement / NetPriceProductTradePrice

Nettopreis

SpecifiedLineTradeDelivery / BilledQuantity

Anzahl

SpecifiedLineTradeSettlement / ApplicableTradeTax

Steueranteil

SpecifiedTradeSettlementLineMonetarySummation / LineTotalAmount

Zwischensumme

Gesamtbetrag

SpecifiedTradeSettlementHeaderMonetarySummation

Gesamtsumme

LineTotalAmount

Summe der Einzelbeträge

TaxBasisTotalAmount

zu versteuernder Betrag

TaxTotalAmount

Gesamtbetrag an Steuern

GrandTotalAmount

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.

Abbildung 1: Ausschnitt aus der mit LaTeX erzeugten Rechnung.

Abbildung 1: 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).

Abbildung 2: Bei PDF24 können Sie elektronische Rechnungen online erstellen.

Abbildung 2: Bei PDF24 können Sie elektronische Rechnungen online erstellen.

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

  1. ZUGFeRD/XRechnung (Teil 1): Frank Hofmann, “Holpriger Galopp”, LU 06/2025, S. 16, https://www.linux-community.de/51811

  2. TeXLive: https://www.tug.org/texlive/

  3. Lx-Office: https://de.wikipedia.org/wiki/Lx-Office

  4. Kivitendo: https://www.kivitendo.de

  5. ZUGFeRD-Rechnungen (Kivitendo): https://www.kivitendo.de/kivi/doc/html/ch03s10.html

  6. PeiTEX TEXnical Solutions: https://www.peitex.de

  7. Zugferd-Paket: https://ctan.org/pkg/zugferd

  8. CTAN: https://ctan.org

  9. Qualityland: https://qualityland.de

  10. Makropaket Fc: https://ctan.org/pkg/fc

  11. “Mit LibreOffice XRechnungen auslesen und erstellen”: https://de.blog.documentfoundation.org/2024/02/22/mit-libreoffice-xrechnungen-auslesen-und-erstellen/

  12. LibreOffice Factur-X Extension: https://github.com/akretion/factur-x-libreoffice-extension

  13. Fakturama: https://www.fakturama.info/

  14. Gnuaccounting: https://www.gnuaccounting.org

  15. GnuCash: Daniel Tibi, “Eingebucht”, LU 06/2017, S. 56, https://www.linux-community.de/39081

  16. Lin-HaBu 20.2: Erik Bärwaldt, “Finanzjongleur”, LU 10/2020, S. 32, https://www.linux-community.de/45266

  17. OpenSuse-Tipps: Online-Banking: Peter Kreußel, “Bank im Homeoffice”, LU 11/2021, S. 62, https://www.linux-community.de/46700

  18. PDF24: https://tools.pdf24.org

  19. Lexware: https://www.lexware.de

  20. The Mustang Project: https://github.com/ZUGFeRD/mustangproject

  21. Factur-X: https://github.com/akretion/factur-x/tree/master

  22. Pdftk: https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/

  23. Zugferd für PHP: https://github.com/horstoeko/zugferd

  24. Python-drafthorse: https://github.com/pretix/python-drafthorse

  25. Konik: https://konik.io

  26. “ZUGFeRD Open-Source Libraries and Tools”: https://zugferd.org/e-invoicing/1.0.0/index.en.html

  27. Ferd.net: https://www.ferd-net.de

  28. Debian-Paketmanagement-Buch: https://dpmb.org

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDF
LinuxUser 06/2025 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Nach oben