MAISON CODE .
/ Backend · React · PDF · Serverless · Automation

Dynamische PDF-Generierung: Entwicklung des digitalen Papiers

So generieren Sie mit React und Node.js hochauflösende PDFs (Rechnungen, Tickets). Ein Vergleich von @react-pdf/renderer und Puppeteer in serverlosen Umgebungen.

AB
Alex B.
Dynamische PDF-Generierung: Entwicklung des digitalen Papiers

Die Welt läuft mit HTML, aber das Geschäft läuft mit PDF. Eine E-Commerce-Bestellung ist erst „echt“, wenn eine Rechnung vorliegt. Eine Konzertkarte ist erst dann „gültig“, wenn ein QR-Code auf einem PDF vorhanden ist. Das Generieren von PDFs war jahrelang die am meisten gehasste Aufgabe in der Backend-Entwicklung. Dabei handelte es sich um veraltete Tools wie „wkhtmltopdf“, XML-Vorlagen oder fragile Python-Skripte.

Bei Maison Code Paris bringen wir die PDF-Generierung in die Moderne. Wir verwenden für unsere Dokumente die gleiche Komponentenarchitektur (React) wie für unsere Benutzeroberflächen. Dies stellt sicher, dass die Markenkonsistenz absolut ist. Die Schriftart auf der Website ist die Schriftart auf der Rechnung.

Warum Maison Code dies bespricht

Bei Maison Code Paris fungieren wir als architektonisches Gewissen für unsere Kunden. Wir erben oft „moderne“ Stacks, die ohne grundlegendes Verständnis der Skalierung erstellt wurden. Wir sehen einfache APIs, deren Antwort aufgrund von N+1-Abfrageproblemen 4 Sekunden dauert, und „Microservices“, die 5.000 US-Dollar pro Monat an Cloud-Gebühren im Leerlauf kosten.

Wir diskutieren dieses Thema, weil es einen entscheidenden Dreh- und Angelpunkt für die technische Reife darstellt. Die richtige Implementierung unterscheidet einen fragilen MVP von einer robusten Plattform der Enterprise-Klasse, die den Black-Friday-Verkehr problemlos bewältigen kann.

Die Landschaft: So rendern Sie ein PDF

Heutzutage gibt es drei Hauptmethoden zum Generieren einer PDF-Datei, jede mit erheblichen Kompromissen.

AnsatzWerkzeugeVorteileNachteile
Browserlos (Headless Chrome)Puppenspieler, DramatikerPixelgenaue CSS-Unterstützung. Wenn Sie es in HTML erstellen können, können Sie es drucken.Langsam. Hohe Speicherauslastung. Erfordert den Start einer Browserinstanz (Chromium), was bei Serverless problematisch ist.
PDF-PrimitivePDFKit, jsPDFExtrem schnell. Keine Abhängigkeiten.Entwickler H*. Sie müssen Linien manuell zeichnen („doc.moveTo(100, 100).lineTo(200, 200)“). Die Pflege von Layouts ist ein Albtraum.
React-PDF / @react-pdf/rendererReagieren, FlexboxDer Heilige Gral. Schreiben Sie React-Komponenten und erhalten Sie ein PDF. Schnell genug.Nur CSS-Teilmenge (hauptsächlich Flexbox). Noch keine Grid-Unterstützung.

Bei Maison Code orientieren wir uns strikt an React-PDF.

Die Architektur: Warum React-PDF gewinnt

Der mentale Modellwechsel ist einfach: Ein PDF ist nur ein weiteres Renderziel. So wie „ReactDOM“ in das DOM und „ReactNative“ in iOS-/Android-Ansichten rendert, rendert „@react-pdf/renderer“ in die PDF-Spezifikation.

1. Code-Sharing

Sie können Ihre Design System-Token-Typen teilen. „Typoskript import { StyleSheet } aus ‘@react-pdf/renderer’; { theme } aus ’@/design-system/theme’ importieren;

