FR / EN

BASE

Home Studio Approach

SERVICES

Batch invoicing Factur-X Backend & interventions

INSTALLATION

Autonomous invoicing system Autonomous recruitment system Factur-X integration

FREE TOOLS

Quote generator Factur-X demo

RESOURCES

Flask chatbot VS Code environment pack Documentation framework Static site

CONTENT

No subscription Data security Backend problems Time waste Electronic invoicing reform 2026 Technical notes

SUPPORT

FAQ Contact Links

SUPPORT

FAQ Contact Links

Factur-X EN16931: why your PDF invoice is probably not compliant

Technical note on Factur-X EN16931 compliance, PDF/A-3, XSD and Schematron, and the most common errors in e-invoicing solutions.

The e-invoicing reform sets strict deadlines. Many solutions claim to be Factur-X compliant. Few actually are.

Factur-X compliance is not just about embedding an XML file inside a PDF.
It relies on three distinct, independent, and all mandatory levels.

The three compliance levels

A Factur-X invoice is considered compliant only if it simultaneously satisfies these three requirements:

  • XSD-valid XML: the XML file structure is syntactically correct
  • Schematron-valid XML: EN16931 business rules are respected (amounts, VAT, identifiers)
  • PDF/A-3 compliant: the PDF document is long-term archivable with the XML correctly embedded

Most solutions only validate one or two of these levels. PDF/A-3 is consistently the most problematic part.

Why PDF/A-3 is the real problem

Generating a PDF and embedding an XML file into it does not produce a compliant PDF/A-3 document.

PDF/A-3 enforces strict constraints on the document itself: fully embedded fonts, declared color spaces, ICC OutputIntent present, compliant XMP metadata.

The most widely used PDF generation libraries, Dompdf and TCPDF, produce DeviceRGB without an ICC OutputIntent. The result is a PDF invalid under the PDF/A standard, even if the embedded XML is perfectly structured.

The Factur-X validator detects this immediately. The invoice is rejected.

What the validator actually checks

The reference Factur-X validator performs three distinct passes:

  • XSD validation of the XML structure
  • Schematron validation of EN16931 business rules
  • PDF/A-3 validation of the complete document

A solution that passes XSD and Schematron but fails on PDF/A-3 is not Factur-X compliant. It produces a correct XML inside a non-archivable PDF.

The combination that works

PDF/A-3 compliance requires a PDF generation library capable of natively producing an archivable document.

mPDF generates clean PDF/A-1b output, with an integrated ICC OutputIntent, embedded fonts and compliant XMP metadata. The Python factur-x library then injects the EN16931 XML and converts the document to PDF/A-3.

The result passes all three validation levels: XSD, Schematron, PDF/A-3.

What this means in practice

An existing invoicing solution can be made Factur-X compliant without a full rewrite.

The XML engine adapts to the existing data structure. The PDF/A-3 injection is added at the output of the current PDF generator. The existing system is not deeply modified.

What changes: the produced document is now valid, archivable, and interoperable with e-invoicing platforms.

The September 2026 deadline for B2B e-invoice reception leaves no room for partial solutions.

← Back to Technical Notes