Generación de informes PDF en C++ con libHaru
En la programación moderna, a menudo surge la necesidad de crear documentos en formato PDF de forma programática. Estos pueden ser informes, facturas, albaranes, resúmenes analíticos o simplemente guardar datos en un formato universal. En el lenguaje C++, existen varias bibliotecas para este propósito, y una de las más populares es libHaru (también conocida como Haru PDF).
libHaru es una biblioteca multiplataforma de código abierto, escrita en C y con una interfaz C++ conveniente. Permite crear documentos PDF sin dependencias externas (no requiere instalar Ghostscript, LaTeX u otros sistemas). La biblioteca admite trabajo con texto (incluyendo Unicode a través de codificaciones), incrustación de imágenes (PNG, JPEG), dibujo de líneas, rectángulos, círculos, así como la creación de anotaciones e hipervínculos.
Instalación y configuración
Puede descargar los fuentes de libHaru desde el repositorio oficial en GitHub. Para la compilación se utiliza CMake. Ejemplo de instalación en Linux:
git clone https://github.com/libharu/libharu.gitcd libharumkdir build && cd buildcmake ..makesudo make installDespués de la instalación, incluya el archivo de cabecera y la biblioteca en su proyecto:
#include <hpdf.h>
// Enlace: -lhpdfCreación de un documento PDF simple
Veamos un ejemplo básico: crear un documento con una página y texto. Código en C++:
#include <hpdf.h>#include <stdio.h>
int main() { HPDF_Doc pdf = HPDF_New(NULL, NULL); if (!pdf) { fprintf(stderr, "Error al crear 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, "¡Hola, mundo! Este es un informe PDF en C++."); HPDF_Page_EndText(page);
HPDF_SaveToFile(pdf, "output.pdf"); HPDF_Free(pdf); printf("PDF creado: output.pdf"); return 0;}Este código crea una hoja A4 apaisada, muestra texto en color azul (por defecto negro) y guarda el resultado. Tenga en cuenta: libHaru no admite cirílico directamente en fuentes como Helvetica — para texto en ruso se necesita una fuente TrueType, como se muestra a continuación.
Trabajo con texto en ruso y fuentes
Para mostrar correctamente el cirílico, es necesario cargar una fuente que admita Unicode (por ejemplo, Arial o Times New Roman). Ejemplo:
// Cargar fuente TrueType (el archivo debe estar disponible)const char* font_path = "/usr/share/fonts/truetype/arial.ttf";HPDF_Font font = HPDF_GetFont(pdf, font_path, NULL);
// O usar una fuente incorporada con codificación UTF-8HPDF_UseUTFEncodings(pdf);HPDF_Font font = HPDF_GetFont(pdf, "Helvetica", "UTF-8");El primer método es más fiable, pero requiere que el archivo de fuente esté presente en el sistema de destino. El segundo método solo funciona con algunas fuentes incorporadas y no garantiza soporte completo para cirílico.
Dibujo de tablas y elementos gráficos
Para crear informes, a menudo es necesario dibujar tablas. libHaru permite dibujar líneas y rectángulos:
HPDF_Page_SetLineWidth(page, 1);HPDF_Page_SetRGBStroke(page, 0, 0, 0);
// Dibujar un rectángulo (x, y, width, height)HPDF_Page_Rectangle(page, 50, 500, 200, 30);HPDF_Page_Stroke(page);
// Dibujar una líneaHPDF_Page_MoveTo(page, 50, 500);HPDF_Page_LineTo(page, 250, 500);HPDF_Page_Stroke(page);Se pueden combinar líneas y texto para crear una tabla completa. Para informes complejos con datos dinámicos, es conveniente escribir una función auxiliar que reciba un array de cadenas
También en la biblioteca
Trabajo con fechas en Kotlin: bibliotecas y herramientas (Kotlinx-datetime, Joda-Time, java.time)
Crossbeam para Rust: guía completa con ejemplos
Envío de correo electrónico en Go (Golang): bibliotecas y ejemplos de código
Trabajo con archivos ZIP en Swift (iOS/macOS): guía completa