خط أنابيب العرض
من المستند إلى صور الصفحات
بين OpenDocumentAsync وملف PNG الذي يصل إلى المتصفح هناك مرحلتان متميزتان: حل العارض (أي المحرك الذي يحمل المستند، يُحدد مرة واحدة عند الفتح) و معالجة الصفحة (ما يحدث لكل صورة صفحة عند كل طلب إلى DocImage.axd). معرفة كلاهما يوضح لماذا تُعرض صيغة معينة بهذه الطريقة — وما الذي يفعله DefaultRender فعليًا.
المرحلة 1 — حل عارض الصيغة
يقوم المصنع بربط امتداد الملف بعارض عبر كتالوج الصيغ، مع ثلاثة مستويات من الأولوية:
- أولاً العارضون المخصصون. أي شيء قمت بتسجيله باستخدام
DoconutOptions.RegisterViewer(extension, factory, defaultConfig?)يتفوق على جميع العارضين المدمجين. - عارضو العائلة المدمجون. يربط الكتالوج كل امتداد قابل للعرض بعائلة عارض — Word, Excel, PowerPoint, Pdf, Cad, Dgn, Image, Tiff, Psd, Email, Visio, Project, Xps, Epub, Txt, Html, Mht, Dcn — كلٌ بمحول محرك خاص به. إذا كان هناك مكوّن إضافي مرخص يضيف عارضًا لنفس الامتداد، فإن عارض المكوّن الإضافي يحل محل المدمج.
- صيغ تعتمد على المكوّن الإضافي فقط. بعض الامتدادات لا يوجد لها عارض مدمج على الإطلاق — DICOM (
.dcm,.ima) موجود فقط عبر مكوّن DICOM الإضافي. فتح واحد بدون القدرة المطلوبة يثير:
LicenseException: This document type requires the 'Dicom' plugin license.امتداد لا يدعيه أي عارض يثير FormatNotSupportedException.
بعد الحل، يتم تثبيت التكوين: كائن التكوين الصريح إذا قمت بتمريره، وإلا التكوين الافتراضي للصيغة من الكتالوج. يتم نسخ DocOptions.Password إلى التكوين للمستندات المحمية.
المرحلة 1ب — وضع التحويل (DefaultRender = false)
معظم التكوينات الخاصة بكل صيغة تعرض علم DefaultRender. يختار بين مسارين مختلفين جوهريًا:
DefaultRender = true— يتم عرض المستند أصليًا، مباشرة إلى صور الصفحات.DefaultRender = false— يتم أولاً تحويل المستند إلى PDF في الذاكرة، يُطلق محرك المصدر، ويتولى عارض PDF. يحمل PDF المُنتج نصًا حقيقيًا، لذا يحصل البحث النصي الكامل على تمييزات أصلية دقيقة؛ يقوم خط الأنابيب بتفعيلAllowSearchوAllowCopyللـ PDF المحول، لأن التحويل غير مرئي للمستخدم.
XPS، و MHT بشكل افتراضي، يستخدمان مسار التحويل. إعطاء PDF كإسقاط يوفر بحثًا أصليًا لصيغ مثل HTML و Microsoft Project. إذا كان الـ PDF الناتج يحتوي على صور بدون طبقة نصية، لا يمكن البحث في تلك البكسلات.
استخدم وضع التحويل عندما تحتاج إلى إسقاط قابل للبحث ويحمل نصًا — على حساب تحويل مبدئي عند فتح المستند.
المرحلة 2 — خط أنابيب صور الصفحات
كل طلب صفحة إلى DocImage.axd ينفذ تسلسلًا ثابتًا:
raw page PNG → watermark → rotate/flip → scale → annotation burn → PNG to the response- العلامة المائية — تُطبق بناءً على حالة الترخيص (بدون ترخيص، ترخيص مؤقت أو اشتراك منتهي، نطاق غير صالح، بنية خارج إصدارات الترخيص) ومن
DocOptions.Watermarkللنص الخاص بك. موقع مرخص بدون علامة مائية مخصصة يتخطى هذه الخطوة. - تدوير/قلب — حالة كل صفحة يحددها المستخدم في الواجهة (90°/180°/270°، قلب أفقي ورأسي) تُخزن في الجلسة وتُطبق على كل عرض لاحق لتلك الصفحة.
- تحجيم — تُنتج المصغرات ومستويات التكبير عن طريق تحجيم الصفحة المعروضة إلى الحجم المطلوب.
- دمج التعليقات — تُرسم التعليقات المحفوظة على البت ماب، لذا تظهر في الصادرات وصور الصفحات.
- الترميز — يتم ترميز النتيجة كـ PNG وتُكتب مباشرةً إلى الاستجابة.
الأخطاء داخل المعالج تُرجع كـ صور خطأ PNG (نص أحمر على خلفية بيضاء) بحالة 200، بدلاً من صفحات خطأ HTTP، حتى تتمكن الواجهة من عرضها في منطقة الصفحة.
تخزين الصفحات مؤقتًا
BaseConfig.CachePages (الافتراضي true) يحتفظ بصور الصفحات المعروضة في الذاكرة طوال مدة جلسة المستند، لذا لا يتم إعادة عرض الصفحة عند زيارتها مرة أخرى. BaseConfig.ImageResolution (25–300 DPI، 0 = الافتراضي للصيغة) هو المفتاح الرئيسي للجودة والذاكرة؛ الافتراضي لكل صيغة مُدرج في إعدادات الصيغ.
على عقدة واحدة، تُعاش الجلسات والصفحات المخزنة مؤقتًا في ذاكرة عملية العامل. إعادة تدوير مجموعة التطبيقات — مجدولة أو ناتجة عن تعديل Web.config أو مهلة الخمول — تُسقط كل جلسة مستند مفتوحة، وتظهر الواجهة حينها رسالة Document session not found. Please re-open document. في الوضع الموزع (انظر الجلسات والأمان)، تُعاد بناء الجلسة من المخزن المشترك بدلاً من ذلك.
أين تضبط ماذا
| ما تريد | ضبط |
|---|---|
| صفحات أكثر حدة | ImageResolution في إعدادات الصيغة |
| بحث نصي دقيق على HTML, EPUB, email, MHT, أو MPP | DefaultRender = false في إعدادات الصيغة |
| استهلاك ذاكرة أقل في المستندات الضخمة | CachePages = false، وأغلق الجلسات صراحةً |
| ختمك الخاص على كل صفحة | DocOptions.Watermark |
هل كانت هذه الصفحة مفيدة؟