Geração de relatórios PDF em C++: visão geral das bibliotecas e exemplos práticos
No desenvolvimento de software moderno, surge frequentemente a necessidade de gerar documentos impressos, relatórios analíticos ou faturas. A linguagem C++ oferece ferramentas poderosas para trabalhar com PDF, no entanto, escolher a biblioteca adequada pode ser desafiador. Neste artigo, abordaremos três abordagens principais: trabalho de baixo nível diretamente com PDF (libharu), trabalho com o modelo de objeto do documento (PoDoFo) e conversão de HTML para PDF (wkhtmltopdf). Para cada abordagem, são fornecidos exemplos de código e indicadas áreas de aplicação.
1. Biblioteca libharu — abordagem minimalista
libharu é uma biblioteca leve em C puro, totalmente compatível com C++. Ela não requer dependências externas e permite criar arquivos PDF, gerenciando cada página, fonte e linha. Ideal para relatórios simples, onde são necessários apenas texto, tabelas e gráficos básicos.
Instalação
# Linux (Debian/Ubuntu)sudo apt-get install libhpdf-dev
# Windows (vcpkg)vcpkg install libharuExemplo: criação de relatório com tabela
#include <hpdf.h>#include <iostream>
int main() { HPDF_Doc pdf = HPDF_New(NULL, NULL); HPDF_Page page = HPDF_AddPage(pdf); HPDF_Page_SetSize(page, HPDF_PAGE_SIZE_A4, HPDF_PAGE_PORTRAIT);
// Título HPDF_Page_BeginText(page); HPDF_Page_SetFontAndSize(page, HPDF_GetFont(pdf, "Helvetica", NULL), 18); HPDF_Page_TextOut(page, 50, 750, "Relatório de vendas do Q1"); HPDF_Page_EndText(page);
// Tabela: coordenadas das células const char* headers[] = {"Produto", "Qtd", "Preço, R$"}; const char* data[][3] = {{"Notebook", "12", "85000"}, {"Mouse", "45", "1200"}, {"Teclado", "30", "3500"}}; float y = 700; HPDF_Page_SetFontAndSize(page, HPDF_GetFont(pdf, "Courier", NULL), 12); for (int i = 0; i < 3; ++i) { HPDF_Page_BeginText(page); HPDF_Page_TextOut(page, 50, y, headers[i]); HPDF_Page_TextOut(page, 200, y, data[0][i]); HPDF_Page_TextOut(page, 350, y, data[1][i]); HPDF_Page_TextOut(page, 500, y, data[2][i]); HPDF_Page_EndText(page); y -= 20; }
HPDF_SaveToFile(pdf, "report_libharu.pdf"); HPDF_Free(pdf); std::cout << "PDF criado: report_libharu.pdf" << std::endl; return 0;}Vantagens: tamanho mínimo, sem dependências, início rápido.
Desvantagens: sem suporte a cirílico "de fábrica" (requer codificação manual de fontes), difícil criar layouts complexos.
2. PoDoFo — modelo de objeto do documento
PoDoFo é uma biblioteca C++ moderna com suporte a Unicode, incorporação de fontes, trabalho com imagens e formulários. Ela fornece uma API de alto nível, semelhante à marcação HTML. Excelente para relatórios com cirílico, tabelas e fontes incorporadas.
Instalação
# Linuxsudo apt-get install libpodofo-dev
# Windows (vcpkg)vcpkg install podofoExemplo: relatório com cirílico e tabela
#include <podofo/podofo.h>#include <iostream>
int main() { using namespace PoDoFo;
PdfMemDocument document; PdfPage* page = document.CreatePage(PdfPage::CreateStandardPageSize(PdfPageSize::A4)); PdfPainter painter; painter.SetCanvas(page);
// Carregar fonte com suporte a cirílico const char* fontPath = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"; PdfFont* font = document.CreateFont(fontPath); font->SetFontSize(16); painter.SetFont(font);
// Título painter.DrawText("Relatório do projeto «Alfa»", 50, 750);
// Tabela (desenho manual de linhas) painter.SetStrokeWidth(1); painter.DrawLine(50, 720, 550, 720); Também na biblioteca
Tokens JWT em PHP: Guia Completo para Autenticação e Autorização
Trabalhando com CSV em JavaScript (Node.js): bibliotecas, parsing e geração de dados
gRPC para TypeScript: bibliotecas e exemplos de uso
Bibliotecas WebSocket TypeScript: ws, Socket.IO, uWebSockets.js