Generación de informes PDF en JavaScript (Node.js): Puppeteer, PDFKit, jsPDF

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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.',

Recommendations