
![The drag & drop uploader rendered by the <code>[einvoice_viewer]</code> shortcode.](https://ps.w.org/einvoice-viewer-for-peppol-en16931/assets/screenshot-1.png?rev=3703537)
The drag & drop uploader rendered by the <code>[einvoice_viewer]</code> shortcode.
➜ 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 [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.
bt="1" / bt="0".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.spev_code_tooltip, spev_invoice_model) let an add-on extend the BT/BG tooltips and the invoice model itself.Since reading moved into the browser, 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 vendor/ is this plugin family’s own code under GPL-2.0-or-later; composer.lock lists it.
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.