Geração de relatórios PDF em C++ com libharu e PoDoFo
No desenvolvimento moderno em C++, surge frequentemente a necessidade de criar programaticamente documentos no formato PDF: desde relatórios de texto simples até documentos complexos de várias páginas com tabelas, gráficos e imagens. Neste artigo, abordaremos detalhadamente duas bibliotecas populares para geração de PDF em C++ — libharu e PoDoFo, além de apresentar exemplos práticos de sua utilização.
1. Biblioteca libharu
libharu é uma biblioteca leve e multiplataforma para criação de arquivos PDF em C. Ela não depende de bibliotecas externas (exceto zlib para compressão), suporta Unicode, incorporação de fontes, imagens (JPEG/PNG) e primitivas vetoriais básicas. Ideal para geração de relatórios simples, faturas, certificados.
Instalação (Linux / Windows)
- Linux (Ubuntu/Debian):
sudo apt-get install libhpdf-dev - Windows (vcpkg):
vcpkg install libharu - Windows (compilação a partir dos fontes): baixe o arquivo do GitHub, compile via CMake.
Exemplo: criação de um PDF simples com texto e linha
#include <hpdf.h>#include <stdio.h>
int main() { HPDF_Doc pdf = HPDF_New(NULL, NULL); if (!pdf) { fprintf(stderr, "Erro ao criar documento"); return 1; }
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), 24); HPDF_Page_TextOut(page, 50, 750, "Relatório de vendas do Q1"); HPDF_Page_EndText(page);
// Linha abaixo do título HPDF_Page_SetLineWidth(page, 1.5); HPDF_Page_MoveTo(page, 50, 735); HPDF_Page_LineTo(page, 545, 735); HPDF_Page_Stroke(page);
// Salvar HPDF_SaveToFile(pdf, "report.pdf"); HPDF_Free(pdf); printf("PDF criado: report.pdf"); return 0;}Exemplo: adicionando uma tabela (simulação)
libharu não possui um módulo de tabelas embutido, mas elas podem ser desenhadas manualmente:
void draw_table(HPDF_Page page, float x, float y, float col_width, float row_height, int rows, int cols) { for (int r = 0; r <= rows; ++r) { HPDF_Page_MoveTo(page, x, y - r * row_height); HPDF_Page_LineTo(page, x + cols * col_width, y - r * row_height); HPDF_Page_Stroke(page); } for (int c = 0; c <= cols; ++c) { HPDF_Page_MoveTo(page, x + c * col_width, y); HPDF_Page_LineTo(page, x + c * col_width, y - rows * row_height); HPDF_Page_Stroke(page); }}2. Biblioteca PoDoFo
PoDoFo é uma biblioteca mais moderna e poderosa em C++ com suporte a C++17. Ela oferece uma API orientada a objetos, suporte a formulários, anotações, marcadores, incorporação de fontes TrueType/OpenType, além de leitura e edição de PDFs existentes. PoDoFo é mais adequado para relatórios complexos com conteúdo dinâmico.
Instalação
- Linux:
sudo apt-get install libpodofo-dev(a versão pode ser antiga, é melhor compilar a partir dos fontes) - Windows: via vcpkg:
vcpkg install podofo - Compilação a partir dos fontes: requer CMake, zlib, libpng, freetype, fontconfig.
Exemplo: criação de PDF com tabela e imagem
#include <podofo/podofo.h>#include <iostream>
int main() { using namespace PoDoFo;
PdfMemDocument doc; PdfPage* page = doc.CreatePage(PdfPage::CreateStandardPageSize(PdfPageSize::A4)); PdfPainter painter; painter.SetCanvas(*page);
// Fonte auto Também na biblioteca
Processamento de JSON em PHP: funções, exemplos e melhores práticas
SwiftLint para Swift: guia completo com exemplos práticos
Trabalhando com Kafka em TypeScript: biblioteca KafkaJS para Node.js