Mustang wurde ursprünglich in Java geschrieben aber seit April 2022 gibt es auch Version für .net-Programmiersprachen. Wie die Java-Version ist sie ist open source, unterliegt allerdings der restriktiveren Affero-GPL-lizensiert und Teil des Mustang-Abos.
Sie wird kein ZUGFeRD Version 1 und keine Validierung unterstützen und verzichtet derzeit noch auf Order-X, Zuschläge/Rabatte, Dateianhänge, Gutschriften und Stornorechnungen sowie Bezüge beispielsweise auf Lieferschine, Verträge oder andere Dokumente: Wir brauchen Ihr Feedback was als erstes nachgezogen werden muss.
Und die .net-Version stellt bereits XRechnung, ZUGFeRD 2 und Factur-X sowie Unterstützung für beliebige PDF-Eingabedateien zur Verfügung, das heißt, dass sie sogar verwendet werden kann wenn die Eingabe noch nicht einmal PDF/A ist.
Als kleines Goodie läßt sich die Umwandlung von PDF in PDF/A-3 auch separat nutzen.
Intern basiert die PDF/A-3-Funktionalität auf Ghostscript, für eine kommerzielle Verbreitung kann eine kommerzielle Ghostscript-Lizenz nötig sein.
Die .net-Version kann sehr ähnlich wie Mustang+Java benutzt werden:
using org.mustangproject;
using System.IO;
using java.math;
Invoice i = (new Invoice()).setDueDate(DateTime.Now).setIssueDate(DateTime.Now).setDeliveryDate(DateTime.Now).setSender((new TradeParty("Test company","teststr","55232","teststadt","DE")).addTaxID("DE4711").addVATID("DE0815").setContact(new Contact("Hans Test","+49123456789","test@example.org")).addBankDetails(new BankDetails("DE12500105170648489890","COBADEFXXX"))).setRecipient(new TradeParty("Franz Müller", "teststr.12", "55232", "Entenhausen", "DE")).setReferenceNumber("991-01484-64").setNumber("123").
addItem(new Item(new Product("Testprodukt", "", "C62", new BigDecimal(19)), new BigDecimal("1.0"), new BigDecimal("1.0")));
ZUGFeRD2PullProvider zf2p = new ZUGFeRD2PullProvider();
zf2p.setProfile(Profiles.getByName("XRechnung"));
zf2p.generateXML(i);
System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
string outfilename="xrechnung.xml";
File.WriteAllBytes(outfilename, zf2p.getXML());
Ersetzen Sie einfach Date durch System.DateTime. ZUGFeRDExporterFromPDFA1 erfordert einen String-Konstruktor, den Pfad zu Ihrer nativen Ghostscript DLL.
Mit dem invoice-Objekt können Sie wie folgt Factur-X/ZUGFeRD PDF-Dateien schreiben
ZUGFeRDExporter ex=new ZUGFeRDExporter("gsdll64.dll").load("blanko.pdf");
ex.setTransaction(i);
ex.export("factur-x.pdf");
Zum testen können Sie unsere MustangBlanko PDF-A/1-Datei verwenden wobei Mustang.net tatsächlich auch normale PDF-Dateien in PDF/A-3 umwandeln wird.
Um zu bestätigen dass die Beträge in der XML-Struktur Ihren Beträgen entsprechen können Sie beispielsweise folgenden Quelltext benutzen:
TransactionCalculator tc=new TransactionCalculator(i);
...tc.getGrandTotal()...
Für “arbitrary precision” wird “java.math”‘s BigDecimal, d.i. das OpenJDK.BigMathNET Paket benutzt. In der .csproj machen die folgenden Itemgroup-Einträge Sinn:
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging" Version="6.0.0" />
<PackageReference Include="itext7" Version="7.2.1" />
<PackageReference Include="OpenJDK.BigMathNET" Version="1.0.2.1" />
<PackageReference Include="Ghostscript.NET" Version="1.2.3" />
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="6.0.4" />
<Reference Include="mustang">
<HintPath>mustang_net.dll</HintPath>
</Reference>
</ItemGroup>
Tragen Sie sich hier ein zur kostenlosen Beta, dem Newsletter zu Neuigkeiten im Entwicklungsprozess und dem Downloadlink der gezippten DLL: