Geração de PDF em JavaScript (Node.js): guia completo de bibliotecas e ferramentas
A geração de documentos PDF é uma das tarefas mais requisitadas no desenvolvimento web. Desde a criação de faturas e relatórios até a formação de documentos complexos de várias páginas, o Node.js oferece ferramentas poderosas para trabalhar com PDF. Neste artigo, vamos explorar as principais bibliotecas e abordagens para criar arquivos PDF no lado do servidor com JavaScript.
Por que gerar PDF no servidor?
A geração de PDF no servidor permite:
- Criar documentos dinamicamente com base em dados do banco
- Garantir consistência na formatação
- Trabalhar com grandes volumes de dados sem sobrecarregar o cliente
- Integrar-se com sistemas de relatórios existentes
Principais bibliotecas para geração de PDF em Node.js
1. pdfkit — solução clássica
pdfkit é uma das bibliotecas mais populares para criar PDF do zero. Ela oferece controle total sobre o conteúdo do documento: texto, imagens, tabelas, gráficos vetoriais.
const PDFDocument = require('pdfkit');const fs = require('fs');
const doc = new PDFDocument();doc.pipe(fs.createWriteStream('output.pdf'));
// Adicionando textodoc.fontSize(25).text('Olá, mundo!', 100, 100);
// Desenhando uma linhadoc.moveTo(100, 150).lineTo(400, 150).stroke();
// Inserindo imagemdoc.image('logo.png', 100, 200, { width: 100 });
doc.end();Vantagens: leve, rápido, suporta Unicode e cirílico, várias fontes.
Desvantagens: requer configuração manual do layout, sem suporte nativo a HTML.
2. Puppeteer — geração a partir de HTML
Puppeteer é uma biblioteca para controlar o navegador Chrome headless. Ela permite converter páginas HTML em PDF mantendo todos os estilos e scripts.
const puppeteer = require('puppeteer');
async function generatePDF() { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.setContent('<h1 style="color: red;">Título do PDF</h1><p>Texto do documento</p>'); await page.pdf({ path: 'output.pdf', format: 'A4', margin: { top: '20px', bottom: '20px' } }); await browser.close();}
generatePDF();Vantagens: ideal para layouts HTML complexos, suporta CSS, JavaScript, fontes.
Desvantagens: pesado (requer Chromium), mais lento que outras bibliotecas.
3. pdf-lib — modificação de PDFs existentes
pdf-lib é especializada em editar documentos PDF existentes. Permite adicionar texto, imagens, preencher formulários.
const { PDFDocument } = require('pdf-lib');const fs = require('fs');
async function editPDF() { const existingPdfBytes = fs.readFileSync('template.pdf'); const pdfDoc = await PDFDocument.load(existingPdfBytes); const pages = pdfDoc.getPages(); const firstPage = pages[0]; firstPage.drawText('Novo texto', { x: 50, y: 50, size: 20, color: rgb(0, 0, 0) }); const pdfBytes = await pdfDoc.save(); fs.writeFileSync('modified.pdf', pdfBytes);}
editPDF();Vantagens: leve, sem dependências externas, funciona bem com formulários.
Desvantagens: recursos limitados para criar layouts complexos do zero.
4. jsPDF — solução cliente-servidor
jsPDF foi originalmente criada para o navegador, mas também funciona em Node.js. Adequada para documentos simples.
const { jsPDF } = require("jspdf");
const doc = new jsPDF();doc.text("Hello world!", 10, 10);doc.save("output.pdf");Vantagens: API simples, funciona no cliente e no servidor.
Desvantagens:
Também na biblioteca
Agendador de tarefas em TypeScript: guia completo sobre bibliotecas cron e temporizadores
Processamento de Imagens em Kotlin: redimensionar e cortar com a biblioteca ImageMagick
PyNaCl: Biblioteca de Criptografia para Python