const Styles = StyleSheet.create({ Kopfzeile: { FontFamily: theme.fonts.heading, // „Bodoni Moda“ Farbe: theme.colors.void, // #000000 Schriftgröße: 24, } }); „ Dies garantiert, dass Ihre Rechnung Pixel für Pixel mit Ihrer Checkout-Seite übereinstimmt.

2. Serverlose Kaltstarts

Das Ausführen von Puppeteer auf AWS Lambda ist ein ständiger Kampf gegen das 50-MB-Paketlimit und 10-Sekunden-Kaltstarts. React-PDF ist lediglich eine Node.js-Bibliothek. Es verlängert effektiv Ihren Kaltstart um 0 ms. Es kompiliert Zeichenfolgen in binäre Puffer. Es ist CPU-gebunden, nicht E/A-gebunden.

Implementierung: Die Komponente „Digitales Papier“.

Hier ist ein reales Beispiel einer Rechnungskomponente.

„tsx import { Document, Page, Text, View, StyleSheet, Font } from ‘@react-pdf/renderer’;

// Benutzerdefinierte Schriftarten registrieren (entscheidend für das Branding) Font.register({ Familie: ‘Bodoni Moda’, src: ‘https://cdn.maisoncode.paris/fonts/BodoniModa-Regular.ttf’ });

const Invoice = ({ order }) => ( <Seitengröße=“A4” style={styles.page}>

  {/* Kopfzeile */}
  <View style={styles.header}>
    <Text style={styles.brand}>MAISONCODE.</Text>
    <Text style={styles.invoiceId}>INV-{order.id}</Text>
  </Ansicht>

{/* Werbebuchungen */} {order.items.map(item => ( {item.name} x{item.quantity} €{item.price} ))}

  {/* Fußzeile */}
  <View style={styles.footer}>
     <Text>Vielen Dank für Ihr Geschäft. Bei diesem Dokument handelt es sich um ein digitales Original.</Text>
  </Ansicht>

</Seite>
); „

Der API-Endpunkt

Sie speichern Dateien nicht auf der Festplatte. Sie streamen sie direkt auf den Client oder S3.

„Typoskript // Next.js / Node.js API-Route import { renderToStream } from ‘@react-pdf/renderer’;

Asynchrone Funktion exportieren POST(req) { const stream = waiting renderToStream();

neue Antwort zurückgeben(stream, { Überschriften: { ‘Content-Type’: ‘application/pdf’, ‘Content-Disposition’: ‘attachment; Dateiname=“Rechnung.pdf”’ } }); } „

Leistung: Die 500-ms-Regel

Wenn im E-Commerce die Schaltfläche „Rechnung herunterladen“ fünf Sekunden lang rotiert, geht der Benutzer davon aus, dass die Website defekt ist. Das Starten, Navigieren und Drucken von Puppeteer dauert 3–8 Sekunden. React-PDF benötigt 200–600 ms, um eine komplexe Rechnung zu erstellen.

Dieser Geschwindigkeitsunterschied ermöglicht es Ihnen, PDFs synchron bei Bedarf zu generieren, anstatt sie in einem Hintergrundjob (Celery/SQS) in die Warteschlange zu stellen und sie später per E-Mail zu versenden. Ein bewegliches Teil weniger. Eine Warteschlange weniger zur Überwachung.

Fazit

Hören Sie auf, PDFs als Bürger zweiter Klasse zu behandeln. Durch die Einführung von React-PDF integrieren Sie die Dokumentschicht in Ihren Standard-Engineering-Workflow.

  • Versionskontrolle: Ihre Rechnungsvorlagen werden git-tracked.
  • Typsicherheit: Ihre PDF-Generierung schlägt beim Erstellen fehl, wenn Sie ein „Preis“-Feld verpassen.
  • Designkonsistenz: Ihre Marke bleibt hochwertig, auch auf dem Papier.

Im Luxussektor ist das Erlebnis nach dem Kauf genauso wichtig wie der Verkauf. Eine schöne, sofortige Rechnung ist der letzte Schliff einer Premium-Transaktion.


Beauftragen Sie unsere Architekten mit der Prüfung Ihrer Dokumentenerstellungspipeline.