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

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

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

ابدأ الدورة

توليد تقارير PDF بلغة C++: نظرة عامة على المكتبات وأمثلة عملية



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



1. مكتبة libharu — نهج بسيط



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



التثبيت

# Linux (Debian/Ubuntu)sudo apt-get install libhpdf-dev

# Windows (vcpkg)vcpkg install libharu


مثال: إنشاء تقرير مع جدول

#include <hpdf.h>#include <iostream>

int main() { HPDF_Doc pdf = HPDF_New(NULL, NULL); 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), 18); HPDF_Page_TextOut(page, 50, 750, "تقرير المبيعات للربع الأول"); HPDF_Page_EndText(page);

// الجدول: إحداثيات الخلايا const char* headers[] = {"المنتج", "الكمية", "السعر، روبل"}; const char* data[][3] = {{"حاسوب محمول", "12", "85000"}, {"فأرة", "45", "1200"}, {"لوحة مفاتيح", "30", "3500"}}; float y = 700; HPDF_Page_SetFontAndSize(page, HPDF_GetFont(pdf, "Courier", NULL), 12); for (int i = 0; i < 3; ++i) { HPDF_Page_BeginText(page); HPDF_Page_TextOut(page, 50, y, headers[i]); HPDF_Page_TextOut(page, 200, y, data[0][i]); HPDF_Page_TextOut(page, 350, y, data[1][i]); HPDF_Page_TextOut(page, 500, y, data[2][i]); HPDF_Page_EndText(page); y -= 20; }

HPDF_SaveToFile(pdf, "report_libharu.pdf"); HPDF_Free(pdf); std::cout << "تم إنشاء PDF: report_libharu.pdf" << std::endl; return 0;}


المزايا: حجم صغير، لا تبعيات، بداية سريعة.
العيوب: لا يدعم السيريلية "خارج الصندوق" (يتطلب ترميز الخطوط يدويًا)، صعوبة إنشاء تخطيطات معقدة.



2. PoDoFo — نموذج الكائن للمستند



PoDoFo هي مكتبة C++ حديثة تدعم Unicode، ودمج الخطوط، والعمل مع الصور والنماذج. توفر واجهة برمجة تطبيقات عالية المستوى تشبه تنسيق HTML. مناسبة تمامًا للتقارير التي تحتوي على السيريلية والجداول والخطوط المدمجة.



التثبيت

# Linuxsudo apt-get install libpodofo-dev

# Windows (vcpkg)vcpkg install podofo


مثال: تقرير مع السيريلية وجدول

#include <podofo/podofo.h>#include <iostream>

int main() { using namespace PoDoFo;

PdfMemDocument document; PdfPage* page = document.CreatePage(PdfPage::CreateStandardPageSize(PdfPageSize::A4)); PdfPainter painter; painter.SetCanvas(page);

// تحميل خط يدعم السيريلية const char* fontPath = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"; PdfFont* font = document.CreateFont(fontPath); font->SetFontSize(16); painter.SetFont(font);

// العنوان painter.DrawText("تقرير مشروع «ألفا»", 50, 750);

// الجدول (رسم الخطوط يدويًا) painter.SetStrokeWidth(1); painter.DrawLine(50, 720, 550, 720);

توصيات