Zum Inhalt springen

ZUGFeRD-/Factur-X-Konformität: das eingebettete EN 16931-Rechnungsprofil

Abgrenzungshinweis. NextPDF erzeugt das eingebettete XML-Profil; über die steuerliche und rechtliche Gültigkeit entscheidet die empfangende Behörde, nicht die Bibliothek.

ZUGFeRD / Factur-X ist eine hybride Rechnung: ein menschenlesbares PDF (ein PDF/A-3-Archivsubstrat) mit einer eingebetteten, maschinenlesbaren Cross-Industry-Invoice-XML (CII), die dem semantischen Datenmodell von EN 16931 folgt. NextPDF Core liefert den Embedder-Vertrag (NextPDF\Contracts\EInvoice); die konkrete Factur-X 1.08-Engine wird im Premium-Paket nextpdf/pro ausgeliefert. Die Bibliothek erzeugt das eingebettete XML und die PDF/A-3-Anhangsstruktur; über die steuerliche Gültigkeit entscheidet ein EN 16931 / Schematron-Validator – oder die empfangende Steuerbehörde.

Terminal-Fenster
composer require nextpdf/core:^3 # EInvoice contracts only
composer require nextpdf/pro # Factur-X 1.08 embedder engine

Core liefert EmbedderInterface, ProfileInterface, ProfileType, ValidatorInterface und ValidationResult in NextPDF\Contracts\EInvoice. Der Docblock des Interfaces sagt es ausdrücklich: Die Pro-Stufe (Factur-X 1.08-Byte-Rewrite-Engine) und die Enterprise-Stufe (PDF/A-managed-Builder) implementieren diesen Vertrag. Core allein bettet keine Rechnung ein – es definiert den byte-in/byte-out-Vertrag, den die Stufen erfüllen.

NextPDF\Contracts\EInvoice\ProfileType ist der EN 16931-Konformitätsdiskriminator: MINIMUM, BASIC_WL, BASIC, EN16931, EXTENDED, XRECHNUNG. Die Methode isEn16931Conformant() kodiert die Regel direkt aus EN 16931-1. MINIMUM und BASIC_WL sind nicht EN 16931-konform (sie erfüllen weder die Kardinalität des BT-24-Spezifikationskennzeichens noch die Anforderung an Rechnungspositionen). BASIC, EN16931, EXTENDED, XRECHNUNG sind EN 16931-konform.

Der Embedder (EmbedderInterface) ist vertraglich verpflichtet:

  • das gelieferte CII-XML über XmlGuard zu parsen (XXE-sicher);
  • das Factur-X-XMP-Erweiterungsschema für das deklarierte Profil zu injizieren;
  • das XML als eingebettete Datei mit der korrekten AFRelationship (Data / Alternative) anzuhängen, sodass es vom PDF/A-3-Archivsubstrat (§6.7.5 Anforderungen an eingebettete Dateien – F/UF-Schlüssel) getragen wird.

NextPDF gibt diese Struktur aus. Es behauptet nicht, dass die Rechnung steuerlich gültig ist; diese Feststellung obliegt der empfangenden Behörde anhand der Geschäftsregeln aus EN 16931 §7 und etwaiger nationaler CIUS.

SymbolWirkung
Contracts\EInvoice\EmbedderInterfaceByte-in/byte-out-Vertrag; Pro/Enterprise implementieren ihn.
Contracts\EInvoice\ProfileType (Enum)EN 16931-Profildiskriminator.
ProfileType::isEn16931Conformant(): boolFalse für MINIMUM/BASIC_WL; true für BASIC/EN16931/EXTENDED/XRECHNUNG.
Contracts\EInvoice\ValidatorInterfaceValidierungsvertrag, der ein ValidationResult der Regelverletzungen zurückgibt.
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Contracts\EInvoice\ProfileType;
// Core: choose and check the profile before delegating embedding to Pro.
$profile = ProfileType::EN16931;
if (!$profile->isEn16931Conformant()) {
fwrite(STDERR, "Profile {$profile->value} is not EN 16931 conformant.\n");
exit(1);
}
// The concrete embedder is provided by nextpdf/pro:
// $embedder = /* the Factur-X embedder from nextpdf/pro; see the Premium docs */;
// $pdfWithInvoice = $embedder->embed($basePdfBytes, $ciiXml, $options);
echo "Profile {$profile->value} selected (embedding requires nextpdf/pro).\n";

