PDF-Berichte in C++ mit libharu und PoDoFo generieren
In der modernen C++-Entwicklung besteht häufig die Notwendigkeit, programmatisch PDF-Dokumente zu erstellen: von einfachen Textberichten bis hin zu komplexen mehrseitigen Dokumenten mit Tabellen, Diagrammen und Bildern. In diesem Artikel betrachten wir zwei beliebte Bibliotheken zur PDF-Generierung in C++ – libharu und PoDoFo – und geben praktische Beispiele für deren Verwendung.
1. Die Bibliothek libharu
libharu ist eine leichtgewichtige, plattformunabhängige Bibliothek zum Erstellen von PDF-Dateien in C. Sie ist unabhängig von externen Bibliotheken (außer zlib für die Komprimierung), unterstützt Unicode, die Einbettung von Schriftarten, Bildern (JPEG/PNG) und grundlegende Vektorprimitiven. Ideal für die Generierung einfacher Berichte, Rechnungen und Bescheinigungen.
Installation (Linux / Windows)
- Linux (Ubuntu/Debian):
sudo apt-get install libhpdf-dev - Windows (vcpkg):
vcpkg install libharu - Windows (Build aus dem Quellcode): Laden Sie das Archiv von GitHub herunter und bauen Sie es mit CMake.
Beispiel: Erstellen eines einfachen PDFs mit Text und einer Linie
#include <hpdf.h>#include <stdio.h>
int main() { HPDF_Doc pdf = HPDF_New(NULL, NULL); if (!pdf) { fprintf(stderr, "Fehler beim Erstellen des Dokuments"); return 1; }
HPDF_Page page = HPDF_AddPage(pdf); HPDF_Page_SetSize(page, HPDF_PAGE_SIZE_A4, HPDF_PAGE_PORTRAIT);
// Überschrift HPDF_Page_BeginText(page); HPDF_Page_SetFontAndSize(page, HPDF_GetFont(pdf, "Helvetica", NULL), 24); HPDF_Page_TextOut(page, 50, 750, "Verkaufsbericht Q1"); HPDF_Page_EndText(page);
// Linie unter der Überschrift HPDF_Page_SetLineWidth(page, 1.5); HPDF_Page_MoveTo(page, 50, 735); HPDF_Page_LineTo(page, 545, 735); HPDF_Page_Stroke(page);
// Speichern HPDF_SaveToFile(pdf, "report.pdf"); HPDF_Free(pdf); printf("PDF erstellt: report.pdf"); return 0;}Beispiel: Hinzufügen einer Tabelle (Simulation)
libharu hat kein integriertes Tabellenmodul, aber Tabellen können manuell gezeichnet werden:
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. Die Bibliothek PoDoFo
PoDoFo ist eine modernere und leistungsfähigere C++-Bibliothek mit Unterstützung für C++17. Sie bietet eine objektorientierte API, Arbeit mit Formularen, Anmerkungen, Lesezeichen, Einbettung von TrueType/OpenType-Schriftarten sowie das Lesen und Bearbeiten vorhandener PDFs. PoDoFo eignet sich besser für komplexe Berichte mit dynamischem Inhalt.
Installation
- Linux:
sudo apt-get install libpodofo-dev(die Version kann alt sein, besser aus dem Quellcode bauen) - Windows: über vcpkg:
vcpkg install podofo - Build aus dem Quellcode: Erfordert CMake, zlib, libpng, freetype, fontconfig.
Beispiel: Erstellen eines PDFs mit Tabelle und Bild
#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);
// Schriftart auto