Génération de rapports PDF en C++ avec libharu et PoDoFo

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Génération de rapports PDF en C++ : aperçu des bibliothèques et exemples pratiques



Dans le développement logiciel moderne, il est souvent nécessaire de générer des documents imprimables, des rapports analytiques ou des factures. Le langage C++ offre des outils puissants pour travailler avec le PDF, mais le choix de la bibliothèque appropriée peut être complexe. Dans cet article, nous examinerons trois approches principales : le travail de bas niveau directement avec le PDF (libharu), le travail avec le modèle objet du document (PoDoFo) et la conversion HTML en PDF (wkhtmltopdf). Pour chaque approche, des exemples de code sont fournis et les domaines d'application sont indiqués.



1. Bibliothèque libharu — approche minimaliste



libharu est une bibliothèque légère en C pur, entièrement compatible avec le C++. Elle ne nécessite aucune dépendance externe et permet de créer des fichiers PDF en contrôlant chaque page, police et ligne. Idéale pour les rapports simples où seuls du texte, des tableaux et des graphiques de base sont nécessaires.



Installation

# Linux (Debian/Ubuntu)sudo apt-get install libhpdf-dev

# Windows (vcpkg)vcpkg install libharu


Exemple : création d'un rapport avec un tableau

#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);

// Titre HPDF_Page_BeginText(page); HPDF_Page_SetFontAndSize(page, HPDF_GetFont(pdf, "Helvetica", NULL), 18); HPDF_Page_TextOut(page, 50, 750, "Rapport des ventes pour le T1"); HPDF_Page_EndText(page);

// Tableau : coordonnées des cellules const char* headers[] = {"Produit", "Quantité", "Prix, €"}; const char* data[][3] = {{"Ordinateur portable", "12", "85000"}, {"Souris", "45", "1200"}, {"Clavier", "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 créé : report_libharu.pdf" << std::endl; return 0;}


Avantages : taille minimale, aucune dépendance, démarrage rapide.
Inconvénients : pas de support du cyrillique « prêt à l'emploi » (encodage manuel des polices requis), difficile de créer des mises en page complexes.



2. PoDoFo — modèle objet du document



PoDoFo est une bibliothèque C++ moderne avec support Unicode, intégration de polices, travail avec des images et des formulaires. Elle fournit une API de haut niveau, similaire à la mise en page HTML. Idéale pour les rapports en cyrillique, avec tableaux et polices intégrées.



Installation

# Linuxsudo apt-get install libpodofo-dev

# Windows (vcpkg)vcpkg install podofo


Exemple : rapport avec cyrillique et tableau

#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);

// Chargement de la police avec support cyrillique const char* fontPath = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"; PdfFont* font = document.CreateFont(fontPath); font->SetFontSize(16); painter.SetFont(font);

// Titre painter.DrawText("Rapport du projet « Alpha »", 50, 750);

// Tableau (dessin manuel des lignes) painter.SetStrokeWidth(1); painter.DrawLine(50, 720, 550, 720);

Recommendations