Die Produktions-Pipeline (Pro-Stufe) bettet das CII-XML in eine PDF/A-3-Basis ein. Anschließend führt sie einen EN 16931-Schematron-Validator aus (oder übermittelt an die empfangende Behörde). Diesen Bericht behandelt sie als Gate. NextPDF gibt das eingebettete XML und den PDF/A-3-Anhang aus; über die steuerliche Gültigkeit entscheidet der Validator bzw. die Behörde. Core allein kann diese Pipeline nicht ausführen – nextpdf/pro wird für die Embedder-Engine benötigt.

  • Core hat nur Verträge. Ohne nextpdf/pro gibt es keinen konkreten Embedder. Aufrufender Code muss sich auf das Interface stützen und kontrolliert degradieren, wenn die Pro-Implementierung fehlt.
  • MINIMUM / BASIC_WL sind nicht EN 16931. isEn16931Conformant() liefert für diese Profile false; werben Sie nicht mit einer EN 16931-Rechnung, wenn Sie sie verwenden.
  • PDF/A-3-Substrat. Das eingebettete XML liegt in einem PDF/A-3-Archivcontainer vor; die F/UF-Schlüssel der eingebetteten Datei (PDF/A §6.7.5) müssen vorhanden sein.
  • XML wird XXE-sicher geparst. Der Vertrag verlangt das Parsen über XmlGuard; ein eigener Embedder darf keine XXE-Senke einführen.
  • Über die Gültigkeit urteilt nicht die Bibliothek. Eine strukturell korrekte Factur-X-Datei zu erzeugen ist keine Aussage darüber, dass die Steuerbehörde sie akzeptiert.

Das Einbetten schreibt das PDF neu, um den XML-Anhang und das XMP-Erweiterungsschema hinzuzufügen. Planen Sie für eine typische Rechnung Wall-Zeit ≤ 1500 ms und Peak ≤ 128 MB ein.

Das eingebettete XML wird XXE-sicher über XmlGuard geparst. Das Rechnungs-XML enthält von Natur aus kommerzielle PII (Parteien, Beträge) – es ist eingebettet, nicht verschlüsselt. Die Vertraulichkeit der Rechnung liegt in der Verantwortung des Integrators.

Das Rechnungs-XML enthält PII zu Parteien und Finanzen. Das Einbetten läuft im Prozess; während des Einbettens verlassen keine Daten den Prozess. Die Übertragung an eine empfangende Behörde liegt außerhalb des Geltungsbereichs und fällt in die Verantwortung des Integrators für Datenresidenz.

Protokollieren Sie niemals das CII-XML oder die eingebetteten PDF-Bytes – sie enthalten Rechnungs-PII. Protokollieren Sie nur den Profilnamen und ein strukturelles Urteil.

Eine Factur-X-Datei ist nicht zugriffsgeschützt. Das eingebettete XML ist für jede Person lesbar, die Zugriff auf die Datei hat. Das Hybriddokument garantiert die Maschinenlesbarkeit der Rechnung, nicht ihre Vertraulichkeit oder ihre steuerliche Akzeptanz.

Das Einbetten führt keine Kryptografie durch. Eine signierte Factur-X-Rechnung ist ein eigenes Anliegen der Signatur-Recipe und übernimmt das FIPS-Verhalten dieser Recipe; diese Seite trifft keine Signaturaussage.

BehauptungSpezifikationKlauselreference_id
Eine EN 16931-Rechnung trägt die Geschäftsbegriffe des semantischen Datenmodells.EN 16931-1§6.4
Die EN 16931-Compliance bemisst sich an der Geschäftsregel-Kardinalität, die eine konforme Rechnung erfüllen muss.EN 16931-1§7
Das Factur-X EN 16931-Profil erfordert CII-XML-Geschäftsregelkonformität.Factur-X 1.08EN 16931-Profil
Das Factur-X EN 16931-Profil schreibt den erforderlichen Rechnungsinhalt vor.Factur-X 1.08EN 16931-Profil
Factur-X ist ein Hybrid: maschinenlesbares XML, eingebettet neben dem menschenlesbaren PDF.Factur-X 1.08Basic
Das eingebettete XML liegt in einem PDF/A-Archivsubstrat vor (F/UF-Schlüssel der eingebetteten Datei).ISO 19005-4§6.7.5

Zitate sind Zeiger aus Klausel-ID und reference_id in den Verifikationskorpus. Es wird kein Normtext reproduziert; Klauseln werden in den Worten von NextPDF zusammengefasst.