ZUGFeRD-Export

Zur Vorstellung von Komponenten und Units für Lazarus
Antworten
Joh
Lazarusforum e. V.
Beiträge: 305
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) 228-mal heruntergeladen
Firebird-Win.zip
(3.31 MiB) 222-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: 128
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) 65-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: 128
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

kirchfritz
Beiträge: 232
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win11 (L 3.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

Re: ZUGFeRD-Export

Beitrag von kirchfritz »

Frage an Joh:

Geht das ganze auch ohne LazarusReport?
Meine Rechnungsdaten liegen zum Beispiel schon im XML-Format (nicht ZUGFeRD-XM) oder im JSON-Format vor.
Ich habe also nicht unbedingt eine Datenbank als Ausgangslage für LazarusReport.
Lassen sich die Rechnungs-PDFs nicht mit Freepascal Boardmitteln zu PDF wandeln?
Braucht man dazu zwangsweise eine Datenbank in Verbindung mit LazarusReport?

ChatGPT hat mir vorgeschlagen, JSON-Dateien in ein TBufDataset zu wandeln und dieses TBufDataset dann mit LazarusReport verknüpfen.
Klappt schon irgendwie, nur das Erstellen/Designen des Reports ist schwierig, weil die Dataset-Felder erst zur Laufzeit und nicht zur Designzeit zur Verfügung stehen.

Grüße aus Nürnberg
Fritz

Benutzeravatar
Zvoni
Beiträge: 412
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: ZUGFeRD-Export

Beitrag von Zvoni »

Ich glaube paweld hat auch nen Wrapper für pdfium geschrieben
siehe auch: https://forum.lazarus.freepascal.org/in ... #msg432524

zu pdfium generell: mWn gibt es nur die Windows-DLL FERTIG zum download.
Für *nixe muss man die ".so" selbst kompilieren
(glaub ich zumindest)
Anleitung hier: https://pdfium.googlesource.com/pdfium/
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

paweld
Beiträge: 95
Registriert: So 11. Jun 2023, 16:01
OS, Lazarus, FPC: Lazarus trunk, FPC fixes

Re: ZUGFeRD-Export

Beitrag von paweld »

Zvoni hat geschrieben: Mo 7. Jul 2025, 13:19 Ich glaube paweld hat auch nen Wrapper für pdfium geschrieben
siehe auch: https://forum.lazarus.freepascal.org/in ... #msg432524
Ich bin nicht der Autor dieses Wrappers. Es ist eine leicht modifizierte ältere Version dieser Komponente: https://github.com/ahausladen/PdfiumLib
Grüße / Pozdrawiam
paweld

kirchfritz
Beiträge: 232
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win11 (L 3.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

Re: ZUGFeRD-Export

Beitrag von kirchfritz »

Soner hat geschrieben: Sa 5. Jul 2025, 22:18
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.
Frage an @soner: Was hat die Unit von Jörg mit PDFium zu tun? Meines Wissens ist PDFium zum PDF anschauen gut geeignet, zum PDF erstellen habe ich PDFium noch nicht kennengelernt.
Das PDF anzeigen interessiert mich nicht, wie man das PDF erstellen kann, wäre wichtiger!
Fritz

Benutzeravatar
KoBraSoft
Beiträge: 128
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 »

kirchfritz hat geschrieben: Mo 7. Jul 2025, 13:02 Frage an Joh:

Geht das ganze auch ohne LazarusReport?
Ich bin zwar nicht gefragt, antworte trotzdem :)
Hier https://www.freepascal.org/~michael/art ... lazpdf.pdf gibt es eine ausführliche Anleitung. Die notwendigen Komponenten sind bei fpc in packages/fcl-pdf dabei.
Konrad

www.KoBraSoft.de

Joh
Lazarusforum e. V.
Beiträge: 305
Registriert: Sa 26. Mai 2012, 17:31
OS, Lazarus, FPC: Win 10 (L 2.2.6 x64 FPC 3.2.2)
CPU-Target: 64Bit

Re: ZUGFeRD-Export

Beitrag von Joh »

kirchfritz hat geschrieben: Mo 7. Jul 2025, 13:02 Frage an Joh:

Geht das ganze auch ohne LazarusReport?
Meine Rechnungsdaten liegen zum Beispiel schon im XML-Format (nicht ZUGFeRD-XM) oder im JSON-Format vor.
Ich habe also nicht unbedingt eine Datenbank als Ausgangslage für LazarusReport.
Lassen sich die Rechnungs-PDFs nicht mit Freepascal Boardmitteln zu PDF wandeln?
Braucht man dazu zwangsweise eine Datenbank in Verbindung mit LazarusReport?

ChatGPT hat mir vorgeschlagen, JSON-Dateien in ein TBufDataset zu wandeln und dieses TBufDataset dann mit LazarusReport verknüpfen.
Klappt schon irgendwie, nur das Erstellen/Designen des Reports ist schwierig, weil die Dataset-Felder erst zur Laufzeit und nicht zur Designzeit zur Verfügung stehen.

Grüße aus Nürnberg
Fritz
Also eine PDF mit Boardmitteln erzeugen ist kein Hexenwerk...
Ich mache das gerne händisch mit libjpfpdf (die ich für mich manuell erweitert habe). Warum sollte man dann eine Datenbank benutzen.

Warum möchtest du dann Lazreport verwenden, wenn vorgegeben ist, was auszugeben ist.
Ich habe nur Lazreport mit Datenbank als Beispiel genommen, weil es für die meisten Leute halt der Standardablauf ist:

- Daten in Datenbank
- Bericht
- Rechnung
- ZUGFeRD

Wenn du ein bestimmtes (Rechnungsformular) händisch erzeugen möchtest, sag Bescheid.
Mein erstes Lazarus-Projekt bestand darin, Formulare (Betriebsanweisungen) händisch zu erstellen...

lg
Joh

PPS: keine Ahnung, was Chat-... dazu sagen würde; ich kenne diese Helferlein nicht und versuche sie zu Ignorieren.
just my two Beer

Antworten