Generación de informes PDF en C++ con libharu y PoDoFo
En el desarrollo moderno en C++, a menudo surge la necesidad de crear documentos en formato PDF mediante programación: desde informes de texto simples hasta documentos complejos de varias páginas con tablas, gráficos e imágenes. En este artículo, analizaremos en detalle dos bibliotecas populares para la generación de PDF en C++ — libharu y PoDoFo, y proporcionaremos ejemplos prácticos de su uso.
1. Biblioteca libharu
libharu es una biblioteca ligera y multiplataforma para crear archivos PDF en C. No depende de bibliotecas externas (excepto zlib para compresión), admite Unicode, incrustación de fuentes, imágenes (JPEG/PNG) y primitivas vectoriales básicas. Es ideal para generar informes simples, facturas y certificados.
Instalación (Linux / Windows)
- Linux (Ubuntu/Debian):
sudo apt-get install libhpdf-dev - Windows (vcpkg):
vcpkg install libharu - Windows (compilación desde el código fuente): descargue el archivo de GitHub, compílelo con CMake.
Ejemplo: creación de un PDF simple con texto y una línea
#include <hpdf.h>#include <stdio.h>
int main() { HPDF_Doc pdf = HPDF_New(NULL, NULL); if (!pdf) { fprintf(stderr, "Error al crear el 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, "Informe de ventas del Q1"); HPDF_Page_EndText(page);
// Línea debajo del título HPDF_Page_SetLineWidth(page, 1.5); HPDF_Page_MoveTo(page, 50, 735); HPDF_Page_LineTo(page, 545, 735); HPDF_Page_Stroke(page);
// Guardar HPDF_SaveToFile(pdf, "report.pdf"); HPDF_Free(pdf); printf("PDF creado: report.pdf"); return 0;}Ejemplo: agregar una tabla (simulación)
libharu no tiene un módulo de tablas incorporado, pero se pueden dibujar 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 es una biblioteca más moderna y potente en C++ con soporte para C++17. Proporciona una API orientada a objetos, soporte para formularios, anotaciones, marcadores, incrustación de fuentes TrueType/OpenType, así como lectura y edición de PDF existentes. PoDoFo es más adecuado para informes complejos con contenido dinámico.
Instalación
- Linux:
sudo apt-get install libpodofo-dev(la versión puede ser antigua, es mejor compilar desde el código fuente) - Windows: a través de vcpkg:
vcpkg install podofo - Compilación desde el código fuente: requiere CMake, zlib, libpng, freetype, fontconfig.
Ejemplo: creación de un PDF con tabla e imagen
#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);
// Fuente auto También en la biblioteca
Planificador de tareas en Node.js: node-cron, node-schedule y Bull
Generación de informes PDF en Go: revisión de bibliotecas y ejemplos de código
GraphQL Java — biblioteca del lado del servidor para implementar API GraphQL en Java
Behat PHP: guía completa con ejemplos prácticos