Generación de informes PDF en TypeScript con la biblioteca PDF-Lib
En el desarrollo web moderno, a menudo surge la necesidad de crear documentos PDF complejos: informes, facturas, certificados o paneles analíticos. TypeScript, gracias a su tipado estricto, hace que este proceso sea confiable y predecible. Entre las muchas bibliotecas para trabajar con PDF en la plataforma Node.js y en el navegador, destaca PDF-Lib, una herramienta ligera, potente y completamente escrita en TypeScript.
PDF-Lib no requiere la instalación de dependencias nativas adicionales (a diferencia de soluciones pesadas como Puppeteer o wkhtmltopdf), funciona tanto en Node.js como en el navegador, y admite todas las capacidades modernas de PDF: incrustación de fuentes, imágenes, creación de formularios, anotaciones y mucho más.
Instalación y primer documento
Para empezar, basta con instalar el paquete a través de npm:
npm install pdf-libCreemos un documento PDF simple con texto:
import { PDFDocument, StandardFonts, rgb } from 'pdf-lib';
async function createSimplePdf() { // Creamos un nuevo documento PDF const pdfDoc = await PDFDocument.create();
// Agregamos una página (formato A4) const page = pdfDoc.addPage([595.28, 841.89]); // A4 en puntos
// Incrustamos una fuente estándar const font = await pdfDoc.embedFont(StandardFonts.Helvetica);
// Dibujamos texto page.drawText('¡Hola, mundo!', { x: 50, y: 700, size: 30, font: font, color: rgb(0.2, 0.4, 0.8), });
// Guardamos el documento en bytes const pdfBytes = await pdfDoc.save(); return pdfBytes;}
// Ejemplo de usocreateSimplePdf().then((bytes) => { // En Node.js se puede escribir en un archivo // require('fs').writeFileSync('hello.pdf', bytes); console.log('¡PDF creado! Tamaño:', bytes.length, 'bytes');});Trabajo con texto en ruso y fuentes personalizadas
Una de las tareas clave al generar informes en ruso es la visualización correcta del alfabeto cirílico. Las fuentes estándar de PDF (Helvetica, Times, Courier) no contienen glifos cirílicos. La solución es incrustar una fuente TrueType con soporte Unicode.
import { PDFDocument, rgb } from 'pdf-lib';import fontkit from '@pdf-lib/fontkit';import fs from 'fs';
async function createRussianPdf() { const pdfDoc = await PDFDocument.create();
// Registramos fontkit para trabajar con fuentes personalizadas pdfDoc.registerFontkit(fontkit);
// Cargamos una fuente con cirílico (por ejemplo, Roboto) const fontBytes = fs.readFileSync('Roboto-Regular.ttf'); const customFont = await pdfDoc.embedFont(fontBytes);
const page = pdfDoc.addPage([595.28, 841.89]);
page.drawText('Generación de informe en TypeScript', { x: 50, y: 750, size: 24, font: customFont, color: rgb(0, 0, 0), });
page.drawText('Fecha: 2024-01-15', { x: 50, y: 700, size: 14, font: customFont, color: rgb(0.3, 0.3, 0.3), });
return await pdfDoc.save();}Creación de tablas e informes estructurados
PDF-Lib no tiene un módulo incorporado para tablas, pero es fácil implementarlas manualmente dibujando líneas y posicionando texto. Para mayor comodidad, se puede crear una función auxiliar:
interface TableCell { text: string; width: number; height?: number; align?: 'left' | 'center' | 'right';}
async function drawTable( page: PDFPage, headers: TableCell[], rows: TableCell[][], startX: number, startY: number, font: PDFFont, fontSize: number = 12) { const cellPadding = 5; const rowHeight = fontSize + 2 * cellPadding; let currentY = startY;
// Dibujamos encabezados let currentX = startX; for (const header of headers) { page.drawRectangle({ x: currentX, y: currentY - rowHeight, width: header.width, height: rowHeight, color: rgb(0.9, 0.9, 0.9), También en la biblioteca
Programación reactiva en Go (Golang): bibliotecas, patrones y ejemplos
Envío de SMS en Go (Golang): API bibliotecas golang-sms
Envío de SMS en JavaScript (Node.js): API, bibliotecas y ejemplos de código
Envío de SMS en TypeScript: Bibliotecas API e Integración
Validación de datos en Go: revisión de bibliotecas y enfoques