Turn the invoice PDF you already have into an e-invoice.

Your layout stays exactly as it is. The invoice data is added as XML, following EN 16931 (ZUGFeRD / Factur-X).

Nothing is uploaded. Everything happens in your browser.

  • Free
  • Open source (MIT)
  • No sign-up

Check and complete the data

The XML is the legally binding part of an e-invoice. Compare every value with your PDF.

Read with AI

A language model reads names, addresses and line items from the text of your invoice. It runs on your device; your invoice does not leave the browser.

The model is downloaded from huggingface.co and raw.githubusercontent.com on first use and kept in the browser.

Totals

What goes into your file

Your e-invoice is ready.

The same invoice as before, now a PDF/A-3 that carries its data as XML (ZUGFeRD / Factur-X, profile EN 16931).

Download e-invoice Download the XML only

SHA-256

What is added to your file

People read the left side, software the right one. Both have to say the same, so every value is compared with your PDF.

Printed on your invoice Written into the XML
Rechnung Nr. RE-2026-0042 <ram:ID>RE-2026-0042</ram:ID>
Rechnungsdatum 03.11.2026 <udt:DateTimeString format="102">20261103</udt:DateTimeString>
Umsatzsteuer 19 % 284,81 € <ram:CalculatedAmount>284.81</ram:CalculatedAmount>
Gesamtbetrag 1.783,81 € <ram:GrandTotalAmount>1783.81</ram:GrandTotalAmount>

What you should know

.

.

.

.

.

.

.

.

.

.

Which kinds of invoices work?
. .
. .
. .
. .
. .
. .
. .

For developers and AI assistants

The same core runs as a library, as a command line tool and as an MCP server that lets AI assistants convert invoices.

// npm install pdf-to-einvoice
import { check, createEInvoice, extractLayout, guessFromText } from 'pdf-to-einvoice';

const { text, blocks } = await extractLayout(pdfBytes);
const invoice = guessFromText(text, { blocks }); // what the page says
const { findings } = check(invoice, { pdfText: text }); // what is missing or wrong
const { pdf, xml } = await createEInvoice({ pdf: pdfBytes, invoice });