Generación de PDF en JavaScript (Node.js): bibliotecas y herramientas
La generación de documentos PDF es una de las tareas frecuentes en el desarrollo web. Facturas, informes, certificados, billetes: todo esto es conveniente crearlo en el lado del servidor. En el ecosistema de Node.js existen varias soluciones maduras, cada una adecuada para escenarios específicos. En este artículo, revisaremos tres enfoques principales y bibliotecas populares para crear PDF en JavaScript.
Resumen de bibliotecas populares
La elección de la herramienta depende de la complejidad del documento: informes de texto simples, tablas con datos o diseños complejos con HTML+CSS. A continuación se presentan tres bibliotecas clave.
1. PDFKit — trabajo de bajo nivel con PDF
PDFKit es la biblioteca más popular para crear PDF «desde cero». Permite dibujar texto, líneas, rectángulos, imágenes utilizando una cuadrícula de coordenadas. Es ideal para documentos dinámicos con posicionamiento preciso.
Ventajas de PDFKit:
- Control total sobre cada elemento de la página
- No requiere navegador ni Puppeteer
- Soporte para incrustar fuentes (TrueType, OpenType)
- Funciona de forma asíncrona con flujos (Stream API)
Ejemplo de un documento simple:
const PDFDocument = require('pdfkit');const fs = require('fs');
const doc = new PDFDocument();doc.pipe(fs.createWriteStream('output.pdf'));
// Títulodoc.fontSize(25).text('¡Hola, PDFKit!', 100, 100);
// Texto normaldoc.fontSize(12).text('Este es un documento PDF simple creado en Node.js.', 100, 150);
// Dibujamos una líneadoc.moveTo(100, 200).lineTo(500, 200).stroke();
// Añadimos una imagendoc.image('logo.png', 100, 220, { width: 100 });
doc.end();2. Puppeteer — generación desde HTML/CSS
Puppeteer es una biblioteca para controlar el navegador Chrome sin interfaz gráfica (headless). Permite cargar una página HTML (o generarla sobre la marcha) y guardarla como PDF. Es la mejor opción si ya tienes plantillas HTML o estilos CSS complejos.
Ventajas de Puppeteer:
- Representación precisa de CSS (flex, grid, fuentes)
- Soporte de JavaScript en la página (gráficos, tablas)
- Posibilidad de definir formato, márgenes, encabezados y pies de página
- Ideal para informes y facturas
Ejemplo de generación de PDF desde HTML:
const puppeteer = require('puppeteer');
(async () => { const browser = await puppeteer.launch(); const page = await browser.newPage();
const html = `<!DOCTYPE html> <html> <head><style> body { font-family: Arial; padding: 20px; } h1 { color: #2c3e50; } table { border-collapse: collapse; width: 100%; } td, th { border: 1px solid #ccc; padding: 8px; } </style></head> <body> <h1>Informe mensual</h1> <table> <tr><th>Producto</th><th>Cantidad</th></tr> <tr><td>Portátil</td><td>5</td></tr> <tr><td>Ratón</td><td>10</td></tr> </table> </body></html>`;
await page.setContent(html); await page.pdf({ path: 'report.pdf', format: 'A4', printBackground: true });
await browser.close(); console.log('¡PDF creado!');})();3. jsPDF — generación en el cliente (y Node.js)
jsPDF fue creado originalmente para el navegador, pero tiene una versión para Node.js. Es ligero y muy adecuado para documentos simples. En Node.js se utiliza a través del paquete jspdf con dependencias adicionales.
Ventajas de jsPDF:
- Tamaño pequeño
- Soporte para Unicode y cirílico (mediante carga de fuentes)
- Puede funcionar tanto en el cliente como en
También en la biblioteca
Planificador de tareas PHP: guía completa sobre tareas cron y Task Scheduler
CLI Framework para Rust: guía completa para el desarrollo de utilidades
Parseo de HTML en Go: revisión de bibliotecas y ejemplos de código
Métricas de Prometheus en Swift: integración para aplicaciones iOS/macOS