توليد PDF في C++: نظرة عامة على المكتبات والأدوات
توليد مستندات PDF هي إحدى المهام الشائعة في تطوير البرمجيات باستخدام C++. من إنشاء تقارير بسيطة إلى إنشاء مستندات معقدة متعددة الصفحات تحتوي على جداول وصور ورسومات. في هذه المقالة، سنستعرض المكتبات والأدوات الأكثر شيوعًا للعمل مع PDF في C++، وإمكانياتها، ومزاياها وعيوبها، بالإضافة إلى تقديم أمثلة عملية للكود.
لماذا نحتاج إلى توليد PDF في C++؟
PDF (Portable Document Format) هو تنسيق متعدد المنصات يحافظ على تخطيط المستند بغض النظر عن الجهاز ونظام التشغيل. في C++، يُستخدم توليد PDF من أجل:
- إنشاء التقارير والفواتير في تطبيقات الأعمال
- توليد الوثائق من القوالب
- تصدير البيانات من قواعد البيانات
- توليد الإيصالات والفواتير في أنظمة المحاسبة
المكتبات الرئيسية للعمل مع PDF في C++
1. libharu (HARU PDF)
واحدة من أشهر وأسهل المكتبات استخدامًا لتوليد PDF. مكتوبة بلغة C ولكنها توفر واجهة C++ ممتازة. تسمح بإنشاء مستندات PDF من الصفر، وإضافة النصوص والصور والخطوط والمستطيلات والتعليقات التوضيحية.
الميزات:
- حجم صغير وأداء عالٍ
- دعم خطوط TrueType
- ضغط الصفحات
- العمل مع الصور (JPEG، PNG)
- الترخيص: ZLIB/Libpng (مجاني)
مثال لتوليد PDF بسيط:
#include <hpdf.h>#include <stdio.h>
int main() { HPDF_Doc pdf = HPDF_New(NULL, NULL); HPDF_Page page = HPDF_AddPage(pdf); // تعيين حجم الصفحة A4 HPDF_Page_SetSize(page, HPDF_PAGE_SIZE_A4, HPDF_PAGE_LANDSCAPE); // إضافة نص HPDF_Page_BeginText(page); HPDF_Page_SetFontAndSize(page, HPDF_GetFont(pdf, "Helvetica", NULL), 24); HPDF_Page_TextOut(page, 100, 500, "مرحبًا، عالم PDF في C++!"); HPDF_Page_EndText(page); // حفظ المستند HPDF_SaveToFile(pdf, "output.pdf"); HPDF_Free(pdf); return 0;}2. PoDoFo
مكتبة C++ حديثة مفتوحة المصدر للعمل مع PDF. تدعم ليس فقط الإنشاء، بل أيضًا تحرير ملفات PDF الموجودة. موثقة جيدًا وتُصان بنشاط.
الميزات:
- كود C++ نقي (معايير حديثة)
- دعم Unicode واللغة السيريلية
- العمل مع النماذج والإشارات المرجعية والبيانات الوصفية
- قراءة وكتابة PDF
- الترخيص: LGPL
مثال لإنشاء PDF مع جدول:
#include <podofo/podofo.h>
using namespace PoDoFo;
int main() { PdfMemDocument document; PdfPage* page = document.CreatePage(PdfPage::CreateStandardPageSize(PdfPageSize::A4)); PdfPainter painter; painter.SetCanvas(*page); // رسم جدول painter.DrawRect(50, 700, 500, 30); painter.DrawText(60, 710, "عنوان الجدول"); // حفظ painter.FinishPage(); document.Save("table.pdf"); return 0;}3. wkhtmltopdf
ليست مكتبة بالمعنى التقليدي، بل أداة سطر أوامر تستخدم محرك WebKit لتحويل HTML إلى PDF. في C++، يمكن استدعاؤها عبر system() أو استخدام مكتبة غلاف.
الميزات:
- مثالية لتوليد PDF من قوالب HTML
- دعم CSS، JavaScript، SVG
- تخطيط عالي الجودة (كما في المتصفح)
- رؤوس وتذييلات، فهرس، ترقيم الصفحات
- الترخيص: LGPLv3
مثال للاستدعاء من C++:
#include <cstdlib>
int main() { // تحويل ملف HTML إلى PDF int result = std::system("w