QuestPDF ممتاز عندما يكون C# هو حد المنتج
QuestPDF يستحق مقارنة منصفة. هو مكتبة حديثة لتوليد PDF لمطوري C#، مع API سلسة وكتابة قوية ومساحة توثيق واسعة وتطبيق Companion للمعاينة والتصحيح، وترخيص واضح على نحو غير شائع في عالم PDF SDK.
السؤال المنتج ليس “من يستطيع إنشاء PDF؟” كلاهما يستطيع. السؤال المفيد هو أين يجب أن يعيش حد PDF: داخل تطبيق .NET يملك التخطيط والبايتات ودورة الحياة، أم كخدمة بنية تحتية تستدعيها عدة منتجات ولغات.
دليل قرار سريع
- اختر QuestPDF عندما يكون C# هو مصدر الحقيقة للمستند، أو يجب أن يعمل التطبيق دون اتصال، أو تحتاج عمليات محلية على ملفات PDF موجودة.
- اختر gPdf عندما يجب أن تخدم طبقة PDF واحدة Node وPython وGo و.NET والمهام والأنظمة الإقليمية عبر HTTP API نفسها.
- اختر gPdf عندما يجب أن تكون تغييرات التخطيط مراجعات قوالب، لا إعادة بناء C# ولا إعادة نشر خدمة.
نفس عائلة المستندات، لكن نموذج الملكية مختلف
مع QuestPDF، التطبيق يملك توليد PDF. وهذه قوة حقيقية: يبقى C# قرب نموذج المجال لديك، يعمل ويصحح محليا، ولا يوجد استدعاء وقت تشغيل إلى API خارجي.
المقابل أن الفريق يملك أيضا بقية سطح الإنتاج:
- CPU وذاكرة للتوليد.
- اكتشاف الخطوط وبدائلها في كل بيئة نشر.
- دمج مكتبة الباركود واختبار جودة الطباعة.
- الحزم الأصلية وهموم النشر لتكاملات الرسوم أو الرسومات المخصصة.
- مراقبة وإعادة محاولات ومعالجة الفشل.
- نشر إقليمي عندما يكون المستخدمون أو المستودعات عالميين.
- طرح إصدارات كلما تغير تخطيط المستند.
مع gPdf، ينتقل هذا السطح إلى الخارج: يرسل التطبيق DocumentRequest أو template_id + data، والخدمة تملك المحرك وبيئة الحافة والخطوط وعناصر الباركود ومخرج PDF/A وحزم الفواتير الإلكترونية. هو أقل جاذبية إن أردت كل تفصيل داخل C#، وأكثر جاذبية إن كان توليد PDF طبقة خدمة يمكن لأي حزمة تقنية استدعاؤها.
ثلاثة تنازلات يجب على API مستضاف توضيحها بصراحة
معظم عروض “مكتبة مقابل API” تتجاوز أول ثلاثة أسئلة يسألها معماري .NET. المقارنة العادلة تجيب عنها صراحة.
1. أين تذهب بيانات المستند. هذه الصفحة تتحدث كثيرا عن الفواتير والكشوف والفواتير الإلكترونية — مستندات ممتلئة بأسماء وعناوين ومعرفات ضريبية ومبالغ. مع QuestPDF، تبنى هذه البايتات داخل العملية لديك ولا تغادر. API العامة في gPdf ترسل الحمولة إلى المحرك، لكن المحرك بلا احتفاظ: يبقى طلب JSON داخل عزل Cloudflare Workers V8 فقط أثناء التوليد (~4 ms عادة)، ويحرر عند اكتمال الاستجابة — لا يخزن ولا يسجل ولا تؤخذ منه عينات ولا يستخدم للتدريب، مع سجلات تشغيلية محصورة في حالة HTTP والمدة (security, DPA). اختيار إقامة البيانات الأوروبية أو العالمية والنشر المحلي أو الخاص للمؤسسات يقلل التعرض أو يغلقه. رغم ذلك، إبقاء التوليد داخل العملية بلا إعداد إضافي سبب مشروع، وأحيانا حاسم، يجعل فرق الماليات أو القطاع العام تختار QuestPDF.
2. نمط الفشل. المكتبة لا تملك طرفا ثالثا يمكن أن يتعطل؛ التوليد يفشل فقط على بنية تملكها أصلا. API مستضافة تضيف اعتماد توفر لا تتحكم به. الطريقة الصحيحة لاعتماد gPdf هي معاملة استدعاءات التوليد مثل أي استدعاء خارجي: مهلة، وإعادة محاولة، وطابور، ويفضل وضع تراجع متدرج. إذا كان توليد المستند على مسار متزامن حرج، فقارن بوضوح بين “تشغله بنفسك” و“تعتمد على توفر المورّد.“
3. ملف زمن الاستجابة. التوليد داخل العملية هو استدعاء دالة بلا شبكة. الاستدعاء المستضاف هو رحلة شبكة ذهابا وإيابا. في الدُفعات والمهام غير المتزامنة غالبا يكون هذا ضجيجا بسيطا. أما في “المستخدم ضغط، ويجب أن يظهر PDF الآن” فالتوليد داخل العملية أسرع بنيويا — نقاط حضور gPdf عند الحافة تجعل القفزة صغيرة، لكنها تبقى TLS مع رحلة شبكة، بينما QuestPDF استدعاء طريقة.
لا تجعل هذه النقاط gPdf خيارا خاطئا؛ بل تحدد متى يكون الخيار الصحيح — للفرق التي يمكن أن تغادر بيانات مستنداتها العملية، وتتحمل تدفقاتها قفزة شبكة، وتفضل الاعتماد على توفر المورّد بدلا من تشغيل أسطول توليد بنفسها.
الترخيص ونموذج السعر
صفحة الترخيص العامة لـ QuestPDF تقول إن الرخصة التجارية مطلوبة فقط للشركات التي تتجاوز 1 مليون دولار من إجمالي الإيراد السنوي. مستوى Community مجاني وفق شروط MIT للأفراد المؤهلين ومشاريع المصدر المفتوح والمنظمات غير الربحية والشركات دون ذلك الحد. الصفحة نفسها تعرض رخصتين تجاريتين دائمتين: Professional بسعر 999 دولارا مع الضريبة المحلية لفرق حتى 10 مطورين، وEnterprise بسعر 2,999 دولارا مع الضريبة المحلية لكامل المؤسسة دون عد للمطورين. كلاهما يشمل سنة تحديثات ومشاريع وخوادم ونشرات غير محدودة، والرخصة لا تنتهي لآخر نسخة حصلت عليها.
نموذج الإنفاذ خفيف أيضا. تضبط الرخصة بسطر واحد — QuestPDF.Settings.License = LicenseType.Community; — بلا مفتاح رخصة ولا خادم تفعيل، ووفق صفحة الإعداد الخاصة بـ QuestPDF لا توجد استدعاءات شبكة ولا بيانات تغادر الجهاز. هو نموذج قائم على الثقة: تختار المستوى الذي ينطبق عليك. لا توجد فاتورة مورّد لكل مستند، والرخصة المدفوعة تعمل في أي مكان، حتى دون اتصال كامل.
gPdf يسعر خدمة التوليد مباشرة. خطة Basic العامة تبدأ من 5 دولارات/شهر مقابل 100,000 صفحة، والزيادة تبدأ من 0.00005 دولار لكل صفحة. هذه فاتورة مورّد، لكنها تلغي مشروع تشغيل توليد PDF: لا عنقود توليد، لا مسار نشر NuGet، لا مجموعة دافئة إقليمية، لا حزمة خطوط لكل تطبيق، ولا خدمة PDF تحتاج ترقيعا.
لذلك ليست المقارنة “999 دولارا مقابل 5 دولارات” — الرخصة هي السطر الصغير. المقارنة الحقيقية:
QuestPDF total = license (one-time) + your hosting + your engineer-time + on-call
gPdf total = page bill (infrastructure, fonts, scaling, and edge included)
وفق الحساب العام لكل صفحة، تجاوز gPdf هو 0.05 دولار لكل 1,000 صفحة (50 دولارا لكل مليون، و500 دولار لكل 10 ملايين). رخصة Enterprise بسعر 2,999 دولارا لا تكسر التعادل مع تلك الفاتورة إلا قرب 60 مليون صفحة — وهذا الحساب يتجاهل استضافة QuestPDF وأشهر عمل المهندسين، ما يدفع نقطة التعادل الحقيقية أبعد لصالح gPdf إلا إذا كنت تشغل تلك البنية بثمن رخيص أصلا. القاعدة العملية: إذا كنت ستبني وتوظف لتشغيل خدمة توليد لمجرد استخدام المكتبة، فغالبا يفوز gPdf في التكلفة الكلية قبل أن تلحق فاتورة الصفحات بسعر الرخصة؛ أما إن كانت البنية موجودة وقريبة من المجانية لديك، فالرخصة الدائمة تفوز عند الحجم الكبير.
سير عمل التطوير: Fluent C# مقابل القوالب
API السلسة في QuestPDF ملائمة عندما يملك المطورون شكل المستند. الكتابة القوية وسلاسل الطرق ومكونات C# القابلة لإعادة الاستخدام وإعادة الهيكلة داخل IDE وتطبيق Companion كلها منطقية عندما يكون PDF جزءا من قاعدة كود التطبيق.
gPdf يناسب مسارا مختلفا. يمكن للمطورين كتابة JSON مباشرة، لكن أنظمة الإنتاج غالبا تنتقل إلى القوالب. المصمم أو المشغل أو المهندس يعدل التخطيط في gPdf Studio. التخطيط المعتمد يصبح قالبا، والخلفية تستمر في التوليد عبر template_id + data.
هذه النقطة مهمة عندما يتغير المستند كثيرا. إذا تغير ملصق الناقل أو الفاتورة أو إيصال التعبئة أو تخطيط الكشف، يستطيع gPdf إبقاء بيئة التشغيل مستقرة وتحريك القالب فقط. مع QuestPDF التخطيط هو كود C#، والمسار الطبيعي هو تغيير كود ثم اختبار ثم بناء ثم نشر ثم خطة رجوع.
لا يوجد مسار أفضل دائما: QuestPDF يحسن تجربة مطوري C# الذين يريدون المستند ككود؛ gPdf يناسب القوالب التشغيلية المشتركة بين الأنظمة.
الامتثال: كلا المنتجين يتعامل معه بجدية
هذه ليست مقارنة يفوز فيها gPdf لأنه يقول إن المنافس بلا ميزات امتثال. مواد QuestPDF العامة الحالية تعرض دعما قويا للمعايير، بما في ذلك PDF/A وPDF/UA-1 وEN 16931 للفوترة الإلكترونية عبر مثال ZUGFeRD 2.1 / Factur-X مبني على معيار UN/CEFACT Cross Industry Invoice (CII). المثال يضبط PdfA = true، يضمن factur-x.xml عبر AddAttachment()، يوسع المستند ببيانات XMP وصفية، ويتحقق من النتيجة باستخدام veraPDF (لـ PDF/A-3b) وMustang Project (لـ ZUGFeRD). إنها وصفة كاملة وصريحة — ومسارك أنت يملك كل خطوة فيها.
gPdf يغلف نفس المعايير كعقد API. JSON Render يعرض ستة ملفات PDF/A (1b, 2b, 3b, 4, 2u, 3u) إضافة إلى PDF/UA-1 عبر settings.profile، وTemplate Render يعيد استخدام نموذج المستند نفسه، وE-Invoice Render يعرض نقطة مخصصة POST /api/v1/e-invoice/render تنتج حزم Factur-X / ZUGFeRD على PDF/A-3b مع EN 16931 CII XML مدمج. الفرق عن وصفة QuestPDF هو ما تفعله الخدمة لك: gPdf يشغل تحقق PDF/A-3b والفاتورة الإلكترونية من جهة الخادم، ويدعم التسليم المتزامن داخل الاستجابة أو التسليم عبر كائن مفحوص، ويعرض إقامة بيانات أوروبية أو عالمية كإعداد طلب بدلا من خطوات تجمعها وتشغلها. QuestPDF مناسب عندما يجب أن يعيش التحقق داخل مسار .NET لديك؛ gPdf عندما يجب أن يكون عقدا مستضافا مشتركا بين عدة أنظمة.
الخطوط والباركود: جهد الدمج هو المقارنة الحقيقية
QuestPDF يملك نموذج خطوط قويا. يشحن Lato 2.015 افتراضيا، ويحمّل خطوط النظام ومجلد النشر تلقائيا، ويسمح بتسجيل خطوط مخصصة عبر FontManager، ويدعم سلاسل بدائل الخطوط. هذا يمنح المطورين تحكما. لكن الوثائق نفسها صريحة حول العثرة: “in most cloud deployments, few or no fonts are available, which may lead to unexpected results,” وتوصي بتعطيل خطوط البيئة وتسجيل ما تحتاجه بوضوح. بمعنى آخر، في حاوية أو هدف بلا خوادم تصبح بيئة الخطوط مسؤوليتك للتخطيط والشحن والاختبار — والحرف المفقود يصبح رمزا بديلا أو، إذا فعلت CheckIfAllTextGlyphsAreAvailable، استثناء.
gPdf يجعل الخطوط جزءا من حدود الخدمة. يضم المحرك مجموعة متعددة السكربتات — Latin, Greek, Cyrillic, Arabic, Hebrew, Bengali, Tamil, Thai, Vietnamese, monospace، وCJK مع بدائل حسب السكربت إلى Noto KR / JP / SC. يعالج اختيارات الخطوط الصامتة عبر اختيار تلقائي ضمني، والاختيارات الصريحة عبر prefer أو strict. المستدعون لا يشحنون خط CJK ولا يسجلون أصول Noto داخل تطبيق .NET ولا يضبطون البدائل لكل هدف نشر. هم يرسلون البيانات؛ والمحرك يملك بيئة الخطوط نفسها في كل منطقة.
شكل مقارنة الباركود مشابه. وثائق QuestPDF تعرض نهجا قويا باستخدام ZXing.Net مرسوما كـ SVG متجهي، وتذكر بوضوح أن ZXing.Net ليس ضمن حزمة QuestPDF — تثبته من NuGet وتوصله:
// QuestPDF: add the separate ZXing.Net package, encode, render to SVG, embed.
// dotnet add package ZXing.Net
var writer = new ZXing.BarcodeWriterSvg {
Format = ZXing.BarcodeFormat.CODE_128,
Options = new ZXing.Common.EncodingOptions { Width = 320, Height = 80 }
};
string svg = writer.Write("INV-2026-001").Content;
container.Svg(svg);
// GS1-128 with Application Identifiers and FNC1 framing is hand-wired on top.
مع gPdf، توليد الباركود عنصر مخطط من الدرجة الأولى. الطلب يعلن format وcontent والحجم الفيزيائي وسطر النص المقروء للبشر اختياريا — وصيغ GS1 أصلية، لذلك تدخل معرفات التطبيق مباشرة في content:
{
"type": "barcode",
"format": "gs1_128",
"content": "(01)00012345678905(21)SN12345",
"x": 12, "y": 60, "width": 80, "height": 18,
"barcode_text": { "enabled": true, "position": "bottom" }
}
في تطبيق .NET واحد، قد يكون تثبيت ZXing.Net واختبار النتيجة سهلا. لكن عبر عدة خدمات وقوالب — خصوصا أحمال لوجستية أو تجارة تجزئة تحتاج GS1-128 وSSCC وGTIN وGS1 DataMatrix أو GS1 QR مع سطر تفسير مقروء للبشر — وضع سلوك الباركود داخل API المستند أسهل صيانة من تكرار توصيل ZXing نفسه في كل خدمة.
أين يفوز QuestPDF بوضوح
إضافة إلى التشغيل دون اتصال وإبقاء بيانات المستند داخل المحيط (كما ذكرنا)، وعندما يكون كود PDF نفسه جزءا من المنتج — أي أن الفريق يحتاج فحص أو توسيع أو امتلاك مسار المحرك — يملك QuestPDF منطقتين واضحتين خارج نطاق gPdf:
- عمليات على ملفات PDF موجودة. يستطيع QuestPDF تحميل ملفات موجودة ودمجها، اختيار الصفحات أو إعادة ترتيبها أو عكسها أو تصفيتها، تطبيق طبقات علوية، إضافة مرفقات، ضبط بيانات XMP الوصفية، وتهيئة الملف للتسليم الخطي عبر الويب، والتشفير وفك التشفير بأمان 40/128/256-bit. يستطيع gPdf حماية ملفات PDF التي يولدها بكلمة مرور وضبط صلاحياتها، لكنه لا يفتح ولا يدمج ولا يفك تشفير ملفات لم ينشئها.
- الرسوم والخرائط والرسومات المخصصة. يدمج QuestPDF مكتبات رسوم (ScottPlot, LiveCharts, Microcharts)، ويضمن خرائط Mapbox، ويعرض SkiaSharp canvas للرسم ثنائي الأبعاد المخصص. يستطيع gPdf رسم فن متجهي بعنصر
path(بيانات مسار SVG) أو تضمين رسم SVG / PNG تنتجه أنت، لكنه لا يملك محرك رسوم بيانية أو خرائط أو canvas مدمجة — لذلك إذا كان الرسم القائم على البيانات محوريا في المستند، تبقى تلك الأدوات مع QuestPDF.
أين يفوز gPdf بوضوح
يفوز gPdf عندما لا تريد المؤسسة أن يملك كل فريق منتج خدمة PDF خاصة به — حزم متعددة اللغات، ومسارات عالمية، وأنظمة ERP / OMS / WMS / التجارة الإلكترونية / التقنية المالية / التذاكر التي تولد مستندات من بيانات منظمة، مع قوالب تتغير مستقلة عن الكود. في هذه البيئات تبدأ المكتبة المحلية رخيصة ثم تتحول إلى أسطول: خدمة لكل لغة، ومسار نشر لكل منطقة، وخطة خطوط لكل حاوية، ومجموعة انحدارات باركود لكل فريق. gPdf يحول ذلك الأسطول إلى عقد HTTP واحد.
البنية بلا خوادم توضح الحد أكثر. على AWS Lambda أو Cloud Run أو Azure Functions، لا يزال QuestPDF يعمل داخل التطبيق — فريقك يحزم بيئة .NET والخطوط والاعتمادات الأصلية وCPU / ذاكرة كافية لذروة عمل PDF، ويملك البدايات الباردة. gPdf هو خدمة توليد أصلا: الدالة ترسل طلب template_id + data صغيرا إلى الحافة وتحصل على بايتات PDF، بلا محرك يحتاج تسخينا ولا عامل في كل منطقة للتوسع.
شكل الانتقال
الانتقال من QuestPDF إلى gPdf ليس إعادة كتابة سطرا بسطر. هو تغيير في الحد: كود C# الذي يبني PDF يصبح إما طلب مستند JSON أو قالبا منشورا.
قبل / بعد — استدعاء بناء المستند في C# يتحول إلى HTTP POST واحد (اضغط للتوسيع)
- // Before: generate the PDF inside a .NET application.
- Document.Create(container =>
- {
- container.Page(page =>
- {
- page.Size(PageSizes.A4);
- page.Margin(30);
- page.Header().Text("Invoice").FontSize(24).SemiBold();
- page.Content().Column(column =>
- {
- column.Item().Text($"Invoice number: {invoice.Number}");
- column.Item().Text($"Total: {invoice.Total:C}");
- });
- });
- })
- .GeneratePdf("invoice.pdf");
+
+ // After: render through the shared gPdf template from C#.
+ using System.Net.Http.Headers;
+ using System.Net.Http.Json;
+
+ using var client = new HttpClient();
+ client.DefaultRequestHeaders.Authorization =
+ new AuthenticationHeaderValue("Bearer", key);
+
+ var response = await client.PostAsJsonAsync(
+ "https://api.gpdf.com/api/v1/template-render",
+ new {
+ template_id = "invoice-v2",
+ data = new {
+ invoice_number = invoice.Number,
+ total = invoice.Total,
+ currency = invoice.Currency
+ }
+ });
+
+ response.EnsureSuccessStatusCode();
+ byte[] pdfBytes = await response.Content.ReadAsByteArrayAsync();
بعد انتقال هذا الحد، يمكن أن تصبح تغييرات التخطيط مراجعات قوالب بدلا من نشر تطبيق. يظل التطبيق يملك بيانات العمل وقرارات المسار؛ وgPdf يملك التوليد.
ملاحظة عن الأسعار والمصادر
تمت مراجعة معلومات QuestPDF في هذه الصفحة بتاريخ 2026-06-02 مقابل مصادر QuestPDF الرسمية: License and Pricing، License configuration، Features Overview، Companion App features، Barcodes، Font management، وZUGFeRD example. صفحات الأسعار والميزات قد تتغير؛ على فرق الشراء إعادة فحص صفحة المورّد قبل قرار الشراء. QuestPDF والعلامات المتعلقة بها مملوكة لأصحابها، وهذه المقارنة غير مصادق عليها منهم.
سيناريوهات توليد PDF ذات صلة
إذا كنت تقارن QuestPDF وgPdf، فابدأ من حدود المنتج لا من قائمة ميزات عامة: هل تحتاج واجهة JSON إلى PDF مشتركة بين عدة لغات، أم مكتبة C# محلية؟ هل حجم العمل الأساسي هو فواتير PDF وملصقات شحن تحتاج GS1-128 وSSCC وGTIN؟ هل يجب أن تكون مخرجات PDF/A أو Factur-X أو ZUGFeRD جزءا من عقد API مستضاف، أم خطوات تتحقق منها داخل مسار .NET؟ ولأعمال اللوجستيات والتجزئة، راجع أيضا واجهة باركود GS1 عند تقييم تكلفة توصيل ZXing.Net في كل خدمة.
FAQ
هل يستبدل gPdf QuestPDF؟
لا. gPdf يستبدل الحاجة إلى تشغيل خدمة توليد PDF للمستندات التجارية المنظمة. يبقى QuestPDF مكتبة C# محلية قوية عندما يجب أن يولد PDF داخل التطبيق.
هل QuestPDF مجاني؟
صفحة الترخيص العامة لـ QuestPDF تقول إن مستوى Community مجاني وفق شروط MIT للأفراد المؤهلين ومشاريع المصدر المفتوح والمنظمات غير الربحية والشركات دون 1 مليون دولار من إجمالي الإيراد السنوي. الشركات فوق هذا الحد تحتاج رخصة تجارية دائمة: Professional بسعر 999 دولارا مع الضريبة المحلية حتى 10 مطورين، أو Enterprise بسعر 2,999 دولارا مع الضريبة المحلية على مستوى المؤسسة، وكل منهما يشمل سنة تحديثات.
هل يستطيع gPdf توليد رسوم بيانية أو خرائط مثل QuestPDF؟
ليس كمحرك مدمج. يدمج QuestPDF مكتبات رسوم (ScottPlot, LiveCharts, Microcharts)، وخرائط Mapbox، وSkiaSharp canvas ترسم داخل المستند. يستطيع gPdf مع ذلك رسم مخططات متجهية عبر عنصر path (يقبل بيانات مسار SVG) والأشكال، أو تضمين SVG / PNG منتج من أي مكتبة رسوم كـ image. الفرق أن QuestPDF يحسب ويرسم المخطط داخل العملية، بينما مع gPdf تنتج أنت الرسم ويضعه gPdf. إذا كانت الرسوم القائمة على البيانات أو الخرائط محور المستند، فـ QuestPDF أنسب.
أي المنتجين أرخص؟
يعتمد على الحد. قد يكون QuestPDF أرخص لفرق .NET المؤهلة لشروط Community أو التي تشغل بنية توليد أصلا. وقد يكون gPdf أرخص عندما يكون البديل بناء واستضافة وصيانة خدمة PDF عبر منتجات أو مناطق.
هل يخزن gPdf أو يسجل بيانات مستندي؟
لا. JSON الذي ترسله وPDF الذي يعيده gPdf لا يخزنان. كل طلب يولد داخل عزل Cloudflare Workers V8 واحد، يبقى في الذاكرة فقط أثناء التوليد — عادة نحو 4 ms — ويحرر عند اكتمال تدفق الاستجابة؛ لا يحتفظ gPdf بمحتوى DocumentRequest ولا يسجله ولا يأخذ منه عينات ولا يستخدمه للتدريب. سجلات التشغيل تحتفظ فقط بحالة HTTP والمدة لمدة 30 يوما ولا تحتوي أجسام الطلبات. راجع security policy وprivacy policy وDPA. للأحمال التي لا تستطيع إرسال البيانات إطلاقا، يبقيها النشر المحلي أو الخاص داخل محيطك.
هل يستطيع QuestPDF العمل دون اتصال بالإنترنت؟
نعم. صفحة إعداد الرخصة لدى QuestPDF تقول إنه لا يوجد مفتاح رخصة ولا خادم تفعيل، وأن الحسابات تتم محليا. هذا من أوضح أسباب اختيار QuestPDF.
هل يستطيع gPdf توليد أي تخطيط C# عشوائي من QuestPDF؟
لا. gPdf لا ينفذ كود تخطيط C#. الهجرة تعني تحويل شكل المستند إلى طلب JSON في gPdf أو قالب gPdf محفوظ.