Geração de relatórios PDF em JavaScript (Node.js): Guia completo
Criar documentos PDF é uma das tarefas mais requisitadas no desenvolvimento web. Seja para exportar faturas, gerar relatórios analíticos ou criar certificados — não há como evitar uma ferramenta confiável. No ecossistema Node.js, existem várias bibliotecas poderosas que permitem resolver essa tarefa de forma rápida e flexível. Neste artigo, vamos analisar três abordagens principais e mostrar como escolher a ferramenta adequada para o seu projeto no PythonLib.
Por que gerar PDF no servidor?
A geração no lado do cliente (navegador) é frequentemente limitada: o usuário pode perder dados ao atualizar a página, e dispositivos móveis nem sempre processam layouts complexos corretamente. A abordagem no servidor com Node.js oferece controle total sobre a estrutura do documento, protege a lógica de negócios e permite integrar a geração em pipelines de CI/CD.
Top 3 bibliotecas para trabalhar com PDF em Node.js
1. PDFKit — trabalho de baixo nível com conteúdo
PDFKit é a biblioteca mais popular para criar PDF do zero. Ela não requer a instalação de dependências adicionais (como Chromium) e permite controlar cada pixel do documento.
- Prós: leve (apenas alguns megabytes), total liberdade de layout, suporte a fontes, imagens, gráficos vetoriais.
- Contras: é necessário escrever muito código para layouts complexos, não há quebra de texto automática.
Exemplo de criação de uma fatura simples:
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('Fatura nº123', { align: 'center' });doc.moveDown();
// Tabeladoc.fontSize(12).text('Produto: Consultoria', { continued: true }) .text('Preço: 5000 RUB', { align: 'right' });
doc.moveDown();doc.text('Total: 5000 RUB', { align: 'right' });
doc.end();2. Puppeteer — geração a partir de HTML/CSS
Puppeteer executa um navegador headless Chromium e converte uma página HTML em PDF. É a escolha ideal se você já possui templates em HTML com estilos CSS.
- Prós: layout simples via HTML, suporte a todas as propriedades CSS (flex, grid, @media print), possibilidade de adicionar cabeçalhos e rodapés.
- Contras: dependência pesada (~300 MB Chromium), inicialização lenta, não é adequado para documentos simples.
Exemplo de conversão de HTML para 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;">Relatório de março de 2025</h1> <p>Receita total: <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 — ferramenta universal (cliente + servidor)
jsPDF é uma biblioteca que funciona tanto no navegador quanto no Node.js. Ela fornece métodos de alto nível para criar tabelas, gráficos e até incorporar fontes.
- Prós: API simples, suporte integrado a tabelas (através de plugin), peso pequeno.
- Contras: no servidor, requer configuração manual de fontes (nem todos os caracteres cirílicos estão disponíveis por padrão).
Exemplo com tabela:
const { jsPDF } = require("jspdf");require("jspdf-autotable");
const doc = new jsPDF();
doc.text("Estatísticas de vendas", 14, 20);
doc.autoTable({ head: [['Mês', 'Vendas', 'Lucro']], body: [ ['Janeiro', '100', '20 000'],