Generación de informes PDF en JavaScript (Node.js): Puppeteer, PDFKit, jsPDF
La creación de documentos PDF es una de las tareas más comunes en el desarrollo web. Informes, facturas, certificados, documentación: todo esto requiere una herramienta confiable para generar archivos del lado del servidor. En el ecosistema de Node.js, existen varias bibliotecas potentes, cada una de las cuales resuelve la tarea a su manera. En este artículo, analizaremos tres enfoques principales: la emulación del navegador a través de Puppeteer, el trabajo de bajo nivel con PDF a través de PDFKit y la solución cliente-servidor jsPDF.
1. Puppeteer — generación de PDF desde HTML/CSS
Puppeteer es una biblioteca para controlar el navegador sin interfaz Chromium. Permite cargar cualquier página HTML, aplicar estilos y "fotografiarla" en PDF. Es la opción ideal si ya tienes el diseño de informes en HTML/CSS y deseas una transferencia precisa a PDF.
Funcionalidades principales:
- Soporte para todas las propiedades CSS (Flexbox, Grid, fuentes, sombras).
- Trabajo con JavaScript en la página (gráficos Chart.js, tablas dinámicas).
- Configuración de formato, márgenes, encabezados y pies de página, fondos.
- Soporte para fuentes personalizadas (TTF, OTF).
Ejemplo de generación de informe:
const puppeteer = require('puppeteer');
async function generateReport() { const browser = await puppeteer.launch(); const page = await browser.newPage();
// Cargamos HTML directamente (o por URL) await page.setContent(` <html> <head> <style> body { font-family: Arial; padding: 40px; } h1 { color: #2c3e50; } .data { background: #ecf0f1; padding: 20px; } </style> </head> <body> <h1>Informe de ventas</h1> <div class="data"> <p>Ingresos: 1 200 000 rublos.</p> <p>Número de pedidos: 345</p> </div> </body> </html> `, { waitUntil: 'networkidle0' });
await page.pdf({ path: 'report.pdf', format: 'A4', printBackground: true, margin: { top: '20mm', bottom: '20mm' } });
await browser.close(); console.log('¡PDF creado!');}
generateReport();Ventajas: precisión del diseño, soporte para maquetas complejas, trabajo con gráficos.
Desventajas: alto consumo de memoria (Chromium pesa ~200 MB), inicio lento.
2. PDFKit — creación de PDF de bajo nivel
PDFKit es una biblioteca para la manipulación directa de la estructura PDF. No usas HTML, sino que construyes el documento programáticamente: dibujas líneas, agregas texto, insertas imágenes. Esto te da control total sobre cada píxel del documento.
Funcionalidades principales:
- Gráficos vectoriales (líneas, rectángulos, curvas).
- Soporte para Unicode e incrustación de fuentes.
- Creación de tablas, numeración de páginas.
- Trabajo con anotaciones y enlaces.
Ejemplo de creación de una factura simple:
const PDFDocument = require('pdfkit');const fs = require('fs');
const doc = new PDFDocument({ size: 'A4', margin: 50 });doc.pipe(fs.createWriteStream('invoice.pdf'));
// Títulodoc.fontSize(24).text('Factura Nº 12345', { align: 'center' });doc.moveDown();
// Tabla (manualmente)doc.fontSize(12).text('Descripción', 50, 150);doc.text('Cantidad', 350, 150);doc.text('Precio', 450, 150);
doc.moveTo(50, 170).lineTo(550, 170).stroke();
doc.text('Servicios de desarrollo', 50, 180);doc.text('1', 350, 180);doc.text('150 000 rublos.', 450, 180);
doc.moveDown(2);doc.fontSize(16).text('Total: 150 000 rublos.', También en la biblioteca
Validación de datos en JavaScript (Node.js): Joi, Yup, Zod
JsonWebToken en JavaScript (Node.js): guía completa con ejemplos
Stripe para JavaScript (Node.js): guía completa con ejemplos
Generación de PDF en Java: revisión de las bibliotecas iText, Apache PDFBox, OpenPDF