Wie aus einem gestalteten Rechnungs-PDF eine hybride E-Rechnung wird: PDF/A-3, eingebettetes XML, XMP — und woran es in der Praxis scheitert.
Viele Teams haben ein sorgfältig gestaltetes Rechnungs-PDF — Logo, Hausschrift, Fußzeile mit Zahlungsbedingungen — und stehen jetzt vor der Aufgabe, daraus eine E-Rechnung zu machen, ohne das Design aufzugeben. Genau dafür sind ZUGFeRD und Factur-X gebaut: hybride Rechnungen, die für Menschen aussehen wie bisher und für Maschinen ein strukturiertes XML mitführen. Der Weg dorthin ist gut spezifiziert, scheitert in der Praxis aber regelmäßig an einer Handvoll Details.
Eine ZUGFeRD/Factur-X-Rechnung besteht aus drei Schichten:
Der Container ist ein PDF/A-3. Nicht PDF 1.4, nicht PDF 1.7, sondern die Archivierungsnorm ISO 19005-3 — sie ist die einzige PDF/A-Variante, die beliebige Dateianhänge erlaubt. PDF/A-3 verbietet außerdem Verschlüsselung, JavaScript und externe Abhängigkeiten wie nicht eingebettete Schriften.
Das eingebettete XML ist eine UN/CEFACT-CII-Datei und trägt einen normierten Dateinamen, der von Standard und Version abhängt: factur-x.xml bei ZUGFeRD 2.1+ und Factur-X (im Profil XRECHNUNG: xrechnung.xml), zugferd-invoice.xml bei ZUGFeRD 2.0, ZUGFeRD-invoice.xml beim veralteten ZUGFeRD 1.0. Der Anhang braucht einen AFRelationship-Eintrag — bei vollwertigen Profilen üblicherweise Alternative (das XML ist eine alternative Repräsentation derselben Rechnung), bei den reduzierten Profilen MINIMUM und BASIC WL dagegen Data oder Source.
Die XMP-Metadaten des PDFs deklarieren über das Factur-X-Extension-Schema, was eingebettet ist: DocumentType (INVOICE), DocumentFileName (exakt der Anhangsname), Version und ConformanceLevel — also das Profil, von MINIMUM bis EXTENDED. Empfängersysteme lesen diese Deklaration, bevor sie das XML überhaupt anfassen.
Fast alle fehlerhaften Hybridrechnungen fallen in eines dieser Muster:
rechnung.xml oder invoice.xml statt factur-x.xml. Der Inhalt mag perfekt sein, gefunden wird er nicht überall.Das Rad muss niemand neu erfinden. Im Java-Umfeld sind mustangproject und PDFBox etablierte Wege, ein bestehendes PDF nach PDF/A-3 zu konvertieren und das XML samt AFRelationship und XMP anzuhängen; für .NET und Python existieren vergleichbare Bibliotheken. Das Prinzip ist immer dasselbe: Design-PDF rendern wie bisher, dann in einem zweiten Schritt Container konvertieren, XML einbetten, XMP schreiben.
Eine Priorität sollte dabei klar sein: Der maschinenlesbare Teil ist das, was Empfänger tatsächlich verarbeiten — das Design ist nur fürs Auge. Die Sorgfalt gehört ins XML: korrekte Summenarithmetik, vollständige Pflichtfelder, das richtige Profil. Ein schönes PDF mit kaputtem XML ist keine E-Rechnung; ein nüchternes PDF mit sauberem XML schon.
Das erzeugte PDF gehört vor dem Versand in den Billhorse-Validator: Er extrahiert das eingebettete XML direkt aus dem PDF-Container und validiert es gegen EN 16931 und die profilspezifischen Regeln — komplett im Browser, ohne Upload. Findet sich kein Rechnungs-XML im PDF, ist das Ergebnis BH-PDF-01 — das häufigste Symptom eines Erzeugungswegs, der das Einbetten schlicht vergessen hat. Ist das PDF verschlüsselt, wird das nicht als diffuser Parse-Fehler, sondern explizit als BH-PDF-02 gemeldet. Sinnvoll ist der Test mit echten Grenzfällen: Rechnung mit Rabatt, Gutschrift, Rechnung mit mehreren Steuersätzen — dort zeigen sich Mapping-Fehler, die das Standardbeispiel nicht triggert.
Ein Punkt ist keine Stilfrage, sondern Pflicht: Sichtbares PDF und eingebettetes XML müssen dieselbe Rechnung beschreiben. Rechtlich maßgeblich ist der strukturierte Teil — weicht das Sichtbild ab, gilt das XML. Divergenzen entstehen fast immer dann, wenn PDF und XML aus getrennten Codepfaden erzeugt werden: Das PDF rundet anders, das XML kennt den Rabatt nicht, eine Position fehlt. Die robuste Architektur rendert beide Repräsentationen aus derselben Datenquelle — ein Rechnungsmodell, zwei Ausgaben. Wer das von Anfang an so baut, muss Konsistenz nie wieder manuell prüfen.
Der Billhorse-Validator prüft XRechnung, ZUGFeRD und Factur-X direkt im Browser — Ihre Datei wird nicht hochgeladen.
Zum Validator← Alle Guides · Stand: 2026-07-04