Geração de PDF em JavaScript (Node.js): bibliotecas e ferramentas
A geração de documentos PDF é uma das tarefas frequentes no desenvolvimento web. Faturas, relatórios, certificados, bilhetes — tudo isso é conveniente de criar no lado do servidor. No ecossistema Node.js, existem várias soluções maduras, cada uma adequada para cenários específicos. Neste artigo, vamos explorar três abordagens principais e bibliotecas populares para criar PDF em JavaScript.
Visão geral das bibliotecas populares
A escolha da ferramenta depende da complexidade do documento: relatórios de texto simples, tabelas com dados ou layouts complexos com HTML+CSS. Abaixo estão três bibliotecas principais.
1. PDFKit — trabalho de baixo nível com PDF
PDFKit é a biblioteca mais popular para criar PDF "do zero". Ela permite desenhar texto, linhas, retângulos, imagens, usando uma grade de coordenadas. É ideal para documentos dinâmicos com posicionamento preciso.
Vantagens do PDFKit:
- Controle total sobre cada elemento da página
- Não requer navegador ou Puppeteer
- Suporte para incorporação de fontes (TrueType, OpenType)
- Funciona de forma assíncrona com streams (Stream API)
Exemplo de documento simples:
const PDFDocument = require('pdfkit');const fs = require('fs');
const doc = new PDFDocument();doc.pipe(fs.createWriteStream('output.pdf'));
// Títulodoc.fontSize(25).text('Olá, PDFKit!', 100, 100);
// Texto normaldoc.fontSize(12).text('Este é um documento PDF simples criado em Node.js.', 100, 150);
// Desenhar uma linhadoc.moveTo(100, 200).lineTo(500, 200).stroke();
// Adicionar uma imagemdoc.image('logo.png', 100, 220, { width: 100 });
doc.end();2. Puppeteer — geração a partir de HTML/CSS
Puppeteer é uma biblioteca para controlar o navegador headless Chrome. Ela permite carregar uma página HTML (ou gerá-la dinamicamente) e salvá-la como PDF. É a melhor escolha se você já possui templates HTML ou estilos CSS complexos.
Vantagens do Puppeteer:
- Renderização precisa de CSS (flex, grid, fontes)
- Suporte para JavaScript na página (gráficos, tabelas)
- Possibilidade de definir formato, margens, cabeçalhos e rodapés
- Ideal para relatórios e faturas
Exemplo de geração de PDF a partir de HTML:
const puppeteer = require('puppeteer');
(async () => { const browser = await puppeteer.launch(); const page = await browser.newPage();
const html = `<!DOCTYPE html> <html> <head><style> body { font-family: Arial; padding: 20px; } h1 { color: #2c3e50; } table { border-collapse: collapse; width: 100%; } td, th { border: 1px solid #ccc; padding: 8px; } </style></head> <body> <h1>Relatório do mês</h1> <table> <tr><th>Produto</th><th>Quantidade</th></tr> <tr><td>Notebook</td><td>5</td></tr> <tr><td>Mouse</td><td>10</td></tr> </table> </body></html>`;
await page.setContent(html); await page.pdf({ path: 'report.pdf', format: 'A4', printBackground: true });
await browser.close(); console.log('PDF criado!');})();3. jsPDF — geração no cliente (e Node.js)
jsPDF foi originalmente criado para o navegador, mas possui uma versão para Node.js. É leve e adequado para documentos simples. No Node.js, é usado através do pacote jspdf com dependências adicionais.
Vantagens do jsPDF:
- Tamanho pequeno
- Suporte para Unicode e cirílico (através do carregamento de fontes)
- Pode funcionar tanto no cliente quanto no servidor
Também na biblioteca
nlohmann/json para C++: guia completo com exemplos
Análise de HTML em C++: Visão geral das bibliotecas Gumbo, MyHTML e htmlcxx
Juniper: Biblioteca GraphQL Elegante em Rust para Aplicações Web Modernas
CoreML para Swift: guia completo com exemplos práticos
Biblioteca Padrão C++: visão geral completa dos recursos