ZUGFeRD-Export

Zur Vorstellung von Komponenten und Units für Lazarus
Antworten
Joh
Lazarusforum e. V.
Beiträge: 302
Registriert: Sa 26. Mai 2012, 17:31
OS, Lazarus, FPC: Win 10 (L 2.2.6 x64 FPC 3.2.2)
CPU-Target: 64Bit

ZUGFeRD-Export

Beitrag von Joh »

Moin,
ich habe ein Beispielprojekt erstellt, mit dem ich eine ZUGFeRD-Rechnung mit Lazarus erstellen kann.

Für den PDF-Export muß
- pack_powerpdf eingebunden werden. Außerdem muß das Verzeichnis
<lazarus-Verzeichnis>\components\lazreport\source\addons\pdfexport\
in den Pfad eingebunden werden. Dort befindet sich die Datei lr_e_pdf.pas, die für den PDF-Export aus Lazreport zuständig ist.
(Keine Ahnung, warum sich diese Datei nicht im Package lazreport befindet. lr_e_csv.pas für den csv-Export, lr_e_htm.pas für den html-Export sind drin...)

Für die Zusammenführung von pdf und xml-Datei nutze ich ein externes Postscript-Script, welches jeder Ghostscript-Installation beiliegt.
Außerdem steht im Hintergrund eine Firebird-Datenbank.

Für beide Sachen habe ich die entsprechenden Dateien dem Projekt beigefügt, so das das Projekt unter Windows 64bit direkt lauffähig sein müsste.
Unter Linux sollten die Laufzeitkomponenten von Firebird und Ghostscript ausgetauscht werden.

externe Dateien:

Code: Alles auswählen

# Ghostscript-Runtime 64-bit
gswin64.exe          - Ghostscript
gsdll64.dll          - Ghostscript dll
COPYING              - Ghostscript-Lizenz

# Firebird 4-Runtime 64-bit
fbclient.dll         - Firebird-Client
ib_util.dll          - Firebird 
IDPLicense.txt       - Firebird-Lizenz
plugins
plugins\engine13.dll
Ich habe in dem Projekt den ZUGFeRD-Export in vier Schritte aufgeteilt:

i) der PDF-Export
via TfrReport.ExportTo()
- erstellt die Datei invoice.pdf, eine Standard-PDF-Datei mit den visuellen Komponenten

ii) der xml-Export
manuelle Erstellung der xml-Datei mittels TXMLDocument und TDOMNode
(man könnte auch writeln(f, '') nehmen, aber TXMLDocument nimmt etwas Kontrolle ab.
- erstellt die Datei factur-x.xml mit den Rechnungsdaten, die in der PDF eingebettet wird.

iii) Ghostscript-Batch
die Zusammenführung pdf und xml; Erstellung einer PDF/A3-Datei nach dem ZUGFeRD-Standard
- hierzu wird die externe Komponente aus dem Ghostscript-Projekt genutzt.
Im Projekt eingebunden werden dazu
- gs-create.bat - Batchdatei mit Ghostscript-Aufruf
- zugferd.ps - das eigentliche Postscript-Script
- srgb.icc - icc-Profil für die pdf/A3-Datei


