Generación de PDF en JavaScript (Node.js): guía completa de bibliotecas y herramientas
La generación de documentos PDF es una de las tareas más demandadas en el desarrollo web. Desde la creación de facturas e informes hasta la elaboración de documentos complejos de varias páginas, Node.js ofrece potentes herramientas para trabajar con PDF. En este artículo, exploraremos las principales bibliotecas y enfoques para crear archivos PDF en el lado del servidor con JavaScript.
¿Por qué generar PDF en el servidor?
La generación de PDF en el servidor permite:
- Crear documentos dinámicamente basados en datos de la base de datos
- Garantizar la consistencia del formato
- Trabajar con grandes volúmenes de datos sin sobrecargar el cliente
- Integrarse con sistemas de informes existentes
Principales bibliotecas para generar PDF en Node.js
1. pdfkit — solución clásica
pdfkit es una de las bibliotecas más populares para crear PDF desde cero. Proporciona control total sobre el contenido del documento: texto, imágenes, tablas, gráficos vectoriales.
const PDFDocument = require('pdfkit');const fs = require('fs');
const doc = new PDFDocument();doc.pipe(fs.createWriteStream('output.pdf'));
// Añadimos textodoc.fontSize(25).text('¡Hola, mundo!', 100, 100);
// Dibujamos una líneadoc.moveTo(100, 150).lineTo(400, 150).stroke();
// Insertamos una imagendoc.image('logo.png', 100, 200, { width: 100 });
doc.end();Ventajas: ligero, rápido, compatible con Unicode y cirílico, múltiples fuentes.
Desventajas: requiere configuración manual del diseño, no tiene soporte integrado para HTML.
2. Puppeteer — generación desde HTML
Puppeteer es una biblioteca para controlar el navegador Chrome sin interfaz gráfica (headless). Permite convertir páginas HTML a PDF conservando todos los estilos y scripts.
const puppeteer = require('puppeteer');
async function generatePDF() { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.setContent('<h1 style="color: red;">Título del PDF</h1><p>Texto del documento</p>'); await page.pdf({ path: 'output.pdf', format: 'A4', margin: { top: '20px', bottom: '20px' } }); await browser.close();}
generatePDF();Ventajas: ideal para diseños HTML complejos, compatible con CSS, JavaScript y fuentes.
Desventajas: pesado (requiere Chromium), más lento que otras bibliotecas.
3. pdf-lib — modificación de PDF existentes
pdf-lib se especializa en la edición de documentos PDF existentes. Permite añadir texto, imágenes y rellenar formularios.
const { PDFDocument } = require('pdf-lib');const fs = require('fs');
async function editPDF() { const existingPdfBytes = fs.readFileSync('template.pdf'); const pdfDoc = await PDFDocument.load(existingPdfBytes); const pages = pdfDoc.getPages(); const firstPage = pages[0]; firstPage.drawText('Texto nuevo', { x: 50, y: 50, size: 20, color: rgb(0, 0, 0) }); const pdfBytes = await pdfDoc.save(); fs.writeFileSync('modified.pdf', pdfBytes);}
editPDF();Ventajas: ligero, no requiere dependencias externas, funciona muy bien con formularios.
Desventajas: capacidades limitadas para crear diseños complejos desde cero.
4. jsPDF — solución cliente-servidor
jsPDF fue creada originalmente para el navegador, pero también funciona en Node.js. Es adecuada para documentos simples.
const { jsPDF } = require("jspdf");
const doc = new jsPDF();doc.text("Hello world!", 10, 10);doc.save("output.pdf");Ventajas: API simple, funciona en cliente y servidor.
Desventajas:
También en la biblioteca
Recommendations