Geração de relatórios PDF em C++: biblioteca libharu e outras

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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

Recommendations