توليد PDF في Rust: نظرة عامة على المكتبات وأمثلة الكود

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

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

ابدأ الدورة

توليد PDF في Rust: نظرة عامة على المكتبات وأمثلة عملية



Rust هي لغة برمجة نظامية تُستخدم بشكل متزايد لإنشاء تطبيقات خادم عالية الأداء وخدمات الويب وأدوات سطر الأوامر. إحدى المهام الشائعة عند تطوير مثل هذه المشاريع هي توليد مستندات PDF: التقارير والفواتير والشهادات أو ببساطة ملفات نصية منسقة. في هذه المقالة، سنستعرض المكتبات الرئيسية للعمل مع PDF في Rust، وإمكانياتها، وأمثلة الكود، ومعايير الاختيار.



المكتبات الشائعة لتوليد PDF في Rust



حاليًا، في نظام Rust البيئي، يمكن تمييز ثلاث مكتبات رئيسية يتم دعمها واستخدامها بنشاط من قبل المجتمع:



  • printpdf — مكتبة منخفضة المستوى لإنشاء مستندات PDF مع تحكم كامل في المحتوى. تدعم النصوص والصور والرسومات المتجهة والجداول وتضمين الخطوط.
  • genpdf — مكتبة ذات مستوى أعلى، مبنية على أساس printpdf. توفر تجريدات مريحة للعمل مع النصوص والفقرات والجداول والأنماط.
  • pdf_writer — مكتبة أخرى منخفضة المستوى تركز على البساطة والأداء. تسمح بكتابة ملفات PDF مباشرة، ولكنها تتطلب فهمًا عميقًا لتنسيق PDF.


مكتبة printpdf



printpdf هي واحدة من أشهر المكتبات لتوليد PDF في Rust. توفر واجهة برمجة تطبيقات (API) للعمل مع البدائيات الرسومية والنصوص والخطوط. الإمكانيات الرئيسية:

  • إنشاء مستندات متعددة الصفحات؛
  • تضمين خطوط TrueType/OpenType؛
  • رسم الخطوط والمستطيلات والدوائر والأشكال الأخرى؛
  • إدراج الصور (PNG، JPEG)؛
  • العمل مع الألوان والشفافية؛
  • دعم Unicode والسيريلية.


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



use printpdf::*;use std::fs::File;use std::io::BufWriter;

fn main() { // إنشاء مستند بحجم A4 let (doc, page1, layer1) = PdfDocument::new( "مثال PDF في Rust", Mm(210.0), Mm(297.0), "Layer 1", );

// الحصول على الخط الحالي (Helvetica المدمج) let font = doc.add_builtin_font(BuiltinFont::Helvetica).unwrap();

// استخدام الطبقة للرسم let layer = doc.get_page(page1).get_layer(layer1);

// إضافة نص layer.use_text("مرحبًا بالعالم! PDF من Rust", 24.0, Mm(50.0), Mm(250.0), &font);

// حفظ الملف let file = File::create("hello.pdf").unwrap(); let writer = BufWriter::new(file); doc.save(&mut std::io::BufWriter::new(writer)).unwrap();}


مكتبة genpdf



genpdf هي غلاف فوق printpdf، توفر واجهة برمجة تطبيقات (API) ذات مستوى أعلى. إنها مثالية لإنشاء مستندات بتنسيق بسيط: العناوين والفقرات والقوائم والجداول. المزايا الرئيسية:

  • إدارة تلقائية لفواصل الصفحات؛
  • دعم الأنماط (عريض، مائل، تسطير)؛
  • دعم مدمج للجداول مع الخلايا والحدود؛
  • واجهة بسيطة لإضافة العناصر.


مثال لإنشاء PDF مع جدول باستخدام genpdf:



use genpdf::*;use genpdf::elements::*;use std::fs::File;

fn main() { // إنشاء مستند let mut doc = Document::new("Liberation Serif") .expect("فشل تحميل الخط");

// إعداد النمط الافتراضي doc.set_title("تقرير المبيعات");

// إضافة فقرة doc.push(Paragraph::new("المبيعات حسب الشهر:"));

// إنشاء جدول let mut table = Table::new(vec![2, 3, 2]); table.set_cell_border_style(BorderStyle::Solid); table.push_row(vec![ "الشهر".to_string(), "الإيرادات، روبل".to_stri

توصيات