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.
The text of your invoice is sent to this address. If it is not on your device, the text leaves the browser.
You can keep working while the model loads; it is kept for next time.
Totals
What goes into your file
| Printed on your invoice | Written into the XML |
|---|
Show the whole XML
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>
|
| Rechnungsdatum 03.11.2026 |
<udt:DateTimeString format="102">
|
| Umsatzsteuer 19 % 284,81 € |
<ram:CalculatedAmount>
|
| Gesamtbetrag 1.783,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 });
npx pdf-to-einvoice read invoice.pdf --json # text, guessed values, facts about the file
npx pdf-to-einvoice check data.json --pdf invoice.pdf # missing, wrong, not on the PDF
npx pdf-to-einvoice create invoice.pdf data.json # writes invoice.einvoice.pdf
npx pdf-to-einvoice validate invoice.einvoice.pdf # checks an existing e-invoice
{
"mcpServers": {
"pdf-to-einvoice": { "command": "npx", "args": ["-y", "pdf-to-einvoice", "mcp"] }
}
}
# skills/pdf-to-einvoice/SKILL.md ships with the package. Its rules for an agent:
- You act for the invoice issuer. A received PDF cannot be turned into a valid e-invoice.
- Copy values exactly as the PDF prints them. Never invent a value; ask the user.
- Always show the findings. Errors block the e-invoice.
- Get the user's confirmation of the data before you create the file.