Dokumente in Node.js konvertieren: Open-Source-Tools im Überblick
Die Konvertierung von Dokumenten ist eine häufige Anforderung in Node.js-Anwendungen, sei es beim Erzeugen von PDFs aus HTML, beim Erstellen von Rechnungen oder beim Exportieren von Berichten. Glücklicherweise bietet das Node.js-Ökosystem mehrere robuste Open-Source-Bibliotheken, die diese Aufgaben vereinfachen. Sehen wir uns einige der besten verfügbaren Optionen an, zusammen mit praktischen Beispielen, die Ihnen bei der Wahl des richtigen Werkzeugs für Ihr Projekt helfen.
Diese Beispiele rendern oder erzeugen PDFs; sie konvertieren keine beliebigen Word-, Tabellen- oder
PDF-Dateien in andere bearbeitbare Formate. Verwenden Sie für die Server-Beispiele Node.js 22.12
oder neuer und speichern Sie jedes Beispiel in einer eigenen Datei mit der Endung
.cjs. Das jsPDF-Beispiel läuft im Browser.
Beliebte Open-Source-Bibliotheken für die Dokumentkonvertierung
Hier sind einige weit verbreitete Bibliotheken:
- Puppeteer: Automatisierung von Headless Chrome für die HTML-zu-PDF-Konvertierung.
- PDFKit: Serverseitige PDF-Erzeugung mit umfangreichen Anpassungsmöglichkeiten.
- jsPDF: Clientseitige PDF-Erzeugung direkt im Browser.
- wkhtmltopdf: Archiviertes Kommandozeilenwerkzeug für HTML-zu-PDF-Legacy-Workflows.
Sehen wir uns jede dieser Bibliotheken genauer an.
HTML-zu-PDF-Konvertierung mit Puppeteer
Puppeteer ist eine leistungsstarke Node.js-Bibliothek mit einer High-Level-API zur Steuerung von Headless Chrome (oder Chromium) und eignet sich damit ideal für die Konvertierung von HTML-Seiten in PDFs. Es rendert Webseiten präzise, einschließlich CSS und JavaScript.
Anwendungsbeispiel
Installieren Sie Puppeteer; dabei wird auch ein kompatibler Chrome-Browser heruntergeladen:
npm install puppeteer@25
Rendern Sie ausschließlich URLs und HTML, die Sie selbst kontrollieren. Ein Produktionsdienst, der beliebige URLs annimmt, benötigt Netzwerkisolierung und eine Validierung der Anfragen, um Zugriffe auf interne Dienste zu verhindern.
const puppeteer = require('puppeteer')
async function htmlToPdf(url, outputPath) {
const browser = await puppeteer.launch()
try {
const page = await browser.newPage()
const response = await page.goto(url, { waitUntil: 'networkidle0' })
if (!response || !response.ok()) {
throw new Error(`Page load failed: ${response?.status() ?? 'no HTTP response'}`)
}
await page.pdf({ path: outputPath, format: 'A4' })
} finally {
await browser.close()
}
}
htmlToPdf('https://example.com', 'example.pdf').catch((error) => {
console.error(error.message)
process.exitCode = 1
})
Vor- und Nachteile
- Vorteile: Präzises Rendering, Unterstützung für modernes CSS und JavaScript, kommt mit Single Page Applications (SPAs) zurecht.
- Nachteile: Höherer Ressourcenverbrauch durch den Headless-Browser, kann langsamer sein als andere Methoden.
PDFs mit PDFKit erzeugen
PDFKit ist eine vielseitige Bibliothek, um PDFs serverseitig programmatisch zu erstellen. Sie ermöglicht eine feingranulare Kontrolle über Inhalt und Layout des PDFs.
Anwendungsbeispiel
npm install pdfkit@0.17
Warten Sie, bis der Ausgabestream abgeschlossen ist, damit Fehler beim Schreiben auf die Festplatte gemeldet werden, bevor Sie den Vorgang als erfolgreich betrachten:
const PDFDocument = require('pdfkit')
const fs = require('fs')
const { pipeline } = require('node:stream/promises')
async function createPdf(outputPath) {
const doc = new PDFDocument()
const writing = pipeline(doc, fs.createWriteStream(outputPath))
try {
doc.fontSize(25).text('Hello, PDFKit!', 100, 100)
doc.fontSize(12).text('This is a sample PDF generated using PDFKit.', 100, 150)
doc.end()
} catch (error) {
doc.destroy(error)
}
await writing
}
createPdf('output.pdf').catch((error) => {
console.error(error.message)
process.exitCode = 1
})
Vor- und Nachteile
- Vorteile: Sehr gut anpassbar, leichtgewichtig, gut geeignet, um PDFs von Grund auf zu erzeugen.
- Nachteile: Erfordert eine manuelle Layout-Verwaltung, kann bei aufwendigen Designs komplex werden.
Clientseitige PDF-Erzeugung mit jsPDF
jsPDF ermöglicht die PDF-Erzeugung direkt im Browser, häufig in Kombination mit html2canvas, das HTML-Inhalte erfasst und in ein Bild umwandelt, das anschließend in das PDF eingefügt wird.
Anwendungsbeispiel
<script src="https://cdn.jsdelivr.net/npm/jspdf@4.2.1/dist/jspdf.umd.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/html2canvas@1.4.1/dist/html2canvas.min.js"></script>
<div id="content">Hello, jsPDF!</div>
<button id="download">Download PDF</button>
<p id="status" role="status"></p>
<script>
async function generatePDF() {
const { jsPDF } = window.jspdf
const content = document.getElementById('content')
const canvas = await html2canvas(content)
const imgData = canvas.toDataURL('image/png')
const pdf = new jsPDF()
const width = pdf.internal.pageSize.getWidth() - 20
const height = pdf.internal.pageSize.getHeight() - 20
const scale = Math.min(width / canvas.width, height / canvas.height)
pdf.addImage(imgData, 'PNG', 10, 10, canvas.width * scale, canvas.height * scale)
pdf.save('download.pdf')
}
document.getElementById('download').addEventListener('click', async () => {
const status = document.getElementById('status')
status.textContent = ''
try {
await generatePDF()
} catch {
status.textContent = 'Unable to generate the PDF. Please try again.'
}
})
</script>
Damit wird ein Screenshot auf eine Seite eingepasst. Lange Inhalte werden dadurch kleiner, und das entstehende Bild enthält weder auswählbaren Text noch eine Dokumentstruktur für Screenreader. Verwenden Sie ein textbasiertes PDF-Layout, wenn Sie diese Funktionen benötigen; außerdem benötigt html2canvas Bildressourcen mit gleichem Ursprung (same-origin) oder aktiviertem CORS.
Vor- und Nachteile
- Vorteile: Keine serverseitige Verarbeitung erforderlich, einfache Integration, geeignet für clientseitige Anwendungen.
- Nachteile: Eingeschränkte Kontrolle über Styling und Layout im Vergleich zu serverseitigen Lösungen; das Rendering kann aufgrund der Grenzen von html2canvas leicht vom ursprünglichen HTML abweichen.
Fortgeschrittene Konvertierung mit wkhtmltopdf
wkhtmltopdf konvertiert HTML mithilfe einer alten Qt-WebKit-Engine in PDF. Sein Repository wurde im Januar 2023 archiviert, und es wird nicht mehr gepflegt. Dieses Beispiel richtet sich an bestehende Installationen, die ausschließlich vertrauenswürdiges HTML verarbeiten. Die Sicherheitshinweise des Projekts warnen vor nicht vertrauenswürdigen Eingaben. Verwenden Sie für neue Anwendungen einen gepflegten Renderer wie Puppeteer.
Anwendungsbeispiel
const { execFile } = require('node:child_process')
execFile('wkhtmltopdf', ['https://example.com', 'output.pdf'], (error) => {
if (error) {
console.error(`Error: ${error.message}`)
process.exitCode = 1
return
}
console.log('PDF generated successfully')
})
Vor- und Nachteile
- Vorteile: Kann bestehende Batch-Workflows erhalten, die auf seiner älteren Rendering-Engine aufbauen.
- Nachteile: Erfordert eine externe Binärdatei, wird nicht mehr gepflegt und bietet keine moderne Browser-Kompatibilität; außerdem darf es kein nicht vertrauenswürdiges HTML verarbeiten.
Die richtige Bibliothek auswählen
Berücksichtigen Sie bei der Auswahl einer Bibliothek diese Faktoren:
- Komplexität: Puppeteer unterstützt moderne Layouts und dynamische Inhalte. Setzen Sie wkhtmltopdf nur für vertrauenswürdige Legacy-Workflows ein.
- Performance: PDFKit ist leichtgewichtig und schnell, wenn es darum geht, einfache PDFs von Grund auf zu erzeugen. Wenn Geschwindigkeit entscheidend ist und Ihre PDF-Struktur relativ einfach bleibt, ist PDFKit eine starke Option.
- Umgebung: jsPDF eignet sich ideal für clientseitige Anwendungen, in denen Sie PDFs direkt im Browser der Nutzer erzeugen möchten.
- Abhängigkeiten: wkhtmltopdf erfordert die Installation einer separaten Binärdatei, während die anderen reine Node.js-Bibliotheken sind (auch wenn Puppeteer eine eigene Chromium-/Chrome-Binärdatei verwaltet).
Bewerten Sie die konkreten Anforderungen Ihres Projekts, um die beste Lösung zu wählen. Wenn Sie beispielsweise Rechnungen mit einem einheitlichen Layout erzeugen möchten, kann PDFKit eine gute Wahl sein. Wenn Sie eine komplexe, JavaScript-lastige Webseite in ein PDF konvertieren müssen, ist Puppeteer besser geeignet.
Dokumentkonvertierung bei Transloadit
Wenn Sie eine verwaltete Lösung suchen: Der
Dienst für Dokumentenverarbeitung von Transloadit bietet robuste
Funktionen zur Dokumentkonvertierung mit dem Robot /document/convert. Sie können ihn
mit unserem node-sdk problemlos in Ihre Node.js-Anwendungen
integrieren.
