Laden...

Normkonforme Einbettung von ZUGFeRD/XML in PDF/A-3 – Erfahrungen & Lösungen?

9 Antworten
1,545 Aufrufe
Letzter Beitrag: vor 25 Tagen
Normkonforme Einbettung von ZUGFeRD/XML in PDF/A-3 – Erfahrungen & Lösungen?

Hallo zusammen,

ich stehe vor folgendem Szenario und suche Erfahrungsaustausch, Tipps oder Best Practices:

Ausgangslage

Ich habe bereits PDF/A-3 Dateien, die mit Ghostscript erfolgreich und normgerecht erzeugt werden.

Ich möchte eine ZUGFeRD-Rechnung (XML-Datei) normenkonform in diese PDF/A-3 einbetten, inklusive korrekter Verschlagwortung (AFRelationship, XMP-Metadaten etc.).

Die PDF/A-3 muss nach wie vor vollständig standardkonform bleiben (PDF/A-3b oder 3u).

Das Ganze soll automatisiert ablaufen, idealerweise aus einer .NET-Anwendung heraus.

Die XML-Datei wird aus einer firmeneigenen Datenstruktur (z. B. Rechnung-4711.XMLDATA) erzeugt. Diese Datenstruktur erzeugt unser ERP-System und enthält alles, was für die Erstellung einer ZUGFeRD-Rechnung oder XRechnung notwendig ist. Natürlich können auch andere Programme/ERP-Systeme diese Datenstruktur liefern und somit unser Tool nutzen.

Anforderungen / Rahmenbedingungen

Ich suche eine Lösung, die möglichst einmalig bezahlt werden kann (keine laufenden Lizenzkosten).

Die Einbettung kann (muss aber nicht) über ein externes Tool (CLI/EXE) aufgerufen werden können, d. h. keine unbedingte Integration als Bibliothek zwingend erforderlich.

Die Lizenz soll erlauben, das Tool im eigenen Produkt an Kunden weiterzugeben (OEM-fähig).

Open Source ist willkommen, solange es praktikabel ist.

Lösungen mit Java (ZUGFeRD-injector) oder Go (pdfcpu) sind möglich, wenn sie stabil und standardkonform sind.

Mein Kenntnisstand / Recherche

PdfSharpCore kann PDF manipulieren, aber bietet keine PDF/A-3-Konformität, keine XMP- oder AFRelationship-Unterstützung. Selbstprogrammierung ist extrem aufwendig und fehleranfällig.

pdfcpu kann Anhänge einbetten, aber nicht normkonform verschlagworten (kein AFRelationship, kein XMP für ZUGFeRD).

ZUGFeRD-injector (Java CLI) ist praktisch und normkonform, aber bringt eine Java-Abhängigkeit mit.

callas pdfaPilot CLI/SDK ist professionell, normkonform, erlaubt OEM-Vertrieb, kostet aber ca. 5.000 € einmalig.

iText 7 Community (AGPL) kann alles, aber erfordert Offenlegung des Quellcodes für das Tool, wenn es weitergegeben wird. Kommerzielle Lizenz teuer.

Nun meine Fragen an euch

Wie habt ihr die normkonforme Einbettung von ZUGFeRD/XML in PDF/A-3 technisch gelöst?

Welche Tools (Open Source oder kommerziell) setzt ihr ein – und wie sind eure Erfahrungen damit?

Nutzt ihr eher eine Bibliothek (z. B. iText, PdfBox, pdfcpu) oder ein externes CLI-Tool?

Wie handhabt ihr die Lizenzfragen, speziell bei Einbindung in kommerzielle Produkte?

Gibt es Empfehlungen für einfach bedienbare, zuverlässige Lösungen mit minimalen Lizenz- und Betriebsabhängigkeiten?

Vielen Dank schon mal für eure Empfehlungen!

LG
René

René

Im Java-Bereich gibt es https://github.com/ZUGFeRD/mustangproject - in der .NET Welt nichts vergleichbares.

Für meine Kunden kommen ebenfalls nur kommerzielle Lösungen aufgrund der Komplexität und Rechtssicherheit infrage; hier vor allem DevExpress, gibt aber auch eine Lösung SyncFusion

Wie handhabt ihr die Lizenzfragen, speziell bei Einbindung in kommerzielle Produkte?

Das ergibt sich aus der Lizenzregelung der externen Abhängigkeit. Hast eine konkrete Frage, musst sie konkret stellen.

