توليد PDF في JavaScript (Node.js): مراجعة المكتبات والأدوات
إنشاء مستندات PDF هي إحدى المهام الشائعة في تطوير الويب. سواء كان ذلك لإنشاء الفواتير، التقارير، الشهادات أو مجرد تصدير البيانات، يقدم Node.js عدة حلول قوية. في هذه المقالة، سنستعرض المكتبات الرئيسية للعمل مع PDF على جانب الخادم في JavaScript، وإمكانياتها وأمثلة على الاستخدام.
لماذا توليد PDF على الخادم؟
توليد PDF على الخادم (في Node.js) يوفر عدة مزايا:
- التوحيد — يبدو المستند متطابقاً على جميع الأجهزة
- الأمان — لا تغادر البيانات الخادم
- الأتمتة — يمكن إنشاء PDF وفق جدول زمني أو عند أحداث معينة
- دعم المنطق المعقد — الوصول إلى قواعد البيانات، نظام الملفات والموارد الأخرى
المكتبات الرئيسية لتوليد PDF في Node.js
1. PDFKit
PDFKit هي المكتبة الأكثر شهرة لإنشاء PDF "من الصفر". لا تتطلب تبعيات خارجية وتتيح التحكم الكامل في محتوى المستند.
مثال على الاستخدام:
const PDFDocument = require('pdfkit');const fs = require('fs');
const doc = new PDFDocument();doc.pipe(fs.createWriteStream('output.pdf'));
// إضافة محتوىdoc.fontSize(25).text('مرحباً، أيها العالم!', 100, 100);doc.fontSize(12).text('هذا PDF تم إنشاؤه باستخدام PDFKit.', 100, 150);
// رسم خطdoc.moveTo(100, 200).lineTo(500, 200).stroke();
// إنهاء المستندdoc.end();الإمكانيات:
- إضافة نصوص بخطوط وأحجام مختلفة
- إدراج الصور (JPEG, PNG)
- رسم الخطوط، المستطيلات والدوائر
- دعم الروابط والإشارات المرجعية
- إنشاء مستندات متعددة الصفحات
2. Puppeteer
Puppeteer هي أداة للتحكم في متصفح Chrome/Chromium. تتيح توليد PDF من صفحات HTML، وهو مناسب للتخطيطات المعقدة.
مثال على الاستخدام:
const puppeteer = require('puppeteer');
async function generatePDF() { const browser = await puppeteer.launch(); const page = await browser.newPage();
await page.setContent('<h1>عنوان</h1><p>نص المستند</p>'); await page.pdf({ path: 'page.pdf', format: 'A4' });
await browser.close();}
generatePDF();الميزات:
- دعم CSS، JavaScript وجميع تقنيات الويب الحديثة
- مثالي لتحويل قوالب HTML إلى PDF
- إمكانية الطباعة بمعايير محددة (الحجم، الهوامش، المقياس)
- يتطلب تثبيت Chromium (~300 ميجابايت)
3. jsPDF (مع التكيف لـ Node.js)
jsPDF هي مكتبة عميل، ولكن توجد أغلفة لاستخدامها في Node.js (مثل jspdf-autotable).
مثال (باستخدام jspdf و html2canvas):
const { jsPDF } = require('jspdf');const fs = require('fs');
const doc = new jsPDF();doc.text('مرحباً من Node.js!', 10, 10);doc.save('output.pdf');القيود: لا يدعم jsPDF التخطيطات المعقدة ويتطلب مكتبات إضافية للعمل مع HTML.
4. pdfmake
pdfmake هي مكتبة تعتمد على الوصف التصريحي للمستند بتنسيق JSON.
مثال:
const pdfmake = require('pdfmake');const fs = require('fs');
const fonts = { Roboto: { normal: 'fonts/Roboto-Regular.ttf', bold: 'fonts/Roboto-Medium.ttf' }};
const printer = new pdfmake(fonts);
const docDefinition = { content: [ { text: