Generación de informes PDF en C++: reseña de bibliotecas y ejemplos prácticos
En el desarrollo de software moderno, a menudo surge la necesidad de generar documentos impresos, informes analíticos o facturas. El lenguaje C++ proporciona potentes herramientas para trabajar con PDF, sin embargo, elegir la biblioteca adecuada puede ser complejo. En este artículo, examinaremos tres enfoques principales: trabajo de bajo nivel directamente con PDF (libharu), trabajo con el modelo de objetos del documento (PoDoFo) y conversión de HTML a PDF (wkhtmltopdf). Para cada enfoque se proporcionan ejemplos de código y se indican sus áreas de aplicación.
1. Biblioteca libharu — enfoque minimalista
libharu es una biblioteca ligera en C puro, totalmente compatible con C++. No requiere dependencias externas y permite crear archivos PDF, gestionando cada página, fuente y línea. Es ideal para informes simples donde solo se necesitan texto, tablas y gráficos básicos.
Instalación
# Linux (Debian/Ubuntu)sudo apt-get install libhpdf-dev
# Windows (vcpkg)vcpkg install libharuEjemplo: creación de un informe con tabla
#include <hpdf.h>#include <iostream>
int main() { HPDF_Doc pdf = HPDF_New(NULL, NULL); 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), 18); HPDF_Page_TextOut(page, 50, 750, "Informe de ventas del Q1"); HPDF_Page_EndText(page);
// Tabla: coordenadas de las celdas const char* headers[] = {"Producto", "Cantidad", "Precio, RUB"}; const char* data[][3] = {{"Portátil", "12", "85000"}, {"Ratón", "45", "1200"}, {"Teclado", "30", "3500"}}; float y = 700; HPDF_Page_SetFontAndSize(page, HPDF_GetFont(pdf, "Courier", NULL), 12); for (int i = 0; i < 3; ++i) { HPDF_Page_BeginText(page); HPDF_Page_TextOut(page, 50, y, headers[i]); HPDF_Page_TextOut(page, 200, y, data[0][i]); HPDF_Page_TextOut(page, 350, y, data[1][i]); HPDF_Page_TextOut(page, 500, y, data[2][i]); HPDF_Page_EndText(page); y -= 20; }
HPDF_SaveToFile(pdf, "report_libharu.pdf"); HPDF_Free(pdf); std::cout << "PDF creado: report_libharu.pdf" << std::endl; return 0;}Ventajas: tamaño mínimo, sin dependencias, inicio rápido.
Desventajas: no tiene soporte para cirílico "de fábrica" (requiere codificación manual de fuentes), es difícil crear diseños complejos.
2. PoDoFo — modelo de objetos del documento
PoDoFo es una biblioteca moderna de C++ con soporte para Unicode, incrustación de fuentes, trabajo con imágenes y formularios. Proporciona una API de alto nivel, similar al maquetado HTML. Es excelente para informes con cirílico, tablas y fuentes incrustadas.
Instalación
# Linuxsudo apt-get install libpodofo-dev
# Windows (vcpkg)vcpkg install podofoEjemplo: informe con cirílico y tabla
#include <podofo/podofo.h>#include <iostream>
int main() { using namespace PoDoFo;
PdfMemDocument document; PdfPage* page = document.CreatePage(PdfPage::CreateStandardPageSize(PdfPageSize::A4)); PdfPainter painter; painter.SetCanvas(page);
// Carga de fuente con soporte para cirílico const char* fontPath = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"; PdfFont* font = document.CreateFont(fontPath); font->SetFontSize(16); painter.SetFont(font);
// Título painter.DrawText("Informe del proyecto «Alfa»", 50, 750);
// Tabla (dibujo manual de líneas) painter.SetStrokeWidth(1); painter.DrawLine(50, 720, 550, 720); También en la biblioteca
InversifyJS: Contenedor IoC para aplicaciones TypeScript
Análisis de HTML en C# (.NET): revisión de bibliotecas y ejemplos de código
Gestión de configuración de aplicaciones TypeScript: guía completa
Aprendizaje automático en Go: bibliotecas para Golang (ML, redes neuronales, NLP)
Tokens JWT en Swift: guía completa para trabajar con JSON Web Tokens