Skip to content

Factur-X Validator

Factur-X 1.09.2

Open a Factur-X or ZUGFeRD PDF, see what the container actually declares, and validate the CII invoice embedded in it against the official profile rules. The PDF is read in your browser and never uploaded.

Your document never leaves your device — the file is read and parsed in this browser tab.

Drop a Factur-X or ZUGFeRD PDF here, or choose a file

Read in your browser. Never uploaded. Up to 25.0 MB.

A Factur-X file is two documents, and only one of them is validated here

Factur-X wraps a machine-readable invoice inside a PDF a person can read. The wrapper is a PDF/A-3 file with the invoice attached to it; the payload is a UN/CEFACT Cross Industry Invoice. They are governed by different specifications and they fail in different ways, so a tool that reported a single verdict over both would be hiding the more useful half of the answer.

This page validates the payload. It runs the rules of the Factur-X profile the file declares — the same official packages the France validator uses, because there is only one set of them — and reports each finding with the rule identifier the artefact itself emitted.

It does not validate the wrapper. PDF/A-3 conformance is not checked, and that limitation is printed on every result rather than buried in a footnote. A Factur-X file can satisfy every business rule while failing the container requirements: a missing output intent, an attachment declared with the wrong relationship, a font that was never embedded. Those are real rejection causes and this tool cannot see any of them.

What it tells you about the container anyway

Not conformance — but plenty that is worth knowing, and that no rule engine will tell you. The page opens with the structural facts: how many pages, how large, which PDF version, how many embedded files. Then the attachments, each with its filename, its type as detected from its bytes rather than its extension, and its size, with the one that was actually parsed as the invoice marked as such.

Then the metadata. A Factur-X PDF carries an XMP block declaring its document type, the filename of the attached XML, the Factur-X version and the conformance level — the profile. All four are shown as the file states them. Any PDF/A claim in that metadata is shown too, described as a claim, because that is what it is: something the file says about itself, not something anyone verified.

Finally, the evidence. This tool does not assume a PDF is Factur-X because an attachment is called factur-x.xml. It lists what it found — a filename the specifications define, an attachment whose content parses as a Cross Industry Invoice, metadata that agrees with the attachment — and states a confidence level. A file that only half fits is described as half fitting.

When the file contradicts itself

The container and the invoice each name a profile, independently, and they can disagree. When that happens both declarations are shown and nothing is validated until you say which one applies. Neither is treated as more authoritative, because neither is: the XMP conformance level is what the producer wrote into the PDF metadata, and the guideline identifier is what the producer wrote into the XML, and a mismatch means one of the two is wrong without saying which.

Choosing for you would produce a page full of findings from rules your document never claimed to follow, which reads exactly like a broken invoice and is not one.

Which page you want

  • Factur-X Viewer — to look at the file. It renders the PDF pages, extracts the XML and lays out the invoice data. No rules, no verdict.
  • Factur-X Validator — this page. Container inspection, then the profile rules against the embedded invoice.
  • France e-invoice validator — when the question is French compliance rather than Factur-X, or when your document is standalone UBL or CII rather than a PDF. It runs the French national rules on top of the profile rules.

What a clean result does not mean

This is an independent tool. It is not an official, government or approved validator, and it has no affiliation with the DGFiP, the AIFE, the FNFE-MPE or FeRD. A clean result means the pinned rule packages found nothing wrong with the embedded invoice, at the versions named on the page — and says nothing about the PDF container, about transmission through an approved platform, or about whether a recipient's system will accept the file.

Frequently asked questions

What is the difference between the Factur-X viewer and this validator?

The viewer shows you the document: it renders the PDF pages, extracts the embedded XML and lays out the invoice data so you can read it. It runs no rules and reaches no verdict. This validator does the opposite — it does not render the pages at all, and instead reports what the container declares and then executes the Factur-X profile rules against the invoice inside it. Use the viewer to understand a file; use this to find out what is wrong with one.

How is this different from the France e-invoice validator?

The France validator starts from a syntax: give it a UBL file, a CII file or a PDF, and it validates against the French rule packages, with the container as one of three ways in. This page starts from the container. It accepts only a PDF, and everything the France validator discards after extracting the invoice — the attachment list, the XMP block, the detection evidence, the PDF/A claim — is the subject here rather than a means to an end. Both run the same rule packages, because there is only one set.

Does a clean result mean my file is a valid Factur-X document?

No, and this is the distinction the page is built around. Factur-X is two things at once: a PDF/A-3 container and a CII invoice inside it. This tool validates the invoice. It does not check the container against PDF/A-3, so a file can pass here and still be rejected for a missing output intent, a wrong attachment relationship or an unembedded font. Checking that requires a PDF/A conformance checker, which this project does not ship and does not pretend to.

What does it inspect in the container?

Page count, size and PDF version; every embedded file with its name, detected type and size; the XMP metadata block, including the declared Factur-X document type, filename, version and conformance level; and any PDF/A claim the metadata makes. It also shows the evidence that led it to treat the file as Factur-X at all, with a confidence level — because a file named factur-x.xml that is not a Cross Industry Invoice is not a Factur-X file, and the tool should be able to say why it thinks otherwise.

Which profiles can it validate?

BASIC WL, EN 16931 and EXTENDED. Those are the Factur-X profiles the pinned FNFE-MPE release supplies executable rules for. MINIMUM and BASIC are defined by the Factur-X specification but ship no rule package in this release, so they are not offered — a target with no artefacts behind it would be a promise the validator could not keep.

The metadata and the invoice declare different profiles. What happens?

Both declarations are shown and nothing is validated until you choose. The XMP conformance level and the invoice’s own guideline identifier are two independent statements about the same file, and when they disagree neither is more authoritative than the other. Picking one silently would mean reporting findings from rules your document never claimed to follow.

Can I validate a ZUGFeRD file here?

Usually, yes. ZUGFeRD 2.x and Factur-X are the same specification published under two names, and files carrying the ZUGFeRD metadata namespace are recognised. What is validated is still the embedded CII invoice against the Factur-X profile rules; the German national requirements, such as XRechnung, are a different rule set and are not run here.

Is my PDF uploaded?

No. The PDF is read with your browser’s own file API and parsed by a local copy of PDF.js in a worker, with scripting and evaluation disabled and the worker served from this site. This tool has no upload step and no storage. Opening a PDF here generates no network request derived from its contents — open your browser’s network panel and check.