HCL Domino · ZUGFeRD · XRechnung · API-Engine

ZUGFeRD und XRechnung direkt in HCL Domino verarbeiten

Elektronische Rechnungen enthalten strukturierte Daten, die sich automatisiert auslesen und weiterverarbeiten lassen. Mit der SL Net-Solutions Domino API-Engine können Rechnungsinformationen aus ZUGFeRD-Dokumenten und XML-Rechnungen in bestehende Domino-Prozesse übernommen werden.

Ein neues Beispiel im API-Engine V12.12 Evaluation Package zeigt den technischen Weg anhand einer ZUGFeRD-Rechnung: Das PDF wird als BINBUFFER gelesen, das eingebettete Rechnungs-XML wird direkt im Speicher extrahiert und anschließend mit XML- und XPath-Funktionen ausgewertet. Ausgewählte Informationen werden im Domino-Dokument gespeichert.

PDF → XML → XPath → Domino. Für diesen Ablauf muss das eingebettete XML nicht erst über eine temporäre Datei oder einen externen Konvertierungsdienst bereitgestellt werden. Eine bereits als XML vorliegende XRechnung kann direkt beim XML-Schritt beginnen.

Grundlagen

Unterschiedliche Verpackung, strukturierte Rechnungsdaten

ZUGFeRD und XRechnung werden häufig gemeinsam genannt. Für die technische Verarbeitung ist jedoch wichtig, zwischen dem Dokumentcontainer, der XML-Syntax und den fachlichen Vorgaben zu unterscheiden.

ZUGFeRD / Factur-X

PDF mit eingebettetem XML

Das hybride Format kombiniert eine visuell lesbare PDF/A-3-Rechnung mit strukturierten XML-Daten. Die Rechnungsdaten verwenden UN/CEFACT Cross Industry Invoice (CII).

XRechnung

XML als Rechnungsdokument

XRechnung konkretisiert die EN 16931 für den deutschen Einsatz. Die XML-Daten können in UBL oder CII vorliegen und benötigen grundsätzlich keinen PDF-Container.

EN 16931

Gemeinsames Datenmodell

Die europäische Norm beschreibt die fachlichen Rechnungsinformationen. Das konkrete XML-Layout und die zulässigen Regeln hängen von Syntax und verwendetem Profil ab.

Wichtig für das Beispiel: Die folgende Demo verarbeitet CII-XML, wie es in einer ZUGFeRD-Rechnung enthalten ist. Eine XRechnung in CII-Syntax lässt sich nach demselben XML-Prinzip auswerten; bei UBL sind andere Elementnamen, Namespaces und XPath-Ausdrücke erforderlich.

Verarbeitungsweg

Von der PDF-Rechnung zu Domino-Items

Der gesamte Beispielablauf kann innerhalb eines serverseitigen API-Engine-Prozesses ausgeführt werden. Die Quelle des PDF-BINBUFFERs ist dabei nicht auf Notes-Anhänge beschränkt.

Rechnungs-PDF Domino-Anhang · Datei · REST
PDF als BINBUFFER
@PDFExtractInvoiceXML Eingebettetes CII-XML
als BINBUFFER
API-Engine XML XMLParse · XPath
Namespaces · Feldwerte
Domino-Dokument Rechnungsnummer · Parteien
Währung · Beträge

Bei einer reinen XML-Rechnung entfällt der PDF-Extraktionsschritt. Ab dem XML-Parser ist der weitere Ablauf prinzipiell derselbe.

Praktisches Beispiel

Wenige Felder, nachvollziehbarer Ablauf

Das Evaluation-Beispiel arbeitet bewusst mit einer kleinen Zahl von Rechnungsdokumenten. Es geht nicht darum, eine komplette Buchhaltungs- oder E-Rechnungsplattform nachzubilden, sondern die Schnittstelle zwischen einem Rechnungsdokument und einer Domino-Datenbank zu demonstrieren.

Das Beispiel beschränkt sich bewusst auf ausgewählte Rechnungs-Kopfdaten. Grundsätzlich können jedoch sämtliche im Rechnungs-XML enthaltenen Informationen ausgelesen und weiterverarbeitet werden. Dazu gehören beispielsweise einzelne Rechnungspositionen, Artikelnummern, Mengen, Einzelpreise, Steuerinformationen, Zahlungsbedingungen, Bankverbindungen und Referenzen auf Bestellungen oder Lieferscheine.

