Génération de rapports PDF en C++ : bibliothèque libHaru

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++ avec libHaru



Dans la programmation moderne, il est souvent nécessaire de créer des documents au format PDF par programmation. Il peut s'agir de rapports, de factures, de bordereaux, de synthèses analytiques ou simplement de sauvegarde de données sous une forme universelle. En langage C++, il existe plusieurs bibliothèques à cet effet, et l'une des plus populaires est libHaru (également connue sous le nom de Haru PDF).



libHaru est une bibliothèque multiplateforme open source écrite en C et dotée d'une interface C++ pratique. Elle permet de créer des documents PDF sans dépendances externes (ne nécessite pas l'installation de Ghostscript, LaTeX ou d'autres systèmes). La bibliothèque prend en charge le travail avec le texte (y compris Unicode via les encodages), l'intégration d'images (PNG, JPEG), le dessin de lignes, de rectangles, de cercles, ainsi que la création d'annotations et d'hyperliens.



Installation et configuration



Vous pouvez télécharger les sources de libHaru depuis le dépôt officiel sur GitHub. CMake est utilisé pour la compilation. Exemple d'installation sur Linux :



git clone https://github.com/libharu/libharu.gitcd libharumkdir build && cd buildcmake ..makesudo make install


Après l'installation, incluez le fichier d'en-tête et la bibliothèque dans votre projet :



#include <hpdf.h>

// Liaison : -lhpdf


Création d'un document PDF simple



Examinons un exemple de base — la création d'un document avec une seule page et du texte. Code en C++ :



#include <hpdf.h>#include <stdio.h>

int main() { HPDF_Doc pdf = HPDF_New(NULL, NULL); if (!pdf) { fprintf(stderr, "Erreur de création du PDF"); return 1; }

HPDF_Page page = HPDF_AddPage(pdf); HPDF_Page_SetSize(page, HPDF_PAGE_SIZE_A4, HPDF_PAGE_LANDSCAPE);

HPDF_Font font = HPDF_GetFont(pdf, "Helvetica", NULL); HPDF_Page_SetFontAndSize(page, font, 20);

HPDF_Page_BeginText(page); HPDF_Page_TextOut(page, 100, 400, "Bonjour le monde ! Ceci est un rapport PDF en C++."); HPDF_Page_EndText(page);

HPDF_SaveToFile(pdf, "output.pdf"); HPDF_Free(pdf); printf("PDF créé : output.pdf"); return 0;}


Ce code crée une feuille A4 en paysage, affiche le texte en bleu (par défaut en noir) et enregistre le résultat. Notez que libHaru ne prend pas en charge directement le cyrillique dans les polices comme Helvetica — pour le texte russe, une police TrueType est nécessaire, comme indiqué ci-dessous.



Travail avec le texte russe et les polices



Pour afficher correctement le cyrillique, il est nécessaire de charger une police prenant en charge Unicode (par exemple, Arial ou Times New Roman). Exemple :



// Chargement d'une police TrueType (le fichier doit être accessible)const char* font_path = "/usr/share/fonts/truetype/arial.ttf";HPDF_Font font = HPDF_GetFont(pdf, font_path, NULL);

// Ou utiliser une police intégrée avec l'encodage UTF-8HPDF_UseUTFEncodings(pdf);HPDF_Font font = HPDF_GetFont(pdf, "Helvetica", "UTF-8");


La première méthode est plus fiable, mais nécessite la présence du fichier de police sur le système cible. La seconde méthode ne fonctionne qu'avec certaines polices intégrées et ne garantit pas une prise en charge complète du cyrillique.



Dessin de tableaux et d'éléments graphiques



Pour créer des rapports, il est souvent nécessaire de dessiner des tableaux. libHaru permet de dessiner des lignes et des rectangles :



HPDF_Page_SetLineWidth(page, 1);HPDF_Page_SetRGBStroke(page, 0, 0, 0);

// Dessiner un rectangle (x, y, width, height)HPDF_Page_Rectangle(page, 50, 500, 200, 30);HPDF_Page_Stroke(page);

// Dessiner une ligneHPDF_Page_MoveTo(page, 50, 500);HPDF_Page_LineTo(page, 250, 500);HPDF_Page_Stroke(page);


On peut combiner des lignes et du texte pour créer un tableau complet. Pour les rapports complexes avec des données dynamiques, il est pratique d'écrire une fonction auxiliaire qui accepte un tableau de chaînes

Recommendations