E-invoicing · PDF/A-3 · .NET 8

Factur-X / ZUGFeRD invoices
in pure C#.

Generate a PDF/A-3 hybrid invoice with your CII XML embedded — the format Factur-X (France) and ZUGFeRD (Germany) require — in one managed .NET 8 call. No Chromium. No native binaries. Zero dependencies.

What the standard requires

A PDF that is the invoice.

Factur-X and ZUGFeRD define a single file that contains both the human-readable invoice and the machine-readable CII XML at /AFRelationship. The PDF must conform to PDF/A-3 and carry the correct XMP namespace — requirements that a Chromium-based converter cannot meet because it produces a viewer output, not an archival stream.

PDF/A-3 archival stream

The output must be a conformant PDF/A-3B file with an embedded output intent ICC profile — not a regular PDF with a file attachment bolted on.

Embedded CII XML

The CII invoice XML is attached at /AFRelationship=Alternative with the Factur-X XMP namespace in the document metadata — written natively by Bhowra.Ink.

No extra library

Everything — PDF/A-3 output, XML embedding, QR code generation, Arabic/RTL layout — is in the single ~828 KB assembly. No separate PDF post-processor needed.

Three lines to a conformant hybrid invoice

One call. PDF/A-3 out.

Bhowra.Ink on NuGet — a zero-dependency .NET library for PDF/A-3 invoice generation — handles the XMP, the attachment stream, and the output intent in the same call that renders your HTML:

using Bhowra.Ink;

byte[] ciiXml = File.ReadAllBytes("factur-x.xml");   // your CII invoice XML

var props = new ConverterProperties { PdfA = PdfAConformance.PdfA3B }
    .SetFacturX(ciiXml, FacturXProfile.En16931);     // embeds factur-x.xml + fx: XMP

byte[] pdf = HtmlConverter.ConvertToBytes(invoiceHtml, props);
File.WriteAllBytes("factur-x-invoice.pdf", pdf);

The same call runs on any .NET 8 target — console app, ASP.NET Core, Azure Functions, AWS Lambda, Docker — without per-platform builds.

All six conformance profiles

Pass the profile as a FacturXProfile enum value. Bhowra.Ink writes the correct urn:factur-x.eu:1p0: namespace and DocumentType XMP field automatically.

Profile Use case Enum value
Minimum Minimum data set — buyer reference only FacturXProfile.Minimum
BasicWL Line-item totals, no individual line data FacturXProfile.BasicWL
Basic Line items with amounts FacturXProfile.Basic
EN 16931 (Comfort) Full EN 16931 data set; required for most EU mandates FacturXProfile.En16931
Extended Superset of EN 16931 with additional fields FacturXProfile.Extended
XRechnung German public-sector e-invoice mandate FacturXProfile.XRechnung

Frequently asked

What is a Factur-X / ZUGFeRD invoice?

Factur-X (France) and ZUGFeRD (Germany) are hybrid invoice formats: a PDF/A-3 file with a machine-readable CII XML document embedded inside it. The human-readable PDF and the structured data travel together in one file. EN 16931 defines the data model; XRechnung is the German public-sector profile.

Why can't a Chromium-based converter produce a Factur-X file?

Chromium produces a PDF viewer output, not an archival PDF/A-3 stream. It cannot embed a structured XML attachment at /AFRelationship, set the correct PDF/A OutputIntent, or write the Factur-X XMP namespace — all of which are mandatory for a conformant Factur-X file. Bhowra.Ink writes these natively.

Does Bhowra.Ink validate the CII XML?

No. Bhowra.Ink embeds the XML bytes you provide verbatim into the /AF attachment stream and adds the correct XMP metadata. XML conformance against the Factur-X / ZUGFeRD schema is your pipeline’s responsibility — use a dedicated validator (e.g. Mustang Project) before passing the bytes to SetFacturX.

Does it run on Azure Functions / AWS Lambda / Docker?

Yes. Because there is no native code, the same managed DLL runs on Windows Consumption plans, Linux, AWS Lambda and Docker — there are no per-platform builds to manage.

What about Arabic / RTL invoices?

Full bidirectional text layout for Arabic and Hebrew is bundled in the same assembly. Verified on ZATCA tax invoices and GCC payslips. No extra font packages required.

Ship Factur-X invoices from your .NET service.

One DLL, zero dependencies, PDF/A-3 out. Add Bhowra.Ink to your project and generate your first hybrid invoice in under a minute.

Get Bhowra.Ink on NuGet → See the full library

Bhowra.Ink renders the invoice PDF and embeds your XML. Signing and tax-authority submission remain your pipeline’s responsibility.