Geração de relatórios PDF em C++ com libHaru
Na programação moderna, surge frequentemente a necessidade de criar documentos em formato PDF programaticamente. Podem ser relatórios, faturas, notas fiscais, resumos analíticos ou simplesmente salvar dados em um formato universal. Na linguagem C++, existem várias bibliotecas para esse fim, e uma das mais populares é a libHaru (também conhecida como Haru PDF).
libHaru é uma biblioteca de código aberto multiplataforma, escrita em C e com uma interface C++ conveniente. Ela permite criar documentos PDF sem dependências externas (não requer instalação de Ghostscript, LaTeX ou outros sistemas). A biblioteca suporta trabalho com texto (incluindo Unicode através de codificações), incorporação de imagens (PNG, JPEG), desenho de linhas, retângulos, círculos, além da criação de anotações e hiperlinks.
Instalação e configuração
Os códigos-fonte da libHaru podem ser baixados do repositório oficial no GitHub. Para compilar, utiliza-se CMake. Exemplo de instalação no Linux:
git clone https://github.com/libharu/libharu.gitcd libharumkdir build && cd buildcmake ..makesudo make installApós a instalação, inclua o arquivo de cabeçalho e a biblioteca no seu projeto:
#include <hpdf.h>
// Linkagem: -lhpdfCriação de um documento PDF simples
Vamos considerar um exemplo básico — criação de um documento com uma página e texto. Código em C++:
#include <hpdf.h>#include <stdio.h>
int main() { HPDF_Doc pdf = HPDF_New(NULL, NULL); if (!pdf) { fprintf(stderr, "Erro ao criar PDF"); return 1; }
HPDF_Page page = HPDF_AddPage(pdf); HPDF_Page_SetSize(page, HPDF_PAGE_SIZE_A4, HPDF_PAGE_LANDSCAPE);
HPDF_Font font = HPDF_GetFont(pdf, "Helvetica", NULL); HPDF_Page_SetFontAndSize(page, font, 20);
HPDF_Page_BeginText(page); HPDF_Page_TextOut(page, 100, 400, "Olá, mundo! Este é um relatório PDF em C++."); HPDF_Page_EndText(page);
HPDF_SaveToFile(pdf, "output.pdf"); HPDF_Free(pdf); printf("PDF criado: output.pdf"); return 0;}Este código cria uma folha A4 em paisagem, exibe texto em azul (padrão é preto) e salva o resultado. Observe: a libHaru não suporta cirílico diretamente em fontes como Helvetica — para texto em russo, será necessário uma fonte TrueType, conforme mostrado abaixo.
Trabalho com texto em russo e fontes
Para exibir corretamente o cirílico, é necessário carregar uma fonte que suporte Unicode (por exemplo, Arial ou Times New Roman). Exemplo:
// Carregar fonte TrueType (o arquivo deve estar acessível)const char* font_path = "/usr/share/fonts/truetype/arial.ttf";HPDF_Font font = HPDF_GetFont(pdf, font_path, NULL);
// Ou usar fonte embutida com codificação UTF-8HPDF_UseUTFEncodings(pdf);HPDF_Font font = HPDF_GetFont(pdf, "Helvetica", "UTF-8");O primeiro método é mais confiável, mas requer que o arquivo da fonte esteja presente no sistema de destino. O segundo método funciona apenas com algumas fontes embutidas e não garante suporte completo ao cirílico.
Desenho de tabelas e elementos gráficos
Para criar relatórios, muitas vezes é necessário desenhar tabelas. A libHaru permite desenhar linhas e retângulos:
HPDF_Page_SetLineWidth(page, 1);HPDF_Page_SetRGBStroke(page, 0, 0, 0);
// Desenhar retângulo (x, y, largura, altura)HPDF_Page_Rectangle(page, 50, 500, 200, 30);HPDF_Page_Stroke(page);
// Desenhar linhaHPDF_Page_MoveTo(page, 50, 500);HPDF_Page_LineTo(page, 250, 500);HPDF_Page_Stroke(page);É possível combinar linhas e texto para criar uma tabela completa. Para relatórios complexos com dados dinâmicos, é conveniente escrever uma função auxiliar que receba um array de strings