jsPDF ممتاز للتصدير الخفيف داخل المتصفح
انتشار jsPDF مفهوم لأنه يحل مشكلة منتج حقيقية: إنشاء PDF داخل المتصفح دون تشغيل خدمة خلفية. يستطيع المطور رسم نصوص وخطوط وصور وجداول بسيطة، ثم بدء التنزيل من الصفحة نفسها. للنماذج الأولية، وشاشات الإدارة الصغيرة، والإيصالات المحلية، وPWAs التي يجب أن تعمل دون اتصال، هذا اختيار مناسب.
السؤال المنتجى هو أين يصبح حد المتصفح غير مناسب. عندما يتحول PDF إلى مستند عمل يمسحه العملاء، أو يؤرشفونه، أو يرسلونه بالبريد، أو يقدمونه لنظام آخر، لم يعد العمل مجرد “رسم ملف”. يصبح إدارة خطوط، ودقة باركود، وثباتا على الهاتف، ومخرجا حتميا، وأحيانا PDF/A أو حزمة فاتورة إلكترونية.
نفس مخرج PDF، لكن حد المنتج مختلف
مع jsPDF، تطبيق الواجهة هو محرك التوليد. كل تبويب متصفح عليه حمل المكتبة وأي خطوط مخصصة وصور وسيطة ومخرج الباركود وبايتات ملف PDF النهائي. هذا يبقي فاتورة المكتبة صفرا، لكنه ينقل مسؤولية الإنتاج إلى جهاز كل مستخدم.
مع gPdf، يرسل المتصفح أو الخلفية طلب DocumentRequest أو template_id + data. gPdf يمتلك بيئة التوليد والخطوط المدمجة وهندسة الباركود وإنشاء PDF الثنائي عند الحافة. يبقى التطبيق مسؤولا عن البيانات ومنطق القالب، لا عن محرك PDF.
ملاءمة المنتج: تصدير دون اتصال أم مستندات تشغيلية
اختر jsPDF عندما يكون PDF ميزة راحة محلية: زر تصدير صغير، إيصال لاتيني بسيط، لقطة لوحة معلومات، أو PWA يجب أن يواصل العمل دون شبكة.
اختر gPdf عندما يكون PDF جزءا من سير تشغيل: ملصقات شحن، بطاقات مستودع، فواتير، تذاكر، كشوف، نماذج جمركية، وإيصالات تجارة عابرة للحدود. هذه المستندات تحتاج المخرج نفسه عبر الأجهزة، لا أفضل ما يستطيع التبويب الحالي تجميعه بأمان.
نموذج التكلفة: مكتبة مجانية أم سطح إنتاج تتحمله أنت
ميزة jsPDF السعرية واضحة: المكتبة نفسها مفتوحة المصدر، وCPU المتصفح لا يظهر كبند في فاتورة السحابة. لميزة داخلية صغيرة، قد يكون هذا أرخص مسار.
تكلفة الإنتاج تظهر حول المكتبة:
- ملفات خطوط تدعم CJK أو وحدات خطوط base64 مولدة.
- مكتبات ترميز وتحويل باركود.
- أخطاء الذاكرة والتنزيل الخاصة بكل متصفح.
- QA للطباعة على الماسحات والطابعات الحرارية.
- اختبارات انحدار عبر سطح المكتب وiOS Safari وAndroid WebView والمتصفحات المضمنة.
gPdf يحول ذلك إلى فاتورة استخدام. تبدأ باقة Basic العامة من 5 دولارات/شهر مقابل 100,000 صفحة، ويبدأ التجاوز القياسي من 0.00005 دولار لكل صفحة. هذه تكلفة مورّد، لكنها تزيل الحاجة إلى جعل كل حزمة واجهة وكل جهاز مستخدم يتصرف كخدمة PDF إنتاجية.
تكلفة CJK ليست حجم الملف فقط
أول حد قاس هو نص CJK: الصينية واليابانية والكورية.
خطوط PDF القياسية المدمجة في jsPDF مفيدة للمخرجات اللاتينية البسيطة، لكنها لا تغطي كل Unicode. عندما يحتوي المستند على CJK، يحتاج التطبيق إلى خط يحتوي فعلا على تلك الحروف. عمليا، تنتهي تطبيقات المتصفح غالبا بتضمين TTF، أو تحويله إلى وحدة JavaScript base64، أو جلب بيانات الخط قبل إنشاء PDF.
تدفع هذه التكلفة مرتين: مرة كحزمة واجهة أكبر، ومرة أخرى كذاكرة متصفح أثناء إنشاء PDF. على الهاتف، قد يحتفظ التبويب نفسه بتطبيق الويب والخط ومخازن الباركود والصور وبايتات ملف PDF النهائي في الوقت نفسه.
gPdf يبقي هذا العمل في الخادم. المتصفح يرسل JSON منظما؛ ومحرك التوليد يختار من خطوط مدمجة تغطي Latin وGreek وCyrillic وCJK وArabic وDevanagari وBengali وThai وmonospace. طلب طلبية بحجم 2 KB لا يحتاج أن يتحول إلى مسار تسليم خط بحجم 12 MB.
تكلفة الباركود: الترميز سهل، وثبات الطباعة أصعب
في اللوجستيات والتجارة الإلكترونية والتصنيع والرعاية الصحية والتذاكر والتجزئة، قد يكون الباركود أهم من النص المرئي. الإنسان يقرأ رقم الطلب؛ التشغيل يقرأ Code 128 أو GS1-128 أو QR أو DataMatrix أو PDF417.
مع jsPDF، توليد الباركود عادة قرار منتج منفصل. تجمع الفرق jsPDF مع encoder آخر، ترسم الباركود كـ SVG أو canvas أو صورة، ثم تضع النتيجة داخل PDF. هذا يعمل لرمز QR على كوبون أو لإثبات مفهوم.
يصبح الأمر هشا عندما يكون الباركود المطبوع جزءا من التشغيل:
- قد يتم rasterize لباركود canvas بدقة خاطئة.
- قد يؤدي تحجيم الصورة إلى تشويش الأشرطة أو الوحدات أو الهوامش الهادئة.
- قد يغير المتصفح أو CSS transform أو مسار التصدير الحجم الفيزيائي النهائي.
- قد تحتاج صيغ باركود مختلفة إلى مكتبات أو مسارات تحويل مختلفة.
- طابعات 203 DPI الحرارية تكشف أخطاء القياس الصغيرة بسرعة.
gPdf يعامل الباركود كعنصر مستند. يحدد الطلب type: "barcode" وformat والمحتوى والحجم الفيزيائي بالمليمتر. يصدر محرك التوليد هندسة باركود متجهية داخل PDF لصيغ 1D و2D المدعومة، بحيث تبقى النصوص والأشكال والجداول والصور والباركود في نظام إحداثيات واحد.
Studio وتكرار القوالب
jsPDF مساره code-first. تغيير التخطيط يعني عادة تعديل أوامر الرسم والمواضع وتسجيل الخطوط وتحويل الصور ووضع الباركود في JavaScript.
gPdf يدعم سير API-first نفسه، لكنه يضيف gPdf Studio كمصمم بصري مجاني لتخطيط PDF. تستطيع الفرق إضافة وسحب النصوص والصور والجداول والأشكال والرؤوس والتذييلات والباركود، ثم ربط التصميم بتوليد template_id + data. هذا مهم عندما يتغير شكل الملصق أو الفاتورة أو الإيصال كثيرا، ويحتاج غير المتخصصين في PDF إلى المشاركة في التخطيط.
متصفحات الهاتف ليست المكان الصحيح لعمل PDF ثقيل
يبدو إنشاء PDF في جهة العميل رخيصا لأن فاتورة الخادم صفر. التكلفة تنتقل إلى جهاز المستخدم.
على سطح المكتب قد يكون ذلك مقبولا. على متصفحات الهاتف، يستطيع مستند إنتاجي أن يضغط التبويب بقوة: بيانات خطوط CJK، وصور base64، ومخازن canvas، وصور باركود، وبايتات PDF مولد، والتطبيق نفسه، كلها تتنافس على الذاكرة في الوقت نفسه. iOS Safari وأجهزة Android منخفضة الذاكرة أقل تسامحا من حاسوب المطور.
نقل التوليد إلى gPdf يغير شكل المشكلة. يبني المتصفح طلب JSON صغيرا، ينتظر استجابة ثنائية، وينزل PDF جاهزا. لم يعد تبويب المستخدم مضطرا أن يكون مدير خطوط ومحرك باركود ومحرك تخطيط وكاتب PDF ثنائي.
متى يظل jsPDF هو الاختيار الصحيح
توجد أسباب قوية للإبقاء على jsPDF.
إذا كان على المستخدم التصدير وهو دون اتصال، فـ jsPDF أنسب. إذا كانت البيانات لا يجوز أن تغادر الجهاز إطلاقا، فالتوليد في المتصفح حد خصوصية أوضح. إذا كان المستند صغيرا ولاتينيا فقط ويستخدم نادرا، فقد لا تستحق إضافة API تشغيلية. للنماذج الأولية والأدوات الداخلية، jsPDF غالبا هو أسرع طريق.
يتغير القرار عندما يصبح المخرج جزءا من سير تشغيل: ملصق شحن يجب أن يمسح، أو فاتورة يجب أن تؤرشف، أو تذكرة يجب أن تتحقق، أو مستند طلب عابر للحدود يجب أن يعرض أسماء CJK بشكل صحيح. عندها تصبح عبارة “أنشئ PDF في المتصفح” أقل أهمية من “أنشئ PDF إنتاجيا موثوقا كل مرة”.
شكل الهجرة
الهجرة ليست “استبدال استدعاء دالة”. إنها انتقال من الرسم الإجرائي داخل المتصفح إلى طلب مستند منظم.
- // Before: browser-side drawing with jsPDF plus extra font/barcode setup.
- import { jsPDF } from "jspdf";
- import JsBarcode from "jsbarcode";
-
- const doc = new jsPDF({ unit: "mm", format: [100, 150] });
- // Load a CJK-capable TTF and register it before drawing CJK text.
- doc.addFileToVFS("NotoSansCJK-Regular.ttf", base64Font);
- doc.addFont("NotoSansCJK-Regular.ttf", "NotoSansCJK", "normal");
- doc.setFont("NotoSansCJK");
- doc.text("跨境订单 / Cross-border order", 6, 10);
-
- // Generate a barcode separately, then place it into the PDF.
- JsBarcode(canvas, "PDN0003507278", { format: "CODE128" });
- doc.addImage(canvas.toDataURL("image/png"), "PNG", 6, 72, 72, 20);
- doc.save("label.pdf");
+
+ // After: send one structured DocumentRequest to gPdf.
+ const res = await fetch("https://api.gpdf.com/api/v1/pdf/render", {
+ method: "POST",
+ headers: {
+ Authorization: `Bearer ${KEY}`,
+ "Content-Type": "application/json"
+ },
+ body: JSON.stringify({
+ settings: {
+ defaults: {
+ text: {
+ font_family: "NotoSans-Regular",
+ font_mode: "prefer",
+ font_size: 9,
+ color: "#111827"
+ }
+ }
+ },
+ pages: [{
+ width: 100,
+ height: 150,
+ elements: [
+ {
+ type: "text",
+ x: 6,
+ y: 8,
+ content: "跨境订单 / Cross-border order",
+ style: { width: 88, font_size: 12, font_weight: "bold" }
+ },
+ {
+ type: "barcode",
+ x: 6,
+ y: 70,
+ width: 72,
+ height: 18,
+ format: "code128",
+ content: "PDN0003507278",
+ barcode_text: { enabled: true, position: "bottom", offset: 1 }
+ },
+ {
+ type: "barcode",
+ x: 80,
+ y: 8,
+ width: 14,
+ height: 14,
+ format: "qrcode",
+ content: "https://track.example/PDN0003507278",
+ barcode_text: { enabled: false, position: "bottom" }
+ }
+ ]
+ }]
+ })
+ });
+ const pdf = await res.arrayBuffer();
التحول المهم هو الملكية. مع jsPDF، يمتلك تطبيق الويب مسار خطوط CJK، ومسار توليد الباركود، وملف ذاكرة المتصفح، وسلوك التصدير. مع gPdf، يمتلك تطبيقك البيانات والقالب؛ ويمتلك محرك التوليد عند الحافة ميكانيكا المستند.
سيناريوهات PDF ذات صلة
الفرق التي تقارن jsPDF وgPdf تبحث غالبا عن توليد PDF يدعم CJK وبدائل PDF داخل المتصفح، لكنها تصل أيضا إلى أسئلة عملية: هل يمكن استخدام JSON to PDF API بدل حزمة متصفح ثقيلة، هل يمكن توليد PDF الفاتورة وملصقات الشحن من بيانات منظمة، وهل يجب أن يكون باركود GS1 وPDF/A جزءا من API مضبوطة لا من كود الواجهة.
الأسئلة الشائعة
هل jsPDF مجاني؟ المكتبة نفسها مفتوحة المصدر. تكلفة الإنتاج هي العمل المحيط بها: خطوط CJK، ومكتبات الباركود، وQA للمتصفحات، وQA للطباعة، ودعم الأجهزة التي تنفد ذاكرتها.
هل يحل gPdf محل كل استخدامات jsPDF؟ لا. التصدير دون اتصال من المتصفح والمستندات المحلية بالكامل ما زالا المجال الطبيعي لـ jsPDF. gPdf مخصص لمستندات الإنتاج عندما يستحق محرك توليد مضبوط استدعاء API.
لماذا نذكر تكلفة الباركود بشكل منفصل؟ لأن باركودا يبدو صحيحا على الشاشة قد يفشل بعد التحجيم أو rasterization أو الطباعة الحرارية. المستندات التشغيلية تحتاج موثوقية ماسح، لا نمطا مرئيا فقط.
راجع أيضا
- مرجع gPdf API -
DocumentRequest، عناصر الباركود، بدائل الخطوط، ونقاط التوليد. - باركود vector مقابل raster داخل ملفات PDF - لماذا تهم هندسة الباركود بعد الطباعة.
- GS1 barcode API - تفاصيل صيغ GS1 وقياس الباركود للملصقات.
- شرح PDF/A و Factur-X للمهندسين - متى تدخل متطلبات الأرشفة والفوترة الإلكترونية إلى مسار PDF.