توليد PDF في Rust: نظرة عامة على المكتبات والأدوات
Rust هي لغة برمجة أنظمة حديثة تُستخدم بشكل متزايد لإنشاء تطبيقات خادم عالية الأداء، بما في ذلك توليد المستندات. في هذه المقالة، سنستعرض المكتبات الرئيسية لإنشاء ملفات PDF في Rust، وإمكانياتها، وأمثلة على الاستخدام، وتوصيات للاختيار.
المكتبات الرئيسية للعمل مع PDF في Rust
يقدم نظام Rust البيئي العديد من الحلول الناضجة لتوليد PDF. دعنا نستعرض الأكثر شيوعًا:
- printpdf — مكتبة منخفضة المستوى تدعم الرسومات المتجهة والصور والخطوط.
- genpdf — مكتبة عالية المستوى لإنشاء المستندات بواجهة برمجة تطبيقات بسيطة.
- pdf_writer — مولد PDF سريع وآمن مع تبعيات قليلة.
- wkhtmltopdf — غلاف للأداة wkhtmltopdf لتحويل HTML إلى PDF.
مكتبة printpdf
printpdf هي واحدة من أشهر المكتبات لتوليد PDF في Rust. توفر تحكمًا كاملاً في محتوى المستند: النصوص، الخطوط، المستطيلات، الصور، والخطوط المضمنة.
التثبيت
[dependencies]printpdf = "0.7"مثال: إنشاء PDF بسيط مع نص
use printpdf::*;use std::fs::File;use std::io::BufWriter;
fn main() { // إنشاء مستند بحجم A4 let (doc, page1, layer1) = PdfDocument::new( "مثال على مستند", Mm(210.0), Mm(297.0), "Layer 1" );
// الحصول على الخط الحالي (مضمن) let font = doc.add_builtin_font(BuiltinFont::Helvetica).unwrap();
// رسم النص let current_layer = doc.get_page(page1).get_layer(layer1); current_layer.use_text( "مرحبًا، عالم PDF من Rust!", 24.0, Mm(20.0), Mm(270.0), &font );
// الحفظ في ملف let file = File::create("example.pdf").unwrap(); let writer = BufWriter::new(file); doc.save(&mut std::io::BufWriter::new(writer)).unwrap();}مكتبة genpdf
genpdf توفر واجهة برمجة تطبيقات عالية المستوى تشبه العمل مع معالجات النصوص. تدعم الفقرات والجداول والعناوين والتفاف النص التلقائي.
التثبيت
[dependencies]genpdf = "0.2"مثال: إنشاء مستند بعنوان وجدول
use genpdf::{Document, SimplePageSettings};use genpdf::elements::{Paragraph, Table, TableLayout};use genpdf::fonts::FontFamily;
fn main() -> Result<(), Box> { // تحميل الخط (مثال: DejaVu Sans) let font_family = FontFamily::from_files( "/usr/share/fonts/truetype/dejavu/", "DejaVuSans", None )?;
// إنشاء المستند let mut doc = Document::new(font_family, SimplePageSettings::a4());
// إضافة عنوان doc.push(Paragraph::new("تقرير المبيعات").aligned(genpdf::Alignment::Center));
// إنشاء جدول let mut table = Table::new(TableLayout::new(vec![2, 3, 2])); table.row() .element(Paragraph::new("المنتج")) .element(Paragraph::new("الكمية")) .element(Paragraph::new("السعر")); table.row() .element(Paragraph::new("لابتوب")) .element(Paragraph::new("10")) .element(Paragraph::new("50,000 روبل")); table.row() .element(Paragraph::new("فأرة")) .element(Paragraph::new("50")) .element(Paragraph::new("1,500 روبل"));
doc.push(table);
// الحفظ doc.render_to_file("report.pdf")?; Ok(())} مكتبة pdf_writer
pdf_writer — مكتبة بسيطة وسريعة، موجهة للعمل منخفض المستوى مع هياكل PDF. ت