iv) Optional: Outlook/TB-Versand
Versand der ZUGFeRD-Rechnung per eMail.
- für die Mailerstellung muß Synapse in den ProjektPfad eingetragen werden: <synapse-Verzeichnis>\source\lib\
- hierzu wird mittels Ararat-Synapse eine eMail erstellt. Diese wird aber nicht versandt, sondern als eml-Datei gespeichert.
- Ein Aufruf dieser eml-Datei mit OpenDocument() startet dabei den aktuellen eMail-Client.
(getestet mit Thunderbird, Betterbird, Outlook 2013-2022 Classic)
Das "neue Outlook" :-( sollte genausowenig funktionieren wie der Outlook WebClient.

Rechnung.zip
(269.92 KiB) 223-mal heruntergeladen
Firebird-Win.zip
(3.31 MiB) 221-mal heruntergeladen
die beiden notwendigen Ghostscript-Dateien konnte ich aufgrund der Größe nicht hochladen und habe sie gezippt:
http://klostersch.de/daten/lazarus-foru ... pt-Win.zip

hier das Original:
Ghostscript: https://ghostscript.com/releases/gsdnld.html
just my two Beer

Benutzeravatar
KoBraSoft
Beiträge: 127
Registriert: So 6. Jun 2021, 09:57
OS, Lazarus, FPC: die zu Zeit aktuellen Versionen, überwiegend Linux
CPU-Target: 64Bit 32 Bit
Kontaktdaten:

Re: ZUGFeRD-Export

Beitrag von KoBraSoft »

Tolles Projekt, das ist genau was ich auch machen wollte. Bin aber bisher noch nicht dazu gekommen.
Ich bin dabei es unter Linux zum laufen zu bekommen.
Ich habe dazu ein Debian 13 (RC2) aufgesetzt und die notwendigen Bibliotheken und Programme installiert (Firebird Server, Lazarus, ...)
Ein paar Kleinigkeiten waren am Code zu ändern zB einen "\" durch DirectorySeparator ersetzen, die Datenbankpfade anpassen und die ShellApi auskommentieren (muss ich später noch durch TProzess ersetzen).
Die beiliegende Batch datei habe ich nach bash geändert. Momentan muss ich GhostScript noch in der Konsole aufrufen.

Code: Alles auswählen

gs --permit-file-read=./ -sDEVICE=pdfwrite -dPDFA=3 -sColorConversionStrategy=RGB -sZUGFeRDXMLFile=./factur-x.xml -sZUGFeRDProfile=./srgb.icc -sZUGFeRDVersion=2p1 -sZUGFeRDConformanceLevel="EN 16931" -o ./invoice.GS.pdf ./zugferd.ps ./Invoice.pdf
Ghostscript antwortet:

Code: Alles auswählen

GPL Ghostscript 10.05.1 (2025-04-29)
Copyright (C) 2025 Artifex Software, Inc.  All rights reserved.
This software is supplied under the GNU AGPLv3 and comes with NO WARRANTY:
see the file COPYING for details.
Processing pages 1 through 1.
Page 1
Loading font Helvetica (or substitute) from /usr/share/ghostscript/10.05.1/Resource/Font/NimbusSans-Regular
Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.05.1/Resource/Font/NimbusSans-Bold
Das hört sich gut an. Es wird auch eine Datei mit dem Namen invoice.GS.pdf erzeugt. Leider ist die Datei keine gültige Zugferd datei.
Anbei die erzeugte Datei.
invoice.GS.pdf
(20.76 KiB) 43-mal heruntergeladen
Hat jemand eine Idee woran das liegen könnte?
Konrad

www.KoBraSoft.de

Soner
Beiträge: 744
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: ZUGFeRD-Export

Beitrag von Soner »

KoBraSoft hat geschrieben: Sa 5. Jul 2025, 14:49 ...
Hat jemand eine Idee woran das liegen könnte?
Die letzte Version von vor ein Paar Monaten war fehlerhaft, ich hatte das hier erwähnt, vielleicht hast du die fehlerhafte Version erwischt.

Übrigens die beste Lösung ist die Unit von Jörg in Verbindung mit Pdfium zu benutzen. Da braucht man keine externe Programme.

Benutzeravatar
KoBraSoft
Beiträge: 127
Registriert: So 6. Jun 2021, 09:57
OS, Lazarus, FPC: die zu Zeit aktuellen Versionen, überwiegend Linux
CPU-Target: 64Bit 32 Bit
Kontaktdaten:

Re: ZUGFeRD-Export

Beitrag von KoBraSoft »

Soner hat geschrieben: Sa 5. Jul 2025, 22:18 Die letzte Version von vor ein Paar Monaten war fehlerhaft, ich hatte das hier erwähnt, vielleicht hast du die fehlerhafte Version erwischt.
Ich habe den Fehler gefunden. Offensichtlich mag GS keine relativen Pfade. Mit

Code: Alles auswählen

gs
--permit-file-read=/home/ko/lazprojekte/Rechnung/
-sDEVICE=pdfwrite
-dPDFA=3
-sColorConversionStrategy=RGB
-sZUGFeRDXMLFile=/home/ko/lazprojekte/Rechnung/factur-x.xml
-sZUGFeRDProfile=/home/ko/lazprojekte/Rechnung/srgb.icc
-sZUGFeRDVersion=2p1
-sZUGFeRDConformanceLevel=BASIC
-o /home/ko/lazprojekte/Rechnung/invoice1.GS.pdf
/home/ko/lazprojekte/Rechnung/zugferd.ps
/home/ko/lazprojekte/Rechnung/Invoice.pdf

klappt es.
Übrigens die beste Lösung ist die Unit von Jörg in Verbindung mit Pdfium zu benutzen. Da braucht man keine externe Programme.
Die Unit von Jörg ist toll, das ist keine Frage. Ich habe das Beispiel von Joh noch nicht genau untersucht, aber auf den ersten Blick verwendet er einen ähnlichen (wenn nicht gar den) Code wie Jörg. Zu Pdfium habe ich (auf die Schnelle) nur gefunden, dass es einen Wrapper von Andreas Hausladen https://github.com/ahausladen/PdfiumLib für Delphi gibt.
Ich habe nichts gefunden (aber auch nicht getestet) ob PdfiumLib mit Lazarus und Linux läuft. Es ist jedoch eine externe lib (pdfium.dll oder pdfium.so) notwendig. Offensichtlich verwendet Fastreport Pdfium. Kennt jemand ein Beispielprojekt für Lazarus mit pdfium und ZugFerd?


Die (für mich) großen Vorteile des Beispiels von Joh sind:
+ Automatische Erzeugung der pdf Rechnungsdateien aus Datenbankdaten über Lazreport
+ Automatische Erzeugung der xml aus Datenbankdaten
+ Der Aufwand das Beispiel nach Linux umzustellen ist überschaubar
+ Ghostscript ist bei Linux standardmäßig installiert (jedenfalls unter Debian und Ubuntu) Es braucht also kein externes Programm oder lib mitgeliefert werden.
++ Vieles davon setze ich in ähnlicher Form (Incl Firebird) in meinen Projekten bereits ein. Ich brauche also meine bisherigen Projekte nur geringfügig zu erweitern. :D
Konrad

www.KoBraSoft.de

Antworten