
➜ Try the live demo – upload an XRechnung, ZUGFeRD/Factur-X or Peppol BIS invoice and see it rendered instantly.
eInvoice Viewer for PEPPOL & EN16931 turns an uploaded electronic invoice into a clear, structured HTML view directly on your page – without any external service and without storing the file.
Add the [spev_einvoice_viewer] shortcode to a page and your visitors can drag and drop an electronic invoice into the viewer. The document is read and rendered entirely in the visitor’s own browser – it is never uploaded to your server. The result (invoice header, parties, order and delivery data, payment details, line items, VAT breakdown and totals) appears instantly, without a page reload and without a single byte of the invoice ever crossing the network. The layout is inspired by the official ZUGFeRD Quba viewer and is rendered inside a Shadow DOM, so it looks identical in every theme.
Supported formats
- ZUGFeRD / Factur-X (PDF) – the embedded XML is extracted and read automatically.
- CII (UN/CEFACT) XML – read directly.
- UBL / XRechnung (XML) – read directly. Covers XRechnung-UBL and Peppol BIS Billing 3.0, including credit notes.
Highlights
- Drag & drop uploader – vanilla JavaScript, no framework, no page reload.
- Complete field coverage – the field catalogue knows 268 EN 16931 business terms in 43 business groups. Empty fields are shown as placeholders on purpose, so you can see which terms the standard defines and which ones this invoice omitted. Every bank account and every payment means of the invoice is shown, not only the first one.
- Amounts that do not add up are marked – the viewer recalculates line amounts, VAT breakdown and totals. A stated amount that differs from the calculated one is marked red, with both amounts below it.
- Fields that break a rule of the invoice itself are marked – a missing mandatory field, a VAT category whose rules are not met, a due date before the invoice date or a period that ends before it starts is marked red, with a note below it that names the rule, where the standard has one. Marked fields stay visible even with “Only filled fields” switched on. A box above the invoice says what the viewer checks – mandatory fields, VAT category rules, the order of the dates and whether the totals add up – and that a validator checks all rules.
- Attachments – below the invoice, every attachment is listed with its name, type and size. PDFs and images can be viewed in place, and an attachment of one of six permitted types can be saved.
- Business-term labels with a short description – each field can carry its BT / BG code, and hovering it shows the term name plus a short description of the field in German, English or French. Further details (cardinality, data type, business rules) are provided by the separate “eInvoice Viewer – Technical Details” extension. Toggled live, per setting or via the shortcode attribute
bt="1"/bt="0". - Trilingual – the interface is available in English, German and French.
- Theme-independent – rendered inside a Shadow DOM with a full style reset, so no theme styles leak through.
- Reads like an invoice – a document header with the amount due, every business group in a block with its name as a flag on the frame, the label beside the value, and two field rows side by side in a wide block. The layout adapts to the column it sits in, not to the window. Typefaces ship inside the plugin; nothing is loaded from a font service.
- The document never leaves your browser – reading and rendering both happen client-side; your server never receives the file, so there is nothing to store, log or leak in the first place.
- Secure by design – the invoice is parsed by the browser’s own
DOMParser(no server-side XML parser, so no XXE surface for the upload itself); every invoice value is escaped on output. Sibling paid extensions that genuinely need server-side processing (validation, export, …) keep their own independent upload, nonce and rate-limit handling. - Extensible – an add-on can extend the invoice model and the BT/BG tooltips through two hooks on the viewer component,
extendModelandextendTooltip, and aeinvoice-model-readyevent hands it the finished model, the raw XML and the original file.
Third-party libraries
The only bundled third-party code is Mozilla pdf.js (assets/js/pdfjs/, Apache License 2.0, license text next to the files), used to pull the embedded XML out of a ZUGFeRD / Factur-X PDF. Everything else in the plugin is this plugin family’s own code under GPL-2.0-or-later.
Demo
Try the viewer without installing anything: live demo on invoicePress.de. Drop in your own e-invoice; it is read and rendered in your browser, exactly as on your own site. The plugin itself never contacts the demo site.
Screenshots
![The drag & drop uploader rendered by the [spev_einvoice_viewer] shortcode.](https://ps.w.org/einvoice-viewer-for-peppol-en16931/assets/screenshot-1.png?rev=3765765)
The drag & drop uploader rendered by the [spev_einvoice_viewer] shortcode.

A rendered invoice with the structured Quba-inspired layout.

The same invoice with the EN 16931 business-term numbers enabled.

The settings page under Settings -> E-Invoice Viewer.

An invoice with missing mandatory fields: each field is marked red with the rule below it.

An amount that does not add up: the stated and the calculated amount stand below the marked field.

The attachments below the invoice, with a PDF attachment opened in place.