Auch komplexere und wiederkehrende XML-Strukturen lassen sich mithilfe der XML-Funktionen und XPath gezielt auswerten. Welche Daten übernommen werden, hängt somit von den Anforderungen der jeweiligen Domino-Anwendung ab.

RechnungsnummerInvoiceNumber

Die eindeutige Rechnungskennung aus dem CII-Dokument.

RechnungsdatumInvoiceDateRaw

Das ursprüngliche Rechnungsdatum aus dem XML, vor einer möglichen Formatumwandlung.

RechnungsstellerSeller

Der Name des liefernden oder leistenden Unternehmens.

RechnungsempfängerBuyer

Der im Rechnungsdokument angegebene Käufer.

WährungCurrency

Der ISO-Währungscode der Rechnung, beispielsweise EUR.

RechnungsbetragGrandTotal

Der Gesamtrechnungsbetrag aus der monetären Summierung.

Offener BetragDueAmount

Der laut Rechnungsdaten noch zu zahlende Betrag.

XML-Beispiel

So sehen die Rechnungsdaten im CII-XML aus

Die eigentlichen Informationen werden nicht aus dem sichtbaren PDF-Text erkannt, sondern aus den strukturierten XML-Elementen gelesen. Nachfolgend ein verkürzter Ausschnitt mit den für das Beispiel relevanten Elementen:

<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:ExchangedDocument>
    <ram:ID>471102</ram:ID>
    <ram:IssueDateTime>
      <udt:DateTimeString format="102">20241115</udt:DateTimeString>
    </ram:IssueDateTime>
  </rsm:ExchangedDocument>

  <rsm:SupplyChainTradeTransaction>
    <ram:ApplicableHeaderTradeAgreement>
      <ram:SellerTradeParty>
        <ram:Name>Beispiel GmbH</ram:Name>
      </ram:SellerTradeParty>
      <ram:BuyerTradeParty>
        <ram:Name>Musterkunde AG</ram:Name>
      </ram:BuyerTradeParty>
    </ram:ApplicableHeaderTradeAgreement>

    <ram:ApplicableHeaderTradeSettlement>
      <ram:InvoiceCurrencyCode>EUR</ram:InvoiceCurrencyCode>
      <ram:SpecifiedTradeSettlementHeaderMonetarySummation>
        <ram:GrandTotalAmount>529.87</ram:GrandTotalAmount>
        <ram:DuePayableAmount>529.87</ram:DuePayableAmount>
      </ram:SpecifiedTradeSettlementHeaderMonetarySummation>
    </ram:ApplicableHeaderTradeSettlement>
  </rsm:SupplyChainTradeTransaction>
</rsm:CrossIndustryInvoice>

Stark verkürzter, illustrativer CII-XML-Ausschnitt mit Beispieldaten. Er ist kein vollständiges, validierbares ZUGFeRD- oder XRechnung-Dokument.

Namespaces beachten: Bei CII gehören Elemente wie ram:ID oder ram:GrandTotalAmount zu definierten XML-Namensräumen. XPath-Ausdrücke müssen diese korrekt zuordnen; ein bloßer Vergleich mit unqualifizierten Elementnamen reicht nicht zuverlässig aus.

Technischer Ablauf

Was das Demo-Skript Schritt für Schritt macht

1
Rechnungsdokument auswählen

Eine kleine Anzahl von Domino-Testdokumenten wird für die Verarbeitung herangezogen.

2
PDF als BINBUFFER einlesen

Im Beispiel stammt das PDF aus einem Domino-Anhang. Ebenso denkbar sind Datei- oder REST-basierte Quellen.

3
Rechnungs-XML extrahieren

@PDFExtractInvoiceXML liest das eingebettete Rechnungs-XML aus dem PDF-BINBUFFER und liefert einen XML-BINBUFFER zurück.

4
XML-Dokument parsen

@XMLParse erstellt ein XML-Dokument-Handle. Die weitere Navigation erfolgt über dessen Root-Node.

5
Felder mit XPath lesen

@XMLSelectSingleNode sucht die relevanten Elemente unter Berücksichtigung der Namespaces; @XMLGetContent liefert die Inhalte.

6
Ergebnisse schreiben und Ressourcen freigeben

Die extrahierten Werte werden in Domino-Items übernommen. XML-Handles und temporäre Buffer werden anschließend freigegeben.

API-Engine XML-Funktionen

