Geração de relatórios PDF em JavaScript (Node.js): Puppeteer, PDFKit, jsPDF
Criar documentos PDF é uma das tarefas mais comuns no desenvolvimento web. Relatórios, faturas, certificados, documentação — tudo isso requer uma ferramenta confiável para gerar arquivos no lado do servidor. No ecossistema Node.js, existem várias bibliotecas poderosas, cada uma resolvendo a tarefa de sua própria maneira. Neste artigo, vamos analisar três abordagens principais: emulação de navegador via Puppeteer, trabalho de baixo nível com PDF via PDFKit e a solução cliente-servidor jsPDF.
1. Puppeteer — geração de PDF a partir de HTML/CSS
Puppeteer é uma biblioteca para controlar o navegador headless Chromium. Ela permite carregar qualquer página HTML, aplicar estilos e "fotografá-la" em PDF. Esta é a escolha ideal se você já tem a estrutura dos relatórios em HTML/CSS e deseja uma transferência precisa para o PDF.
Principais recursos:
- Suporte a todas as propriedades CSS (Flexbox, Grid, fontes, sombras).
- Trabalho com JavaScript na página (gráficos Chart.js, tabelas dinâmicas).
- Configuração de formato, margens, cabeçalhos/rodapés, fundos.
- Suporte a fontes personalizadas (TTF, OTF).
Exemplo de geração de relatório:
const puppeteer = require('puppeteer');
async function generateReport() { const browser = await puppeteer.launch(); const page = await browser.newPage();
// Carregamos o HTML diretamente (ou 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>Relatório de Vendas</h1> <div class="data"> <p>Receita: 1 200 000 руб.</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 criado!');}
generateReport();Vantagens: precisão da estrutura, suporte a layouts complexos, trabalho com gráficos.
Desvantagens: alto consumo de memória (Chromium pesa ~200 MB), inicialização lenta.
2. PDFKit — criação de PDF de baixo nível
PDFKit é uma biblioteca para manipulação direta da estrutura do PDF. Você não usa HTML, mas constrói o documento programaticamente: desenha linhas, adiciona texto, insere imagens. Isso dá controle total sobre cada pixel do documento.
Principais recursos:
- Gráficos vetoriais (linhas, retângulos, curvas).
- Suporte a Unicode e incorporação de fontes.
- Criação de tabelas, numeração de páginas.
- Trabalho com anotações e links.
Exemplo de criação de uma fatura simples:
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('Fatura nº 12345', { align: 'center' });doc.moveDown();
// Tabela (manualmente)doc.fontSize(12).text('Descrição', 50, 150);doc.text('Qtd', 350, 150);doc.text('Preço', 450, 150);
doc.moveTo(50, 170).lineTo(550, 170).stroke();
doc.text('Serviços de desenvolvimento', 50, 180);doc.text('1', 350, 180);doc.text('150 000 руб.', 450, 180);
doc.moveDown(2);doc.fontSize(16).text('Total: 150 000 руб.',