XRechnung & ZUGFeRD Visualization - Offline XSLT-to-HTML Invoice Viewer (EU)
Turn EN 16931 UBL 2.1 and UN/CEFACT CII e-invoices - and hybrid ZUGFeRD / Factur-X PDFs - into a standardized, human-readable HTML preview. 100% offline. No cloud, no API, no data leaves your database.
Why this module
Structured e-invoices are machine-readable XML - illegible to a human who needs to check a figure or approve a payment. The German XRechnung standard defines a visualization concept: rendering the XML as a clean, standardized HTML invoice. This module implements that concept in Odoo for both XRechnung syntaxes and for ZUGFeRD / Factur-X hybrid PDFs using a custom offline Python engine (not the official KoSIT stylesheets), and it runs entirely on your own server - there is no external service, no upload, and no internet access required.
Both XRechnung syntaxes
Renders OASIS UBL 2.1 Invoice and CreditNote documents and UN/CEFACT CII (CrossIndustryInvoice). The two very different XML vocabularies are mapped onto one syntax-neutral EN 16931 model, so the preview looks the same whichever syntax your trading partner sent.
ZUGFeRD / Factur-X PDFs
Drop in a hybrid PDF/A-3 and the module extracts the embedded
factur-x.xml / zugferd-invoice.xml /
xrechnung.xml attachment - with a dependency-free, pure
offline reader - then visualizes the structured data inside it.
Genuine bundled XSLT
A real XSLT 1.0 stylesheet ships with the module and is executed offline by libxslt. It normalizes either syntax into a common vocabulary. The Python engine is the full-featured path (payment terms, payee, notes, all document references and allowances). The XSLT engine covers the core fields: parties, lines, VAT breakdown and totals.
EN 16931 aware
Code lists are expanded to plain language (document type, VAT category, payment means, units, allowance/charge reasons), and the totals are checked against EN 16931 rules BR-CO-15 and BR-CO-16; an arithmetically inconsistent document is clearly flagged.
What you get in the preview
| Section | Contents |
|---|---|
| Header | Document type, detected syntax (UBL / CII) and profile (XRechnung 3.x, ZUGFeRD/EN 16931, Peppol BIS) |
| Parties | Seller, buyer and payee with full postal address, VAT/tax identifiers, legal registration, electronic address and contact group |
| Metadata | Invoice number, issue/due/tax-point/delivery dates, Buyer reference (Leitweg-ID), order, contract, project and preceding-invoice references |
| Lines | Item, description, article number, quantity with unit, net price, VAT category and rate, net amount |
| Allowances & charges | Document-level allowances and charges with reason and VAT |
| VAT breakdown | One row per VAT category with taxable base, rate, VAT amount and any exemption reason |
| Totals | Line total, allowances, charges, net total, VAT total, gross, prepaid, rounding and amount due |
| Payment | Payment means, IBAN, BIC, account holder and payment terms |
How it works
- Open a customer or vendor invoice and click Visualize E-Invoice - the module finds the EN 16931 attachment (XML or hybrid PDF) and renders it.
- Or use the Visualize E-Invoice wizard under Accounting to upload any file ad hoc.
- The standardized HTML is shown inline, saved as a permanent record, and downloadable as a self-contained
.htmlfile (inline CSS, no JavaScript, no external assets). - Every render stores the detected syntax, profile, document type, totals and a SHA-256 hash of the source for traceability and search.
Privacy & scope
This is a pure visualization utility. It reads and renders existing EN 16931 documents; it does not create, sign, validate against a schema authority, or transmit invoices. All processing happens locally on your Odoo server with XML external-entity resolution disabled and no network access. The legally relevant document always remains the original XML - the HTML is a faithful human-readable view of it.
Compatible with Odoo 18 and Odoo 19. Community base only
(account). Requires the standard lxml library.
Screenshots
Visualizations
Visualize E Invoice
Update date: 2026-07-02