Vom XML-Handle zum Rechnungsfeld

Nach der PDF-Extraktion behandelt die API-Engine die Rechnung als reguläres XML-Dokument. Für das Lesen einer Rechnungsnummer sind beispielsweise die folgenden Funktionen relevant:

PDF-BINBUFFER
  |
  +-- @PDFExtractInvoiceXML(PDFBuffer)
          |
          v
      Rechnungs-XML (BINBUFFER)
          |
          +-- @XMLParse(InvoiceXML; 1)
                  |
                  +-- @XMLGetRoot(Doc)
                  |
                  +-- @XMLSelectSingleNode(
                        Root; XPath; Prefixes; Namespaces)
                  |
                  +-- @XMLGetContent(Node)
                  |
                  +-- Domino-Item schreiben

Aufraeumen: @XMLRelease(Doc), @DestroyBuffer(...)

Schematische Funktionsfolge, kein unmittelbar ausführbares Skript. Das vollständige Beispiel mit Datenbankzugriff, Parametern und Fehlerbehandlung befindet sich im Evaluation Package.

Für die Rechnungsnummer verwendet die CII-Struktur beispielsweise diesen XPath:

/rsm:CrossIndustryInvoice
 /rsm:ExchangedDocument
 /ram:ID

Zur besseren Lesbarkeit umgebrochen; im Skript steht der XPath in einer Zeile.

Die Beträge stehen an anderer Stelle im Dokument, unterhalb von ram:ApplicableHeaderTradeSettlement und ram:SpecifiedTradeSettlementHeaderMonetarySummation. Die Zuordnung der Präfixe rsm, ram und bei Datumsangaben udt ist Bestandteil der XML-Abfrage.

Das vollständige Beispielskript ansehen

Wie sieht die Verarbeitung in einem echten API-Engine-Skript aus? Das vollständige Beispiel zeigt die Extraktion der XML-Rechnungsdaten aus einem ZUGFeRD-PDF, die anschließende XML-Auswertung und die Übernahme ausgewählter Rechnungsfelder in HCL Domino.

Vollständiges API-Engine-Beispielskript ansehen →

Ergebnis

Strukturierte Daten direkt im Domino-Dokument

Aus dem gezeigten XML-Ausschnitt ergeben sich beispielsweise die folgenden Werte. Sie können als Notes-Items gespeichert und danach in Views, Workflows oder weiteren Integrationsschritten verwendet werden.

Domino-ItemBeispielwert
InvoiceNumber471102
InvoiceDateRaw20241115
SellerBeispiel GmbH
BuyerMusterkunde AG
CurrencyEUR
GrandTotal529.87
DueAmount529.87

Illustrative Ausgabewerte zum vorstehenden gekürzten XML-Ausschnitt.

Abgrenzung

XML auslesen ist nicht dasselbe wie eine Rechnung validieren

Das Beispiel zeigt die technische Extraktion und Auswertung von Rechnungsdaten. Ob eine Rechnung die Anforderungen ihres Profils, der EN 16931 und der einschlägigen Geschäftsregeln erfüllt, ist eine zusätzliche Fragestellung.

Das Demo-Skript ist kein vollständiger E-Rechnungsvalidator. Das erfolgreiche Auslesen einzelner XML-Felder bedeutet nicht, dass eine ZUGFeRD- oder XRechnung-Datei fachlich und formal gültig ist. Für entsprechende Prüfungen sind geeignete Schema- und Geschäftsregelvalidatoren erforderlich, beispielsweise mit den offiziellen XRechnung-Validierungsartefakten der KoSIT.

Für eine produktive Verarbeitung kommen je nach Einsatzfall weitere Aufgaben hinzu: Unterstützung unterschiedlicher Rechnungsprofile, UBL- und CII-Mapping, Fehlerbehandlung, Betrags- und Datumsprüfung, Dublettenerkennung, Protokollierung sowie die eigentliche Übergabe an Buchhaltung oder ERP-Systeme.

Integration

Warum dieser Ansatz für bestehende Domino-Anwendungen interessant ist

Rechnungsdaten müssen nicht zwingend in einer separaten Anwendung verarbeitet werden. Das Beispiel zeigt, wie sich die XML-Auswertung in einen bestehenden Domino-Prozess integrieren lässt.

BINBUFFER

Ohne temporäre XML-Dateien

Die eingebetteten Rechnungsdaten können direkt aus einem PDF-Buffer gewonnen und als XML-Buffer weiterverarbeitet werden.

