توليد PDF في JavaScript (Node.js): دليل شامل للمكتبات والأدوات
يعد توليد مستندات PDF من أكثر المهام المطلوبة في تطوير الويب. من إنشاء الفواتير والتقارير إلى تكوين مستندات متعددة الصفحات المعقدة، تقدم Node.js أدوات قوية للعمل مع PDF. في هذه المقالة، سنستعرض المكتبات والمناهج الرئيسية لإنشاء ملفات PDF على جانب الخادم في JavaScript.
لماذا توليد PDF على الخادم؟
يتيح توليد 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.moveTo(100, 150).lineTo(400, 150).stroke();
// إدراج صورةdoc.image('logo.png', 100, 200, { width: 100 });
doc.end();المزايا: خفيف الوزن، سريع، يدعم Unicode والسيريلية، العديد من الخطوط.
العيوب: يتطلب ضبط التخطيط يدويًا، لا يوجد دعم مدمج لـ HTML.
2. Puppeteer — التوليد من HTML
Puppeteer هي مكتبة للتحكم في متصفح Chrome بدون واجهة رسومية. تتيح تحويل صفحات HTML إلى PDF مع الحفاظ على جميع الأنماط والبرامج النصية.
const puppeteer = require('puppeteer');
async function generatePDF() { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.setContent('<h1 style="color: red;">عنوان PDF</h1><p>نص المستند</p>'); await page.pdf({ path: 'output.pdf', format: 'A4', margin: { top: '20px', bottom: '20px' } }); await browser.close();}
generatePDF();المزايا: مثالي للتخطيطات HTML المعقدة، يدعم CSS وJavaScript والخطوط.
العيوب: ثقيل الوزن (يتطلب Chromium)، أبطأ من المكتبات الأخرى.
3. pdf-lib — تعديل ملفات PDF الموجودة
pdf-lib متخصصة في تحرير مستندات PDF الموجودة. تتيح إضافة النصوص والصور وملء النماذج.
const { PDFDocument } = require('pdf-lib');const fs = require('fs');
async function editPDF() { const existingPdfBytes = fs.readFileSync('template.pdf'); const pdfDoc = await PDFDocument.load(existingPdfBytes); const pages = pdfDoc.getPages(); const firstPage = pages[0]; firstPage.drawText('نص جديد', { x: 50, y: 50, size: 20, color: rgb(0, 0, 0) }); const pdfBytes = await pdfDoc.save(); fs.writeFileSync('modified.pdf', pdfBytes);}
editPDF();المزايا: خفيف الوزن، لا يتطلب تبعيات خارجية، يعمل بشكل ممتاز مع النماذج.
العيوب: إمكانيات محدودة لإنشاء تخطيطات معقدة من الصفر.
4. jsPDF — حل خادم-عميل
jsPDF تم إنشاؤها في الأصل للمتصفح، ولكنها تعمل أيضًا في Node.js. مناسبة للمستندات البسيطة.
const { jsPDF } = require("jspdf");
const doc = new jsPDF();doc.text("Hello world!", 10, 10);doc.save("output.pdf");المزايا: واجهة برمجة تطبيقات بسيطة، تعمل على العميل والخادم.
العيوب:
أيضاً في المكتبة
توصيات