Turn an invoice PDF and an invoice XML into one Factur-X file, without sending either to anyone
Give the page the PDF your system printed and the EN 16931 XML it also produced. You get a hybrid PDF — the pages plus the XML attached inside them, in a PDF/A-3 envelope — and the conformance verdict on the file that was written, before you download it. The whole generator runs in this tab: nothing is uploaded.
Two halves in, one file out
or drag the PDF onto the box below.
No file loaded. The PDF is the human-readable invoice; the XML is the machine-readable one. A hybrid file is both in a single document.
the engine starts on the first wrap
The file it wrote
Nothing written yet. The engine loads once, then every wrap is local.
What the wrapper writes, and what it cannot
A hybrid document is two standards at once: the invoice XML has to satisfy EN 16931, and the PDF around it has to satisfy PDF/A-3 and Factur-X. The envelope is the part that can be written mechanically, so it is the part this page writes in full.
| Structure | What it is for |
|---|---|
factur-x.xml attachment |
the invoice itself, stored with its size, modification date and MD5 checksum, registered in /EmbeddedFiles and in the catalogue’s /AF array as relationship Data |
| XMP metadata | pdfaid:part 3, pdfaid:conformance, the fx profile declaration and the pdfaExtension schema the level needs, so a reader learns the profile before it opens the attachment |
| OutputIntent | a registered colour profile, which PDF/A demands so colours survive in fifty years |
| Document metadata and language | title, author, dates and /Lang, written consistently in the XMP packet and the legacy /Info dictionary |
| Validation settings | the PDF declares which profile it claims, which is what makes a MINIMUM file’s claim readable without opening the XML |
| Finding | Why a wrapper cannot fix it |
|---|---|
pdfa.font |
a font referenced by name but not embedded renders differently on the next machine; embedding it means redrawing the glyphs, not editing metadata |
pdfa.tagged, pdfa.structtree |
a structure tree has to describe the markup that is actually in the content stream; inventing one would claim accessibility the file does not have |
| transparency and colour | blend modes and device-dependent colour spaces are properties of what was drawn |
| Input | What happens instead |
|---|---|
| a profile the invoice XML contradicts | stopped before a byte is written: the wrapper will not label a file as more than the invoice inside it claims, which is the first thing a French or German platform checks |
a PDF that already carries factur-x.xml |
stopped: adding a second invoice to one file leaves a reader guessing which one the pages belong to. Wrap the pages the invoice was printed from instead |
So the report you get back is the honest one: the same audit the checker page runs, on the bytes that were just produced. Try both sample pairs to see the difference — the PDF/A-3 pages come back clean; the ordinary ones come back with the envelope complete and the fonts still missing.
Frequently asked
Do I need the PDF to be PDF/A already?
No, and this page will tell you what it is not. Wrapping adds the PDF/A-3 structures, but if the invoice pages were printed with fonts that are not embedded the file still fails a validator on that point — the report says so and names the font. Producers that can export PDF/A should do that first; the checker shows what a given file does.
Which file name should the hybrid PDF have?
Factur-X does not mandate one. The download here is named after your source
PDF with -facturx so it does not overwrite the file you started
with; rename it to whatever your archive expects. The attachment inside,
however, has to be named exactly factur-x.xml (or
order.xml for Order-X), and that is what gets written.
Can I wrap more than the XML?
Yes, with the tools rather than this page: einv embed -attach
lines.csv adds supporting files as Supplement attachments,
and the Go library’s facturx.Options takes them as data plus a MIME
type. See CLI & libraries.
Is there a batch or server version?
The same engine runs as a CLI — einv embed invoice.pdf invoice.xml -o
out.pdf — and as a Go or TypeScript library. Both are open source; a
hosted pipeline for signed, timestamped, high-volume generation is the paid
part of this project.
Is the tool really free?
Yes, with no account. The engine is MIT licensed and embeds the European Commission’s EN 16931 Schematron artefacts (EUPL 1.2) unmodified. Conformance help only — not legal, tax or accounting advice.