Mustang wurde ursprünglich in Java geschrieben aber von April 2022-2025 gab es auch Version für .net-Programmiersprachen. Wie die Java-Version ist sie ist open source, unterlag aber der restriktiveren Affero-GPL-lizenz. Seit April 2025 wurde ihre Codebasis komplett in Ghostscript.net integriert.
Unterstützt wird noch kein ZUGFeRD Version 1, Validierung oder Order-X, Zuschläge/Rabatte, Dateianhänge, Gutschriften und Stornorechnungen sowie Bezüge beispielsweise auf Lieferscheine, Verträge oder andere Dokumente. Funktionieren sollte allerdings bereits XRechnung, ZUGFeRD 2 und Factur-X sowie Unterstützung für beliebige PDF-Eingabedateien: das heißt, dass sogar normale PDF-Dateien als Basis verwendet werden können (die Java-Version von Mustang erfordert mindestens PDF/A-1) ist.
Die .net-Version kann sehr ähnlich wie Mustang+Java benutzt werden:
using Ghostscript.NET.PDFA3Converter.ZUGFeRD;
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", "", "H87", new BigDecimal(19)), new BigDecimal("1.0"), new BigDecimal("1.0")));
ZUGFeRD2PullProvider zf2p = new ZUGFeRD2PullProvider();
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 würde.
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.3.0" />
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="6.0.4" />
</ItemGroup>
Für community support – und um eventuelle PRs einzureichen – wenden Sie sich gerne an Ghostscript.NET.