XML / XPath

Gezielte Datenextraktion

XML-Handles und namespacefähige XPath-Abfragen ermöglichen den direkten Zugriff auf einzelne Rechnungsfelder.

Domino

Verarbeitung im selben Prozess

Die Ergebnisse können unmittelbar in NSF-Dokumente und darauf aufbauende Geschäftsprozesse übernommen werden.

Technische Einordnung

ZUGFeRD und XRechnung mit LotusScript, Java oder API-Engine?

Die Verarbeitung von XML-Rechnungsdaten ist in Domino keineswegs nur mit der API-Engine möglich. Sowohl LotusScript als auch Java bieten etablierte Möglichkeiten, XML-Dokumente zu lesen und Rechnungsinformationen in NSF-Dokumente zu übernehmen. Die Unterschiede liegen vor allem darin, wie PDF-Anhänge, XML-Auswertung und die weitere Verarbeitung miteinander verbunden werden.

LotusScript

XML mit Domino-Bordmitteln

Mit NotesDOMParser, NotesSAXParser und NotesStream lassen sich XML-Daten unmittelbar in LotusScript verarbeiten. Für reine XML-Rechnungen kann das bereits ausreichen. Die Extraktion eingebetteter Rechnungs-XML-Daten aus ZUGFeRD-PDFs erfordert hingegen eine zusätzliche geeignete Lösung.

Java

XML, XPath und PDF-Bibliotheken

Java stellt mit DOM, SAX und XPath leistungsfähige Werkzeuge zur XML-Verarbeitung bereit. Mit einer PDF-Bibliothek wie Apache PDFBox lassen sich auch eingebettete Dateien aus PDF-Dokumenten extrahieren. Dafür sind die entsprechenden Bibliotheken und ihre Einbindung in die jeweilige Domino-Laufzeitumgebung zu berücksichtigen.

API-Engine

Durchgängige Verarbeitung im Engine-Skript

Im gezeigten Beispiel übernimmt @PDFExtractInvoiceXML die Extraktion des eingebetteten XML aus einem PDF-BINBUFFER. Anschließend können die XML-Funktionen die Rechnungsdaten per XPath auswerten und die Ergebnisse innerhalb desselben Skripts direkt in Domino weiterverarbeiten.

Der Vorteil liegt nicht darin, dass LotusScript oder Java diese Aufgabe grundsätzlich nicht lösen könnten. Die API-Engine bündelt im gezeigten Szenario PDF-Extraktion, XML-Auswertung und Domino-Verarbeitung in einer einheitlichen Skriptumgebung. Liegt eine XRechnung bereits als reine XML-Datei vor, entfällt der Schritt der PDF-Extraktion unabhängig von der verwendeten Technologie.

Evaluation Package

Das ZUGFeRD-Beispiel selbst ausprobieren

Das aktuelle API-Engine V12.12 Evaluation Package enthält das Beispielskript und die zugehörigen Testdaten für die Verarbeitung elektronischer Rechnungsdaten in HCL Domino.

ZUGFeRD / XRechnung – Beispielskript

Das Beispiel demonstriert das Einlesen eines PDF-Anhangs, die Extraktion des eingebetteten CII-XML mit @PDFExtractInvoiceXML, die Auswertung per XML/XPath sowie das Schreiben ausgewählter Rechnungsinformationen in Domino-Items.

Die Beispiele sind für eine kontrollierte Test- oder Entwicklungsumgebung vorgesehen und stellen keine vollständige produktive Rechnungsverarbeitung dar.

Fazit

E-Rechnungen als Datenquelle für Domino-Prozesse

ZUGFeRD und XRechnung sind nicht nur Dokumentformate. Ihr strukturierter XML-Inhalt ermöglicht es, Rechnungsinformationen automatisiert für bestehende Anwendungen nutzbar zu machen.

Die API-Engine verbindet dabei den Zugriff auf das Eingangsdokument mit der XML-Auswertung und der Verarbeitung in Domino: vom BINBUFFER über namespacefähige XPath-Abfragen bis zum Speichern der Ergebnisse in einer NSF.

Das gezeigte Beispiel konzentriert sich bewusst auf wenige Rechnungsfelder. Der Ansatz lässt sich anschließend um weitere XML-Inhalte, Prüfungen, Datenbankabgleiche und Schnittstellen zu vorhandenen Systemen ergänzen.