Danke, auf SyncFusion bin ich schon gekommen und habe bereits eine Anfrage am Laufen.

Mit Ghostscript ginge es auch, wie ich gesehen habe, aber das Ding ist mir etwas zu wackelig. Ich denke, es wird SyncFusion werden, denn damit kann ich alles zentral machen.

René

Ich nehme das hier https://github.com/stephanstapel/ZUGFeRD-csharp. Man muss sich zwar mal kurz rein arbeiten, aber funktioniert ganz gut.

Zitat von tron1

Ich nehme das hier https://github.com/stephanstapel/ZUGFeRD-csharp. Man muss sich zwar mal kurz rein arbeiten, aber funktioniert ganz gut.

Nutze ich auch. Es ging hier um die Einbettung der XML-Rechnung in das PDF. PDF in PDF/A-3B konvertiere ich mit PdfSharpCore – etwas tricky, dafür kostenlos. Die Einbettung dann mit SyncFusion. Funktioniert mitlerweile tadellos.

René

Zitat von pollito

PDF in PDF/A-3B konvertiere ich mit PdfSharpCore – etwas tricky, dafür kostenlos.

PdfSharpCore selbst ist kostenlos (MIT Lizenz), hat aber eine Dependency auf SixLabors.ImageSharp, was für kommerzielle Zwecke nicht pauschal kostenlos ist.
https://sixlabors.com/pricing/

If you are consuming any Six Labors libraries as a Direct Package Dependency for usage in Closed Source software in the capacity of a For-profit company/individual with more than 1M USD annual gross revenue you must purchase a Six Labors Commercial License.

Man muss immer die Lizenzen der Dependencies mit beachten.

Die beiden Versionen der Abhängigkeiten von SixLabors, die bei PdfSharpCore eingebunden sind, wurden noch unter Apache 2.0 lizenziert.

Wir lösen das direkt über den Formular-Generator List & Label. Da kann die XML einfach mit eingebettet werden - beim Erstellen der PDF.

Hallo pollito,

ich hole man der Vollständigkeit zu Ehren etwas weiter aus.

Mit iText kann man Dateien ja relativ einfach in ein PDF-Dokument einbinden:

using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Filespec;
using iText.Kernel.Utils;
using iText.Pdfa;

public static MemoryStream AttachToPDF(MemoryStream pdf, byte[] attachment, string fileName, string description)
{
    var result = new MemoryStream();
    pdf.Position = 0;
    using (var pdfReader = new PdfReader(pdf))
    using (var pdfWriter = new PdfWriter(result))
    using (var pdfDocument = new PdfADocument(pdfReader, pdfWriter))
    {
        pdfWriter.SetCloseStream(false);
        pdfDocument.AddFileAttachment(fileName, PdfFileSpec.CreateEmbeddedFileSpec(pdfDocument,
                                                attachment, description, fileName, PdfName.Data));
    }
    return result;
}

Für ein PDF-A/3-Dokument muss ein ICC-Farbprofil (ICC-Profil – Wikipedia) hinterlegt sein, einige Varianten kann man unter sRGB profiles (https://color.org, International Color Consortium) herunterladen.

public static MemoryStream AddRgbProfile(MemoryStream pdf)
{
    MemoryStream result = new MemoryStream();
    pdf.Position = 0;
    using (var pdfReader = new PdfReader(pdf))
    using (var pdfRDocument = new PdfDocument(pdfReader))
    using (var pdfWriter = new PdfWriter(result, new WriterProperties().AddXmpMetadata()))
    using (var iccProfile = new FileStream("profile_name.icc", FileMode.Open, FileAccess.Read))
    using (var pdfDocument = new PdfADocument(pdfWriter, PdfAConformance.PDF_A_3B,
                                                new PdfOutputIntent("Custom", "", "http://www.color.org",
                                                                    "profile_name", iccProfile)))
    {
        pdfWriter.SetCloseStream(false);
        new PdfMerger(pdfDocument).Merge(pdfRDocument, 1, pdfDocument.GetNumberOfPages());
    }
    return result;
}

Irgendwo hab' ich auch mal gelesen, dass man ggf. vorhandene Profile löschen sollte, in der Richtung hab' ich aber aktuell noch nichts geschrieben.

Ich hoffe, dass hilft etwas weiter.

Nobody is perfect. I'm sad, i'm not nobody 🙁