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 installAprès l'installation, incluez le fichier d'en-tête et la bibliothèque dans votre projet :
#include <hpdf.h>
// Liaison : -lhpdfCré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
Aussi dans la bibliothèque
Travailler avec XML en Rust : bibliothèques quick-xml, roxmltree et serde_xml_rs
Client HTTP pour C# (.NET) : top bibliothèques pour les requêtes web
Client HTTP pour Java : top bibliothèques pour travailler avec HTTP
Event Bus et le pattern Observer en C# (.NET) : implémentation et exemples
Générateur de QR codes en Rust : bibliothèque qr_code