Inhalt
Dieser Artikel zeigt verschiedene Möglichkeiten auf, wie aus bestehenden Word- oder ggf. Libre-Writer-Dateien gültige digitale Rechnungen erzeugt werden können.
Einführung
Zum Ausprobieren laden Sie am besten dieses Archiv herunter und entpacken es in ein Verzeichnis „C:\ZUGFeRDComposer“, so dass Verzeichnisse wie „C:\ZUGFeRDComposer\Bin“ entstehen.
Im Unterverzeichnis „Examples“ befinden sich die hier referenzierten Beispiele sowie diverse Hilfedateien.
Weitere Details zum Composer finden Sie hier:
Im Internet gibt es inzwischen eine Vielzahl von Angeboten zur Erstellung digitaler Rechnungen. Meistens sind dafür jedoch spezielle Dokumente erforderlich oder Sie müssen die Daten online eingeben und die Rechnung herunterladen. Dabei vertrauen Sie dem Anbieter Ihre Daten an. In diesem Artikel erfahren Sie, wie Sie mit dem ZUGFeRD-Composer und ggf. PrintMulti aus Ihren Lieblingsdokumenten rechtskonforme digitale Rechnungen erstellen. Was mit Word/Excel funktioniert, klappt vermutlich auch mit Libre-Office Anwendungen.
Dieser Artikel konzentriert sich auf die Microsoft Anwendungen. Es ist ein Libre-Writer Beispiel enthalten, das mit PrintMulti oder über die Zwischenablagemöglich verwendet werden kann.
Um die dauernde Wiederholung der Begriffe ZUGFeRD, XRechnung und Factur-X zu verhindern, verwendet dieser Artikel folgende Abkürzungen in der angezeigten Farbe.
- PDF : Allgemein das PDF Format
- _pdf_ : Das ist die Basis PDF/A3 Datei die zur Einbettung von digitalen Rechnungen verwendet wird.
- Sie können diese durch Speichern des Dokuments in Word oder Libre-Writer erzeugen
- Durch Drucken auf einen geeigneten PDF Drucker wie den im PrintMulti Beispiel verwendeten PDF-Architect (da genügt die freie Version)
- Oder ggf. aus Ihrer Anwendung durch eine der vielen Bibliotheken.
- _PDF_ : Das entspricht dem ZUGFeRD Format also ein PDF/A3 mit eingebetteter digitialer Rechnung
- XML : Allgemein das XML Format
- _XML_ : Digitale Rechnung im XML Format. Dafür gibt es verschiedene Normen und Formate wie z.B. CII und UBL. Der Composer kann über Kommandozeile oder eine Konfigurationsdatei alle möglichen Formate erzeugen sofern die zugrundeliegende Bibliothek ZUGFeRD-csharp sie unterstützt (Denken Sie ggf. auch daran, den Autor dieser Bibliothek zu unterstützen).
Die verschiedenen Möglichkeiten
Das braucht der Composers
- Eine „Textdatei“ mit dem Inhalt der Rechnung oder die entsprechenden Daten in der Zwischenablage.
- Eine „Konfigurationsdatei“, die festlegt, wie die Rechnungsdaten aus der Textdatei extrahiert werden. Diese Datei kann auch Konstanten wie z.B. wiederkehrende Daten enthalten. Falls alle notwendigen Rechungsdaten als Konstanten enthalten sind, wird die Textdatei nicht benötigt (z.B.: Serienbriefbeispiele)
- Falls eine _PDF_ erstellt werden soll (bei _XML_ nicht notwendig), wird die Originalrechnung in einer PDF/A-3-Datei (_pdf_) benötigt.
Diese Möglichkeiten gibt es
Die „Versteckte-Text Methode“
Mit Hilfe von Formatvorlagen werden Steueranweisungen in kleiner weißer Schrift vor und hinter die Rechnungsteile geschrieben. Durch Makros oder Modifikation der Formatvorlagen können diese für Testzwecke leicht sichtbar gemacht werden. Um den Text der so angepassten Rechnung dem Composer zur Verfügung zu stellen, gibt es mehrere Möglichkeiten:
-
- Über die Zwischenablage mittels Strg+A / Strg+C oder über ein Makro den Text markieren. Der Composer kann den Text aus der Zwischenablage mit der Option ‚/iC‘ übernehmen. Dies funktioniert bei allen Rechnungen, die versteckten Text enthalten und bei denen die Anwendung den Text korrekt formatiert in die Zwischenablage kopiert. Bei Verwendung eines Makros könnte das aktuelle Dokument als PDF gespeichert werden und somit _PDF_ erzeugt werden. Ein Beispiel für ein Kommandozeilen-Skript „RunFromClipboard.cmd“ ist enthalten. _XML_ können dann einfach durch Kopieren der Rechnung aus Word, Libre-Writer, Browser, … in die Zwischenablage und Aufruf des Skripts erstellt werden
Beispiel:Alle mit versteckten Texten z.B. invoice_two_novat_no_eu.docx, invoice_two_vat.docx, invoice_two_vat.odt
- Mittels IFilter Technik Diese Technik wird von Windows verwendet, um Text aus Dokumenten zu extrahieren und für die Volltextsuche zu verwenden. Für die Verwendung im Composer muss der Text, den der entsprechende IFilter aus dem Dokument erzeugt, entsprechend formatiert sein. Dies funktioniert nicht für alle Dokumenttypen, scheint aber für Word zu funktionieren. Es wird ein eigenständiges Tool „Ifiltercmd.exe“ mitgeliefert, mit dem die Technik unabhängig ausprobiert werden kann. Der Composer kann auch eine Log-Datei mit dem extrahierten Text erzeugen.
Beispiel: invoice_two_vat.docm mit dem Smiley Makro
- Durch Drucken auf einen PrintMulti-Drucker Die Konfiguration eines entsprechenden PrintMulti Druckers ist mit Hilfe der Beispieldateien und der Hilfe sehr einfach. Auf diesem Drucker wird dann automatisch eine PDF/A-3-Datei erzeugt und der Composer mit dem aus dem Druckdatenstrom extrahierten Text aufgerufen. Das funktioniert mit allen Dokumenten, die versteckten Text enthalten und die Anwendung dieser auch tatsächlich druckt. Bei Bedarf können Sie den Drucker im Netzwerk freigeben und so von mehreren Arbeitsplätzen aus digitale Rechnungen erzeugen. Der Composer und die Konfigurationsdateien werden dann nur auf dem Rechner benötigt, der den PrintMulti Drucker freigibt.
- Über die Zwischenablage mittels Strg+A / Strg+C oder über ein Makro den Text markieren. Der Composer kann den Text aus der Zwischenablage mit der Option ‚/iC‘ übernehmen. Dies funktioniert bei allen Rechnungen, die versteckten Text enthalten und bei denen die Anwendung den Text korrekt formatiert in die Zwischenablage kopiert. Bei Verwendung eines Makros könnte das aktuelle Dokument als PDF gespeichert werden und somit _PDF_ erzeugt werden. Ein Beispiel für ein Kommandozeilen-Skript „RunFromClipboard.cmd“ ist enthalten. _XML_ können dann einfach durch Kopieren der Rechnung aus Word, Libre-Writer, Browser, … in die Zwischenablage und Aufruf des Skripts erstellt werden
Die „Serienbrief-Methode mit versteckten Texten
Nicht jede Rechnung sieht gleich aus und es kann mühsam sein, die Beträge, Summen usw. jedes Mal neu in Word einzugeben. Man kann diese variablen Daten auch aus einer Datenquelle holen und dort die Berechnungen durchführen. Im Prinzip handelt es sich immer noch um ein einfaches Word-Dokument und für die Rechnungserstellung selbst können alle Möglichkeiten wie bei der „Versteckte-Text Methode“ ohne Serienbriefunterstützung genutzt werden.
Beispiele MailMerge.docx oder MailMerge.docm mit Mailmerge.xlsx
Die „Serienbrief-Methode mit benannten Verweisen“
Der Inhalt ist nahezu identisch mit der vorherigen Methode. Die Rechnungserstellung unterscheidet sich jedoch grundlegend. Alle Rechnungselemente werden über Referenzen mit eindeutigen Namen definiert. Die veränderbaren Elemente werden wieder über Seriendruckfelder eingefügt. Die fixen Elemente über Dokumenteigenschaften. Die Namen müssen den in der Composer-Konfigurationsdatei definierten Namen entsprechen und mit einem Unterstrich beginnen. Für die Rechnungserstellung ist ein Makro erforderlich, das die Referenznamen und Inhalte extrahiert und eine Composer-Konfigurationsdatei mit konstanten Werten erzeugt. Sie können das Makro bei Bedarf anpassen, wenn Ihnen die Namenssyntax nicht gefällt, oder konstante Daten fest einfügen. Bei dieser Methode ist die Verwendung von PrintMulti nicht möglich (die Rechnungselemente werden nicht gedruckt).
Beispiel: MailMergeNoPattern.docm mit MailMergeNoPattern.xlsx
Die „Versteckte-Text Methode mit eingebettetem Excel Objekt“
Wenn die Berechnungen kompliziert werden, bietet sich vielleicht diese Möglichkeit an. Sowohl die Rechnungsgrunddaten in Word als auch die Werte aus dem eingebetteten Excel Sheet enthalten versteckte Texte, die jeweils über Formatvorlagen in Word- oder Excel sichtbar gemacht werden können. Der Nachteil hier ist, dass weder die Zwischenablage noch die IFilter-Technik funktionieren. Nur durch das Drucken auf einen PrintMulti Drucker kann eine digitale Rechnung erzeugt werden.
Beispiel (Excel Verzeichnis): invoice_excel.docx und alle embed*.xlsx Dateien.
Details zu den Möglichkeiten
Es folgenden noch einige Bilder und Anmerkungen zu den verschiedenen Methoden
Versteckte Texte Methode
Die zu verwenden Pattern sind in der Konfigurationsdatei des Composers hinterlegt und können ggf. angepasst werden. Das Trennzeichen ‚⁞‘ ist einfach ein selten verwendetes Zeichen aus dem Unicode-Zeichensatz. Es darf nicht innerhalb des extrahierten Textes vorkommen. Das „#“ in „Q#3“ dient hier als Platzhalter für Rechnungspositionen. Beim Ausführen des Makros mit dem grünen Button oder durch manuelles Ändern der Formatvorlage, verschwinden die Steuertexte.
Beim Kopieren in die Zwischenablage oder beim Ausführen der IFilter Methode, sind sie aber als Text vorhanden:
... MENGE UNIT BESCHREIBUNG MWST. PREIS PRO EINHEIT GESAMT [Q_1] 2⁞ [U_1]m^3⁞ [N_1]Ohne Position⁞ [R_1]19%⁞ [P_1]523,00€⁞ [A_1]1.046,00€⁞ [I_2]2⁞[Q_2] 4⁞ [U_2]m³⁞ [N_2]Irgendwas mit 7% MwSt.⁞ [R_2]7%⁞ [P_2]14,00€⁞ [A_2]56,00€⁞ [I_3]3⁞[Q_3] 3⁞ [N_3]Ohne Einheit⁞ [R_3]7%⁞ [P_3]11,00€⁞ [A_3]33,00€⁞ [I_4]4⁞[Q_4] 2⁞ [U_4]m³⁞ [N_4]Default MwSt.19% (aus (R_) oben) ⁞ 19% [P_4]7,50€⁞ [A_4]15,00€⁞ [I_5]XX⁞[Q_5] 4⁞ [U_5]Stk.⁞ [N_5]Zeit für Guinness im Scruffies⁞ 19% [P_5]6,50€⁞ [A_5]26,00€⁞ ...
Die „Serienbrief-Methode mit versteckten Texten
Im Gegensatz zur vorigen Methode werden hier einfach Rechnungsteile über Seriendruckfelder eingefügt.
Hier ein Ausschnitt der Daten aus Excel (funktioniert natürlich auch mit anderen Datenquellen). Die Namen der Überschriften sind hier nicht festgelegt
_NAME_ | _ADDRNAME_ | _ADDR1_ | _CO_ | _PLZ_ | _TOWN_ | _EMAIL_ |
Gans GmbH | Gustav Gans | Entengasse 1 | DE | 54321 | Entenhausen | gustav.gans@gans.de |
Gans GmbH | Donald Duck | Entengasse 1 | DE | 54321 | Entenhausen | gustav.gans@gans.de |
Gans GmbH | Daisy Duck | Entengasse 1 | DE | 54321 | Entenhausen | gustav.gans@gans.de |
Die drei Rechnungen enthalten verschiedene Mehrwertsteuersätze „19%“, „Befreit außerhalb EU“, „Befreit Reverse Charge“
Die „Serienbrief-Methode mit benannten Verweisen“
Hier sind keine versteckten Texte nötig. Die Rechnungsteile werden wie im letzten Beispiel über Seriendruckfelder (diesmal aber mit genau definiertem Namen) und Dokumentenfelder eingefügt.
Die Erzeugung der _XML_ oder _PDF_ kann nur über ein Makro erfolgen, da die Referenzen programmatisch extrahiert werden müssen. Drucken mit einem Rechnungsdrucker über PrintMulti ist nicht möglich.
Die Dokumenteninformationen findet man je nach Version an unterschiedlicher Stelle. In meiner Word-Version sieht es so aus:
Die Datenquellen Überschriften müssen feste Titel haben, damit diese auf die erwarteten Konfigurationseinträge abgebildet werden können. Das enthaltene Makro erwartet einen führenden Unterstrich.
_invoice_nr | _invoice_type | _invoice_currency | _invoice_date | _invoice_payment_due_date | _buyer_name |
123 | facture | EUR | 02.04.2025 | 12.04.2025 | Gans GmbH |
124 | invoice | € | 02.04.2025 | 12.04.2025 | Gans GmbH |
125 | Rechnung | $ | 02.04.2025 | 12.04.2025 | Gans GmbH |
Die „Versteckte-Text Methode mit eingebettetem Excel Objekt“
Die Beispiele enthalten keine Makros zum Ausblenden der Steuertexte. Sie müssen die Formatvorlagen in Word und Excel anpassen.
Am besten öffnen Sie das Word-Dokument und fügen das Excel-Objekt als Referenz ein.
Digitale Rechnungen können in diesem Format nur über PrintMulti erstellt werden, da das eingebettete Objekt weder als Text in der Zwischenablage landet noch mit der Erzeugung mit IFilter funktioniert.
Das Ergebnis sieht jetzt in Word nicht so toll aus, aber wenn Sie die Rechnung auf den Drucker „XRechnung“ (siehe Hilfe zur Einrichtung im Unterverzeichnis „PrintMulti“) ausgeben, dann erhalten Sie eine _PDF_ und eine _XML_ im Unterverzeichnis mit der Rechnungsnummer im Namen.
Hier können Sie die vollständige _PDF_ betrachten (Der rechte Rahmen ist im nächsten Release in den Beispielen dann richtig)
In der jobs.csv können Sie auf Wunsch einen Eintrag für jede gedruckte Rechnung (erfolgreich oder nicht) eintragen lassen.
2025-03-30_18-27-15;OK;Successful;2025-0002;01.03.2024;[Käuf. Firmenname];1.330,19 €;1.030,19 €
Digitale Rechnungen mit PrintMulti
Mit PrintMulti als Druckprozessor kann ein virtueller Drucker erzeugt werden, der in der Lage ist gedruckten Text aus dem Datenstrom zu extrahieren und so die notwendige Textdatei für den Composer zur Verfügung zu stellen.
Eigentlich ist es dazu gedacht Druckjobs zu vervielfältigen und auf mehreren Druckern mit vielen Veränderungen auszugeben. In diesem Fall wird der
„PDF Architect 9“ PDF Dateidrucker verwendet um direkt ohne Postscript Umwege eine geeignete PDF/A3 zu erhalten. Der „Microsoft Print to PDF“ ist nicht in der Lage PDFs in diesem Format zu erzeugen (zumindest zum aktuellen Zeitpunkt).
Die digitale Rechnungserzeugung mit PrintMulti ist nur möglich wenn die zu druckenden Rechnung die versteckten Zeichen enthält.
Die Vorteile sind
- Für Benutzer ein gewohnter Arbeitsschritte „Drucken auf einen Drucker“
- Eine Freigabe des Druckers von einem Server (kostenpflichtig) oder einem Clientcomputer ist machbar und ermöglicht eine zentrale Verwaltung
- Es können noch weitere PrintMulti typischen Aktionen gleichzeitig konfiguriert werden, wie das Drucken auf einen weiteren Drucker, eine Archivierung, …
Hier finden Sie ein Dokument das die Installation beschreibt. Es ist auch im Download Archiv enthalten.
Ich will hier noch etwas auf die spezielle Konfiguration für den XRechnungsdrucker eingehen. Der wichtigste Teil sieht so aus:
[XRechnung] Active=1 ActionXRechnung=Print;XRechnungAction ; for all actions !BasePath=C:\ZUGFeRDComposer ; Virtual Printer - need PrintMulti as Print Processor [XRechnungAction] Active=1 ; xml invoice (/OX) !XRechnungFile=%BasePath%\{invoice_nr}\{invoice_nr}_{Date}_{Time}_pm.xml ; PDF with embedded xml (/OP) !DstPDFFile=%BasePath%\{invoice_nr}\{invoice_nr}_{Date}_{Time}_pm.pdf ; Temp PDF !SavedDFFile=%BasePath%\Temp\#K_#J.pdf ; Text file saved with WriteText2File option later !TextFile=%BasePath%\Temp\#K_#J.txt ; Debug file containing detected patterns and values !ExtractFile=%BasePath%\Temp\{invoice_nr}_{Date}_{Time}_pm_e.txt ; csv file containing one entry for each call containing result(OK,ERROR), Date, Invoice date, Invoice nr, some amounts (currently fixed layout) !JobsFile=%BasePath%\Jobs\jobs.csv ; Maybe you want different configuration files for different printers !ToolsConfiguration=%ZUGFerdToolsPath%\Defaults\ExtractConfiguration.txt Printer=PDF Architect 9 ; contains the PDF Save2File=%SavedDFFile% ; Contains all text output directly in out line WriteText2File=%TextFile% ; If you want to force PDF/A with the pdf architect, save a devmode with the tool devmode2file and use it here ;Devmode1=%BasePath%\ArchitextPDFA.dev Execute=yes ; Hide console ExecuteFlags=0x08000000 ExecuteTimeout=INF ExecuteCmd=@"%BasePath%\bin\ZugFerdComposer.exe" /IT @"%TextFile%" /IP @"%SavedDFFile%" /OX @"%XRechnungFile%" /OP @"%DstPDFFile%" /OJ @"%JobsFile%" /OE @"%ExtractFile%"
Bedeutung der Farben:
orange sind PrintMulti Keywords
rot sind PrintMulti Makros, die durch Daten vom Drucken ersetzt werden
blau sind gesetzte Umgebungsvariable (alle Variablen, die mit ‚!‘ anfängt, sind als Umgebungsvariablen verfügbar)
grüne Pattern werden von Composer durch entsprechende Rechnungsteile ersetzt
Hier ein kurzer Überblick über die verwendeten Optionen. Details finden Sie im PrintMulti Handbuch
- Der Drucker mit „PrintMulti“ als Druckprozessor (hier „XRechnung“) muss als Text in eckigen Klammern mit „Active=1“ angegeben werden.
Hier werden verschiedene Aktionen wie Drucken oder als Bild speichern definiert. Der Name auf der linken Seite muss mit „Action“ beginnen und sich von anderen „Action“-Einträgen unterscheiden.
Auf der rechten Seite steht dann die auszuführende Aktion (hier „Print“) und ein Verweis auf den Abschnitt mit den spezifischen Einstellungen für die Aktion(hier „XRechnungAction“)
Jeder PrintMulti Drucker kann in einer eigenen Konfigurationsdatei stehen. Der Ort wird ggf. in der Registry hinterlegt (siehe reg-Datei im PrintMulti Verzeichnis). Falls nicht angegeben wird immer die „PrintMulti.ini“ im „C:\Program Files\PrintMulti“ Verzeichnis verwendet. In einer Konfigurationsdatei können mehrere „PrintMulti“ Drucker definiert sein. - Die Konfigurationsdatei fängt normalerweise mit einem allgemeinen Teil an, der Einstellungen zur Protokollierung enthält. Dieser ist im obigen Beispiel nicht enthalten.
- Im Abschnitt zum Drucken (hier „XRechnungAction“) selbst wird der Zieldrucker mittels „Printer=“ definiert. Es wird noch festgelegt, dass nicht physikalisch gedruckt, sondern in eine Datei mit „Save2File“ gespeichert werden soll.
- Der für den Composer wichtige Inhalt des Dokuments wird mittels „WriteText2File“ in eine Datei gespeichert und diese dann übergeben.
- Am Ende sind mehrere Definitionen für das Ausführen eines Befehls („Execute*“) . Es können auch mehrere Befehle ausgeführt werden, die dann aber in eigenen Sektionen definiert werden müssen (z.B. für eine folgende Archivierung).
Die Konsole wird versteckt (ist bei modernen Windows-Versionen eh nicht zu sehen) und der unendlicher Timeout gewählt. Das wäre wichtig, wenn ein weiterer Abschnitt auf das Ergebnis des Befehls warten sollte. - Der eigentliche Aufruf des Composers mit den Parametern, jeweils in Anführungszeichen für Pfade, ist in der letzten Zeile zu finden. Die Bedeutung der Parameter finden Sie im Composer Handbuch. Der letzte Parameter mit „/OE“ übergeben ist optional und enthält die erkannten Rechnungsteile (Debugausgabe).
Wenn Sie den Composer und die PrintMulti Konfigurationsdatei woanders haben wollen, dann müssen Sie den „!BasePath„ und auch den Pfad zur Konfigurationsdatei in der reg-Datei im PrintMulti Verzeichnis anpassen.
Wenn Sie den Namen des Rechnungsdrucker von „XRechnung“ ändern wollen, dann müssen Sie ihn in der PrintMulti Konfigurationsdatei anpassen