Generación de informes PDF en JavaScript (Node.js): Guía completa
La creación de documentos PDF es una de las tareas más demandadas en el desarrollo web. Ya sea para exportar facturas, generar informes analíticos o crear certificados, no se puede prescindir de una herramienta fiable. En el ecosistema de Node.js existen varias bibliotecas potentes que permiten resolver esta tarea de forma rápida y flexible. En este artículo, analizaremos tres enfoques principales y mostraremos cómo elegir la herramienta adecuada para su proyecto en PythonLib.
¿Por qué generar PDF en el servidor?
La generación del lado del cliente (navegador) suele ser limitada: el usuario puede perder datos al actualizar la página, y los dispositivos móviles no siempre procesan correctamente diseños complejos. El enfoque del lado del servidor con Node.js brinda control total sobre la estructura del documento, protege la lógica comercial y permite integrar la generación en los pipelines de CI/CD.
Top 3 bibliotecas para trabajar con PDF en Node.js
1. PDFKit — trabajo de bajo nivel con contenido
PDFKit es la biblioteca más popular para crear PDF desde cero. No requiere la instalación de dependencias adicionales (como Chromium) y permite controlar cada píxel del documento.
- Ventajas: ligera (solo unos pocos megabytes), total libertad de maquetación, soporte para fuentes, imágenes y gráficos vectoriales.
- Desventajas: se necesita escribir mucho código para diseños complejos, no tiene ajuste automático de texto.
Ejemplo de creación de una factura simple:
const PDFDocument = require('pdfkit');const fs = require('fs');
const doc = new PDFDocument({ margin: 50 });
doc.pipe(fs.createWriteStream('invoice.pdf'));
// Títulodoc.fontSize(25).text('Factura Nº123', { align: 'center' });doc.moveDown();
// Tabladoc.fontSize(12).text('Producto: Consultoría', { continued: true }) .text('Precio: 5000 RUB', { align: 'right' });
doc.moveDown();doc.text('Total: 5000 RUB', { align: 'right' });
doc.end();2. Puppeteer — generación desde HTML/CSS
Puppeteer ejecuta un navegador headless Chromium y convierte una página HTML en PDF. Es la opción ideal si ya tiene plantillas en HTML con estilos CSS.
- Ventajas: maquetación sencilla mediante HTML, soporte de todas las propiedades CSS (flex, grid, @media print), posibilidad de añadir encabezados y pies de página.
- Desventajas: dependencia pesada (~300 MB de Chromium), inicio lento, no es adecuado para documentos simples.
Ejemplo de conversión de HTML a PDF:
const puppeteer = require('puppeteer');
async function generateReport() { const browser = await puppeteer.launch(); const page = await browser.newPage();
await page.setContent(`<h1 style="color: blue;">Informe de marzo 2025</h1> <p>Ingresos totales: <strong>1 200 000 RUB</strong></p>`);
await page.pdf({ path: 'report.pdf', format: 'A4', printBackground: true, margin: { top: '20px', bottom: '20px' } });
await browser.close();}
generateReport();3. jsPDF — herramienta universal (cliente + servidor)
jsPDF es una biblioteca que funciona tanto en el navegador como en Node.js. Proporciona métodos de alto nivel para crear tablas, gráficos e incluso incrustar fuentes.
- Ventajas: API simple, soporte integrado para tablas (a través de un plugin), peso reducido.
- Desventajas: en el servidor requiere configuración manual de fuentes (no todos los caracteres cirílicos están disponibles por defecto).
Ejemplo con tabla:
const { jsPDF } = require("jspdf");require("jspdf-autotable");
const doc = new jsPDF();
doc.text("Estadísticas de ventas", 14, 20);
doc.autoTable({ head: [['Mes', 'Ventas', 'Ganancias']], body: [ ['Enero', '100', '20 000'], También en la biblioteca
BenchmarkDotNet para C# (.NET): guía completa con ejemplos
Cliente Elasticsearch para Node.js: @elastic/elasticsearch
Criptografía en C++: guía completa de cifrado y hashing
Generador de códigos QR en Rust: creación e integración en aplicaciones web