توليد PDF في JavaScript (Node.js): المكتبات والأدوات
يعد توليد مستندات PDF من المهام الشائعة في تطوير الويب. الفواتير، التقارير، الشهادات، التذاكر - كل هذا من السهل إنشاؤه على جانب الخادم. في نظام Node.js البيئي، توجد عدة حلول ناضجة، كل منها مناسب لسيناريوهات معينة. في هذه المقالة، سنستعرض ثلاثة أساليب رئيسية ومكتبات شائعة لإنشاء PDF بلغة JavaScript.
نظرة عامة على المكتبات الشائعة
يعتمد اختيار الأداة على تعقيد المستند: تقارير نصية بسيطة، جداول بيانات، أو تخطيطات معقدة مع HTML+CSS. فيما يلي ثلاث مكتبات رئيسية.
1. PDFKit - العمل منخفض المستوى مع PDF
PDFKit هي المكتبة الأكثر شعبية لإنشاء PDF "من الصفر". تتيح لك رسم النصوص، الخطوط، المستطيلات، الصور باستخدام شبكة إحداثيات. مثالية للمستندات الديناميكية ذات التموضع الدقيق.
مزايا PDFKit:
- تحكم كامل في كل عنصر من عناصر الصفحة
- لا يتطلب متصفحًا أو Puppeteer
- دعم تضمين الخطوط (TrueType, OpenType)
- يعمل بشكل غير متزامن مع التدفقات (Stream API)
مثال على مستند بسيط:
const PDFDocument = require('pdfkit');const fs = require('fs');
const doc = new PDFDocument();doc.pipe(fs.createWriteStream('output.pdf'));
// العنوانdoc.fontSize(25).text('مرحبًا، PDFKit!', 100, 100);
// نص عاديdoc.fontSize(12).text('هذا مستند PDF بسيط تم إنشاؤه على Node.js.', 100, 150);
// رسم خطdoc.moveTo(100, 200).lineTo(500, 200).stroke();
// إضافة صورةdoc.image('logo.png', 100, 220, { width: 100 });
doc.end();2. Puppeteer - التوليد من HTML/CSS
Puppeteer هي مكتبة للتحكم في متصفح Chrome بدون واجهة رسومية (headless). تتيح لك تحميل صفحة HTML (أو إنشاؤها أثناء التشغيل) وحفظها بصيغة PDF. هذا هو الخيار الأفضل إذا كان لديك بالفعل قوالب HTML أو أنماط CSS معقدة.
مزايا Puppeteer:
- عرض دقيق لـ CSS (flex, grid, الخطوط)
- دعم JavaScript في الصفحة (الرسوم البيانية، الجداول)
- إمكانية تحديد التنسيق، الهوامش، الرؤوس والتذييلات
- مثالي للتقارير والفواتير
مثال على توليد PDF من HTML:
const puppeteer = require('puppeteer');
(async () => { const browser = await puppeteer.launch(); const page = await browser.newPage();
const html = `<!DOCTYPE html> <html> <head><style> body { font-family: Arial; padding: 20px; } h1 { color: #2c3e50; } table { border-collapse: collapse; width: 100%; } td, th { border: 1px solid #ccc; padding: 8px; } </style></head> <body> <h1>تقرير الشهر</h1> <table> <tr><th>المنتج</th><th>الكمية</th></tr> <tr><td>لابتوب</td><td>5</td></tr> <tr><td>فأرة</td><td>10</td></tr> </table> </body></html>`;
await page.setContent(html); await page.pdf({ path: 'report.pdf', format: 'A4', printBackground: true });
await browser.close(); console.log('تم إنشاء PDF!');})();3. jsPDF - التوليد على العميل (وفي Node.js)
jsPDF تم إنشاؤه في الأصل للمتصفح، ولكن له إصدار لـ Node.js. إنه خفيف الوزن ومناسب تمامًا للمستندات البسيطة. في Node.js، يُستخدم عبر الحزمة jspdf مع تبعيات إضافية.
مزايا jsPDF:
- حجم صغير
- دعم Unicode واللغة العربية (من خلال تحميل الخطوط)
- يمكن أن يعمل على كل من العميل والخادم