Generación de informes PDF en C++: biblioteca libharu y más

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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

Recommendations