توليد تقارير PDF بلغة C++: مكتبة libharu وغيرها

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

توليد تقارير PDF بلغة C++ باستخدام libharu و PoDoFo



في التطوير الحديث بلغة C++، غالبًا ما تنشأ الحاجة إلى إنشاء مستندات بصيغة PDF برمجيًا: من تقارير نصية بسيطة إلى مستندات معقدة متعددة الصفحات تحتوي على جداول ورسوم بيانية وصور. في هذه المقالة، سننظر بالتفصيل في مكتبتين شائعتين لتوليد PDF بلغة C++ — libharu و PoDoFo، وسنقدم أمثلة عملية لاستخدامهما.



1. مكتبة libharu



libharu هي مكتبة خفيفة الوزن ومتعددة المنصات لإنشاء ملفات PDF بلغة C. لا تعتمد على مكتبات خارجية (باستثناء zlib للضغط)، وتدعم Unicode، وتضمين الخطوط، والصور (JPEG/PNG)، والبدائيات المتجهة الأساسية. إنها مثالية لتوليد التقارير البسيطة والفواتير والشهادات.



التثبيت (Linux / Windows)

  • Linux (Ubuntu/Debian): sudo apt-get install libhpdf-dev
  • Windows (vcpkg): vcpkg install libharu
  • Windows (البناء من المصدر): قم بتنزيل الأرشيف من GitHub، وقم ببنائه باستخدام CMake.


مثال: إنشاء PDF بسيط مع نص وخط

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

int main() { HPDF_Doc pdf = HPDF_New(NULL, NULL); if (!pdf) { fprintf(stderr, "خطأ في إنشاء المستند"); return 1; }

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

// العنوان HPDF_Page_BeginText(page); HPDF_Page_SetFontAndSize(page, HPDF_GetFont(pdf, "Helvetica", NULL), 24); HPDF_Page_TextOut(page, 50, 750, "تقرير المبيعات للربع الأول"); HPDF_Page_EndText(page);

// خط تحت العنوان HPDF_Page_SetLineWidth(page, 1.5); HPDF_Page_MoveTo(page, 50, 735); HPDF_Page_LineTo(page, 545, 735); HPDF_Page_Stroke(page);

// حفظ HPDF_SaveToFile(pdf, "report.pdf"); HPDF_Free(pdf); printf("تم إنشاء PDF: report.pdf"); return 0;}


مثال: إضافة جدول (محاكاة)

لا تحتوي libharu على وحدة جداول مدمجة، ولكن يمكن رسمها يدويًا:

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. مكتبة PoDoFo



PoDoFo هي مكتبة أكثر حداثة وقوة بلغة C++ مع دعم C++17. توفر واجهة برمجة تطبيقات موجهة للكائنات، والعمل مع النماذج، والتعليقات التوضيحية، والإشارات المرجعية، وتضمين خطوط TrueType/OpenType، بالإضافة إلى قراءة وتحرير ملفات PDF الموجودة. PoDoFo مناسبة بشكل أفضل للتقارير المعقدة ذات المحتوى الديناميكي.



التثبيت

  • Linux: sudo apt-get install libpodofo-dev (قد يكون الإصدار قديمًا، ومن الأفضل البناء من المصدر)
  • Windows: عبر vcpkg: vcpkg install podofo
  • البناء من المصدر: يتطلب CMake، zlib، libpng، freetype، fontconfig.


مثال: إنشاء PDF مع جدول وصورة

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

// خط auto

توصيات