توليد تقارير PDF بلغة C++ باستخدام libHaru
في البرمجة الحديثة، غالبًا ما تنشأ الحاجة إلى إنشاء مستندات بصيغة PDF برمجيًا. قد تكون هذه تقارير، فواتير، إشعارات شحن، ملخصات تحليلية، أو مجرد حفظ البيانات بشكل عالمي. في لغة C++، توجد عدة مكتبات لهذا الغرض، ومن أشهرها libHaru (المعروفة أيضًا باسم Haru PDF).
libHaru هي مكتبة مفتوحة المصدر متعددة المنصات، مكتوبة بلغة C ولها واجهة C++ سهلة الاستخدام. تتيح لك إنشاء مستندات PDF دون اعتماديات خارجية (لا تتطلب تثبيت Ghostscript أو LaTeX أو أنظمة أخرى). تدعم المكتبة العمل مع النصوص (بما في ذلك Unicode عبر الترميزات)، تضمين الصور (PNG، JPEG)، رسم الخطوط، المستطيلات، الدوائر، بالإضافة إلى إنشاء التعليقات التوضيحية والروابط التشعبية.
التثبيت والربط
يمكن تنزيل الكود المصدري لـ libHaru من المستودع الرسمي على GitHub. يتم استخدام CMake للبناء. مثال على التثبيت على Linux:
git clone https://github.com/libharu/libharu.gitcd libharumkdir build && cd buildcmake ..makesudo make installبعد التثبيت، قم بتضمين ملف الرأس والمكتبة في مشروعك:
#include <hpdf.h>
// الربط: -lhpdfإنشاء مستند PDF بسيط
لننظر إلى مثال أساسي — إنشاء مستند بصفحة واحدة ونص. الكود بلغة C++:
#include <hpdf.h>#include <stdio.h>
int main() { HPDF_Doc pdf = HPDF_New(NULL, NULL); if (!pdf) { fprintf(stderr, "خطأ في إنشاء 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, "مرحبًا بالعالم! هذا تقرير PDF بلغة C++."); HPDF_Page_EndText(page);
HPDF_SaveToFile(pdf, "output.pdf"); HPDF_Free(pdf); printf("تم إنشاء PDF: output.pdf"); return 0;}يقوم هذا الكود بإنشاء صفحة A4 أفقية، ويعرض نصًا باللون الأزرق (الافتراضي أسود) ويحفظ النتيجة. لاحظ: libHaru لا تدعم الأحرف السيريلية مباشرة في خطوط مثل Helvetica — للنص الروسي، ستحتاج إلى خط TrueType كما هو موضح أدناه.
العمل مع النص الروسي والخطوط
لعرض الأحرف السيريلية بشكل صحيح، يجب تحميل خط يدعم Unicode (مثل Arial أو Times New Roman). مثال:
// تحميل خط TrueType (يجب أن يكون الملف متاحًا)const char* font_path = "/usr/share/fonts/truetype/arial.ttf";HPDF_Font font = HPDF_GetFont(pdf, font_path, NULL);
// أو استخدام خط مدمج مع ترميز UTF-8HPDF_UseUTFEncodings(pdf);HPDF_Font font = HPDF_GetFont(pdf, "Helvetica", "UTF-8");الطريقة الأولى أكثر موثوقية، ولكنها تتطلب وجود ملف الخط على النظام المستهدف. الطريقة الثانية تعمل فقط مع بعض الخطوط المدمجة ولا تضمن دعمًا كاملاً للأحرف السيريلية.
رسم الجداول والعناصر الرسومية
لإنشاء التقارير، غالبًا ما يكون من الضروري رسم الجداول. تتيح libHaru رسم الخطوط والمستطيلات:
HPDF_Page_SetLineWidth(page, 1);HPDF_Page_SetRGBStroke(page, 0, 0, 0);
// رسم مستطيل (x, y, width, height)HPDF_Page_Rectangle(page, 50, 500, 200, 30);HPDF_Page_Stroke(page);
// رسم خطHPDF_Page_MoveTo(page, 50, 500);HPDF_Page_LineTo(page, 250, 500);HPDF_Page_Stroke(page);يمكن دمج الخطوط والنصوص لإنشاء جدول كامل. للتقارير المعقدة ذات البيانات الديناميكية، من المفيد كتابة دالة مساعدة تأخذ مصفوفة من السلاسل النصية
أيضاً في المكتبة
العمل مع XML في JavaScript (Node.js): التحليل والإنشاء والتحقق من الصحة
دليل Symfony/Cache PHP: كامل مع أمثلة تطبيقية
مقاييس Prometheus في Kotlin: التكامل مع Micrometer و Ktor
GraphQL في TypeScript: مكتبات لواجهات برمجة تطبيقات آمنة من حيث الأنواع
رموز JWT في TypeScript: دليل شامل للعمل مع JSON Web Tokens