Geração de relatórios PDF em C++: biblioteca libHaru

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



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 install


Após a instalação, inclua o arquivo de cabeçalho e a biblioteca no seu projeto:



#include <hpdf.h>

// Linkagem: -lhpdf


Criaçã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

Recommendations