Dokumentation
PDFs erstellen
PDFs in Vue
PDFs in Nuxt
PDFs in React
PDFs in Angular
Profile
Zwei kleine Entscheidungen, beide mit einer Voreinstellung, die Sie selten ändern: welches Profil
(profile: ZUGFeRD oder XRechnung) und welche XML-Syntax (CII oder UBL). Dieselbe Invoice
speist alle - Sie wählen nur.
ZUGFeRD oder XRechnung?
renderZugferd(invoice); // ZUGFeRD (en16931) - die Voreinstellung
renderZugferd(invoice, { profile: "xrechnung" }); // deutsches B2G
ZUGFeRD (en16931) ist die Voreinstellung und das, was die meisten Rechnungen brauchen: Standard
EN 16931, gültig im B2B in ganz Europa. Nichts einzustellen.
XRechnung (xrechnung) ist für Rechnungen an eine deutsche Behörde (B2G), dort ist sie Pflicht. Sie ist
EN 16931 plus strengere deutsche Regeln - ein paar Felder mehr sind verpflichtend:
- die Leitweg-ID in
buyerReference(die bekommen Sie von der Behörde), - eine elektronische Adresse (
electronicAddress) beisellerundbuyer, - ein vollständiger Kontakt des Verkäufers (
seller.contactmitname,phone,email) sowiecityundpostCode, - ein Fälligkeitsdatum (
dueDate) oder Zahlungsbedingungen (payment.terms), und eine IBAN (payment.iban) für eine Überweisung.
Das Beruhigende daran: Sie müssen sich diese Liste nicht merken. Wählen Sie das Profil, und die Bibliothek prüft vorab - mit einem klaren Fehler, der das Feld nennt, falls etwas fehlt. Lange bevor ein Portal die Rechnung ablehnt.
// Leitweg-ID vergessen? Sie erfahren genau das, mit dem Feld, das Sie setzen müssen:
// Error: Invoice is not XRechnung-ready:
// - XRechnung needs the Leitweg-ID - set invoice.buyerReference (BT-10).
await renderZugferd(invoice, { profile: "xrechnung" });
Die zusätzlichen Felder einer vollständigen XRechnung an einer Stelle:
const invoice: Invoice = {
// ... die üblichen Felder ...
buyerReference: "04011000-12345-34", // Leitweg-ID (BT-10)
dueDate: "2026-07-05",
seller: {
name: "Northwind GmbH",
vatId: "DE265013614",
electronicAddress: "billing@northwind.de", // BT-34
contact: { name: "A. Schmidt", phone: "+49 30 123456", email: "billing@northwind.de" },
address: { line1: "Hauptstrasse 1", city: "Berlin", postCode: "10115", country: "DE" },
},
buyer: {
name: "Bundesamt fuer Beschaffung",
electronicAddress: "einkauf@behoerde.de", // BT-49
address: { city: "Bonn", postCode: "53113", country: "DE" },
},
payment: { iban: "DE89370400440532013000", terms: "Zahlbar innerhalb von 30 Tagen." },
// ... Positionen ...
};
Sie können die Prüfung auch selbst aufrufen, ohne zu rendern - etwa um ein Formular oder einen Speichern-Knopf freizugeben:
import { xrechnungProblems } from "@jasy/e-invoice";
const problems = xrechnungProblems(invoice); // string[] - leer heißt: alles bereit
CII oder UBL?
Die EN 16931 hat zwei gleichwertige XML-Syntaxen. Darüber müssen Sie fast nie nachdenken.
CII (Cross Industry Invoice) ist der Standard von ZUGFeRD und Factur-X, und genau das bettet
renderZugferd ein und gibt es in .xml zurück. Das ist die Voreinstellung und das, was Sie wollen.
const { bytes, xml } = await renderZugferd(invoice); // xml ist das CII
Brauchen Sie das XML allein - etwa für ein Portal, das einen Datei-Upload will - oder ausdrücklich UBL (Universal Business Language, die andere Syntax der EN 16931, die manche Systeme bevorzugen)? Einmal berechnen, dann umwandeln:
import { computeInvoice, toCII, toUBL } from "@jasy/e-invoice";
const computed = computeInvoice(invoice);
const cii = toCII(invoice, computed); // dasselbe XML, das renderZugferd einbettet
const ubl = toUBL(invoice, computed, "xrechnung"); // UBL, XRechnung-CIUS
Beide nehmen das Profil an ("en16931" als Voreinstellung oder "xrechnung"), damit die Kennung der
Spezifikation im XML zu dem passt, was Sie einreichen.