توليد تقارير PDF باستخدام JavaScript (Node.js): Puppeteer، PDFKit، jsPDF
إنشاء مستندات PDF هي إحدى المهام الأكثر شيوعًا في تطوير الويب. التقارير، الفواتير، الشهادات، التوثيق – كلها تتطلب أداة موثوقة لتوليد الملفات على جانب الخادم. في نظام Node.js البيئي، توجد عدة مكتبات قوية، كل منها يحل المشكلة بطريقته الخاصة. في هذه المقالة، سنستعرض ثلاث طرق رئيسية: محاكاة المتصفح عبر Puppeteer، العمل منخفض المستوى مع PDF عبر PDFKit، والحل الخادم-العميل jsPDF.
1. Puppeteer — توليد PDF من HTML/CSS
Puppeteer هي مكتبة للتحكم في متصفح Chromium بدون واجهة رسومية. تتيح لك تحميل أي صفحة HTML، وتطبيق الأنماط، و"تصويرها" إلى PDF. هذا هو الخيار المثالي إذا كان لديك بالفعل تخطيط تقارير HTML/CSS وتريد نقلًا دقيقًا إلى PDF.
الإمكانيات الرئيسية:
- دعم جميع خصائص CSS (Flexbox، Grid، الخطوط، الظلال).
- العمل مع JavaScript في الصفحة (رسوم بيانية Chart.js، جداول ديناميكية).
- تخصيص الحجم، الهوامش، الرؤوس والتذييلات، الخلفيات.
- دعم الخطوط المخصصة (TTF، OTF).
مثال لتوليد تقرير:
const puppeteer = require('puppeteer');
async function generateReport() { const browser = await puppeteer.launch(); const page = await browser.newPage();
// تحميل HTML مباشرة (أو عبر URL) await page.setContent(` <html> <head> <style> body { font-family: Arial; padding: 40px; } h1 { color: #2c3e50; } .data { background: #ecf0f1; padding: 20px; } </style> </head> <body> <h1>تقرير المبيعات</h1> <div class="data"> <p>الإيرادات: 1,200,000 روبل</p> <p>عدد الطلبات: 345</p> </div> </body> </html> `, { waitUntil: 'networkidle0' });
await page.pdf({ path: 'report.pdf', format: 'A4', printBackground: true, margin: { top: '20mm', bottom: '20mm' } });
await browser.close(); console.log('تم إنشاء PDF!');}
generateReport();الإيجابيات: دقة التخطيط، دعم التصاميم المعقدة، العمل مع الرسوم البيانية.
السلبيات: استهلاك عالي للذاكرة (Chromium يزن حوالي 200 ميجابايت)، بدء تشغيل بطيء.
2. PDFKit — إنشاء PDF منخفض المستوى
PDFKit هي مكتبة للتعامل المباشر مع بنية PDF. لا تستخدم HTML، بل تقوم ببناء المستند برمجيًا: رسم الخطوط، إضافة النصوص، إدراج الصور. يمنحك هذا تحكمًا كاملاً في كل بكسل من المستند.
الإمكانيات الرئيسية:
- رسومات متجهة (خطوط، مستطيلات، منحنيات).
- دعم Unicode وتضمين الخطوط.
- إنشاء الجداول، ترقيم الصفحات.
- العمل مع التعليقات التوضيحية والروابط.
مثال لإنشاء فاتورة بسيطة:
const PDFDocument = require('pdfkit');const fs = require('fs');
const doc = new PDFDocument({ size: 'A4', margin: 50 });doc.pipe(fs.createWriteStream('invoice.pdf'));
// العنوانdoc.fontSize(24).text('فاتورة رقم 12345', { align: 'center' });doc.moveDown();
// الجدول (يدويًا)doc.fontSize(12).text('الاسم', 50, 150);doc.text('الكمية', 350, 150);doc.text('السعر', 450, 150);
doc.moveTo(50, 170).lineTo(550, 170).stroke();
doc.text('خدمات التطوير', 50, 180);doc.text('1', 350, 180);doc.text('150,000 روبل', 450, 180);
doc.moveDown(2);doc.fontSize(16).text('الإجمالي: 150,000 روبل',