Saudi e-invoicing · PDF/A-3 · Arabic/RTL
Render the PDF/A-3 hybrid invoice ZATCA requires for buyer-sharing — with your signed UBL XML embedded and the TLV QR code placed on the page — in a single .NET 8 call. No Chromium. No native binaries. Arabic/RTL layout built in.
What the mandate requires
ZATCA Phase 2 has two distinct output artifacts. Bhowra.Ink handles exactly one of them:
The signed UBL XML submitted to FATOORA. Your pipeline generates, XAdES-signs, and clears this. Bhowra.Ink is not involved.
The PDF/A-3 hybrid invoice shared with the buyer — the archival PDF with your signed XML embedded and the TLV QR code on the page. This is what Bhowra.Ink produces.
Production-grade Arabic shaping and bidi layout are bundled in the same assembly. No extra font packages. No separate layout library.
The buyer-copy PDF — in code
Bhowra.Ink on NuGet embeds your XML, renders the QR code from your TLV bytes, and produces a PDF/A-3 conformant file in a single in-process call:
using Bhowra.Ink;
byte[] tlvQr = BuildZatcaTlv(...); // your Phase-2 base64 TLV payload
byte[] ublXml = File.ReadAllBytes("invoice.xml"); // your signed UBL XML
var props = new ConverterProperties { PdfA = PdfAConformance.PdfA3B, QrCodeData = tlvQr }
.AttachFile("invoice.xml", ublXml, "application/xml", afRelationship: "Alternative");
byte[] pdf = HtmlConverter.ConvertToBytes(arabicInvoiceHtml, props);
File.WriteAllBytes("zatca-buyer-copy.pdf", pdf);
Position the QR code with QrCodeX,
QrCodeY, QrCodeSize,
and QrCodePage properties on
ConverterProperties.
| Bhowra.Ink | Chromium-based converters | |
|---|---|---|
| PDF/A-3 output | ✅ Native PDF/A-3B stream | ❌ Viewer PDF only, not archival |
| Embed UBL/CII XML at /AFRelationship | ✅ Built in | ❌ Requires a post-processor |
| ISO/IEC 18004 QR from TLV bytes | ✅ Zero-dependency, built in | ❌ External QR library + image injection |
| Arabic / RTL text layout | ✅ Production-grade, bundled | ⚠️ Depends on system fonts / config |
| Deployment size | ~895 KB, one DLL | Hundreds of MB (full browser) |
| Azure Functions (Windows Consumption) | ✅ Works | ❌ Blocked by sandbox |
ZATCA Phase 2 requires a PDF/A-3 hybrid invoice for the buyer copy: an archival PDF with the signed UBL XML embedded and a TLV QR code printed on the document. The standalone XML submitted to FATOORA is a separate artifact; Bhowra.Ink is not involved in that submission.
No. Bhowra.Ink renders the human-readable PDF and embeds the UBL XML you provide. XML generation, XAdES digital signing, and FATOORA submission are your pipeline’s responsibility. Bhowra.Ink handles the PDF side of the buyer copy only.
Set QrCodeX, QrCodeY
(in points from the bottom-left of the page),
QrCodeSize (side length in points), and
QrCodePage (1-based page number) on
ConverterProperties. The QR code is rendered at
error-correction level M by default; set QrCodeEcLevel
to override.
Yes. Full bidirectional text layout for Arabic is bundled in the single assembly — no extra font packages required. Verified on ZATCA invoices and Saudi/UAE payslips with mixed Arabic/English content.
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.
One DLL, zero dependencies. PDF/A-3 hybrid + TLV QR + Arabic/RTL, all in one call.
Bhowra.Ink renders the invoice PDF and embeds your XML. Signing (XAdES) and tax-authority submission to FATOORA remain your pipeline’s responsibility.