Generación de informes PDF en JavaScript (Node.js): bibliotecas y ejemplos

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)



La creación de documentos PDF es una de las tareas más demandadas en el desarrollo web. Informes, facturas, certificados, documentación: todo esto requiere una herramienta confiable para la generación en el lado del servidor. En el ecosistema de Node.js existen varias bibliotecas potentes que permiten crear archivos PDF de forma flexible. En este artículo, analizaremos en detalle tres enfoques principales: PDFKit (programación directa), Puppeteer (renderizado de HTML) y jsPDF (opción ligera).



¿Por qué generar PDF en el servidor?

  • Contenido dinámico — datos de la base de datos, cálculos, gráficos.
  • Seguridad — control de acceso y versionado.
  • Automatización — envío masivo de informes programados.
  • Formato unificado — visualización correcta en todos los dispositivos.


1. PDFKit — control total sobre el documento

PDFKit es la biblioteca más popular para crear PDF «desde cero». No requiere navegador y funciona exclusivamente con objetos de JavaScript. Usted controla cada elemento: texto, imágenes, gráficos vectoriales, fuentes.



Instalación

npm install pdfkit


Ejemplo: informe simple con tabla

const PDFDocument = require('pdfkit');const fs = require('fs');

const doc = new PDFDocument();

doc.pipe(fs.createWriteStream('report.pdf'));

// Títulodoc.fontSize(24).text('Informe mensual', { align: 'center' });doc.moveDown();

// Subtítulodoc.fontSize(14).text('Período: Enero 2025', { align: 'center' });doc.moveDown(2);

// Tabla (simulación)doc.fontSize(12).font('Helvetica-Bold');doc.text('Producto', 50, 150);doc.text('Cantidad', 250, 150);doc.text('Precio', 400, 150);

doc.font('Helvetica');const data = [ { item: 'Portátiles', qty: 15, price: 75000 }, { item: 'Monitores', qty: 30, price: 25000 }, { item: 'Teclados', qty: 100, price: 1500 }];

let y = 170;data.forEach(row => { doc.text(row.item, 50, y); doc.text(String(row.qty), 250, y); doc.text(String(row.price), 400, y); y += 20;});

// Totaldoc.moveDown();doc.font('Helvetica-Bold');doc.text(`Total: ${data.reduce((sum, r) => sum + r.qty * r.price, 0)} rublos`, 50, y + 20);

doc.end();


Capacidades de PDFKit:

  • Gráficos vectoriales (líneas, rectángulos, círculos).
  • Incrustación de fuentes (TrueType, OpenType).
  • Soporte para Unicode y cirílico.
  • Creación de enlaces y anotaciones.


2. Puppeteer — renderizado de HTML a PDF

Si ya tiene una plantilla HTML del informe (por ejemplo, con Bootstrap), Puppeteer es la opción ideal. Ejecuta un navegador Chrome sin interfaz gráfica (headless) y convierte la página en PDF conservando todos los estilos, fuentes y animaciones JavaScript.



Instalación

npm install puppeteer


Ejemplo: conversión de plantilla HTML

const puppeteer = require('puppeteer');

async function generatePDF() { const browser = await puppeteer.launch(); const page = await browser.newPage();

// HTML con CSS const html = ` <!DOCTYPE html> <html> <head> <style> body { font-family: Arial; padding: 40px; } h1 { color: #2c3e50; } table { width: 100%; border-collapse: collapse; } th, td { border: 1px solid #ccc; padding: 8px; } </style> </head> <body> <h1>Informe de ventas</h1> <table> <tr><th>Mes</th><th>Monto</th></tr> <tr><td>Enero</td><td>450 000 rublos</td>

Recommendations