E-invoicing · PDF/A-3 · .NET 8
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
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.
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.
The CII invoice XML is attached at /AFRelationship=Alternative with the Factur-X XMP namespace in the document metadata — written natively by Bhowra.Ink.
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
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.
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 |
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.
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.
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.
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.
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.
One DLL, zero dependencies, PDF/A-3 out. Add Bhowra.Ink to your project and generate your first hybrid invoice in under a minute.
Bhowra.Ink renders the invoice PDF and embeds your XML. Signing and tax-authority submission remain your pipeline’s responsibility.