Saudi e-invoicing · PDF/A-3 · Arabic/RTL

ZATCA invoice PDFs
in pure C#.

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

The buyer copy is a PDF. The submitted artifact is XML. These are different files.

ZATCA Phase 2 has two distinct output artifacts. Bhowra.Ink handles exactly one of them:

Submission artifact (not us)

The signed UBL XML submitted to FATOORA. Your pipeline generates, XAdES-signs, and clears this. Bhowra.Ink is not involved.

Buyer copy PDF (us)

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.

Arabic/RTL layout (built in)

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

PDF/A-3 + QR in one call.

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.

Why a Chromium-based converter won't work here

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

Frequently asked

What does ZATCA require for the buyer-facing invoice PDF?

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.

Does Bhowra.Ink sign or submit the ZATCA invoice to FATOORA?

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.

How do I position the QR code?

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.

Does it handle Arabic and right-to-left layouts?

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.

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.

Ship the ZATCA buyer-copy PDF from your .NET pipeline.

One DLL, zero dependencies. PDF/A-3 hybrid + TLV QR + Arabic/RTL, all in one call.

Get Bhowra.Ink on NuGet → See the full library

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