> /beleg/rechnung/
Rechnung als PDF mit pdf-lib
- Eine Seite ist
doc.addPage([SEITE.b, SEITE.h])mit 595,28 × 841,89 Punkten: A4, 1 Punkt = 1/72 Zoll. - Der Ursprung liegt unten links. Der Code plant von oben und rechnet jede Zeile mit
Y = SEITE.h - obenum. - Summen und Steuer rechnet der Code in ganzen Cent: Eingaben werden als Ziffernfolge gelesen (BigInt). Erst für den Text im GiroCode wird daraus ein Euro-Betrag mit zwei Nachkommastellen.
- Der GiroCode ist kein Bild, sondern ein Pfad aus Rechtecken (PDF-Befehl
re), einmal gefüllt (f). In jeder Größe scharf. - Schrift: Helvetica, eine der Standardschriften von PDF. Keine Schriftdatei, nichts aus dem Netz.
Code ansehen: lib/beleg.js
lib/beleg.js · baueBelegPdf() · gekürzt, sonst wörtlich
const doc = await PDFDocument.create();
const fonts = { n: await doc.embedFont(StandardFonts.Helvetica), b: await doc.embedFont(StandardFonts.HelveticaBold) };
…
const page = doc.addPage([SEITE.b, SEITE.h]);
const Y = (oben) => SEITE.h - oben;
…
if (o.t === 'text') page.drawText(o.s, { x: o.x, y: Y(o.y), size: o.size, font: fonts[o.fett ? 'b' : 'n'], color: farbe(o.farbe) });
…
else if (o.t === 'qr') {
// Vektor-Rechtecke: ein Pfad, eine Füllung. Kein Bild, in jeder Größe scharf, keine Nähte zwischen den Modulen.
const n = o.matrix.length;
const m = o.groesse / n;
const ops = [pushGraphicsState(), setFillingRgbColor(0, 0, 0)];
for (const l of qrLaeufe(o.matrix)) ops.push(rectangle(o.x + l.c * m, Y(o.y + (l.r + 1) * m), l.len * m, m));
ops.push(fill(), popGraphicsState());
page.pushOperators(...ops);
}
…
const bytes = await doc.save({ useObjectStreams: false });
Auf Wunsch schreibt dasselbe Werkzeug die E-Rechnung als XRechnung (CII-XML), ebenfalls im Tab.