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.