بحث

بحث نصي أصلي في تركيبة العارض

يوفر Doconut Viewer بحثًا عاديًا باستخدام النص المستخرج من عارض التنسيق أو إعادة توجيه PDF قائم على النص. يتطلب ذلك قدرة ترخيص Search.

تمكين واجهة البحث

Search هو وحدة في العارض، وليس شريط أدوات مستقل. يجب أن تشمل الصفحة الكاملة موارد العارض، شريط أدوات العارض، تثبيت العارض، وتكوين objViewer؛ ثم يتم تثبيت شريط البحث وإرفاقه بنفس المثيل.

Search والتعليقات التوضيحية هي ميزات مرخصة مدمجة، ليست حزم AddPlugin<T>(). اطلب موارد البحث من الـ Viewer المُحقن؛ تُصدر العلامات الخاصة بها فقط عندما يمنح الترخيص إمكانية البحث.

html
@Html.Raw(Viewer.ReferenceCss(new CssConfig
{
    IncludeViewerCss = true,
    IncludeSearchCss = true
}))

@Html.Raw(Viewer.ReferenceScripts(new ScriptConfig
{
    IncludeJQuery = true,
    IncludeViewerScripts = true,
    IncludeSearchScripts = true,
    IncludeSearchBar = true
}))

الشريط المدمج يستدعي نفس طرق JavaScript المتاحة لواجهة مخصصة.

احفظ تركيبة العارض الكاملة مرئية في العلامات، ابدأ بـ docViewer أولاً، ثم أرفق شريط البحث المرخص:

html
<nav id="toolbar" aria-label="Document viewer controls">
    <!-- عناصر التحكم في العارض، بما في ذلك الزر الذي يفتح البحث -->
</nav>
<div id="searchBarMount"></div>
<div id="divDocViewer"><div id="div_ctlDoc"></div></div>

<script>
    let searchBar = null;
    let currentToken = '';

    const objViewer = $('#div_ctlDoc').docViewer({
        BasePath: 'doconut',
        ResPath: 'doconut-res/images'
    });

    @if (Viewer.IsSearchEnabled)
    {
        <text>
    searchBar = $('#searchBarMount').doconutSearchBar({
        docId: 'ctlDoc',
        getRequestParams: () => ({ token: currentToken }),
        onStatus: (message) => console.log(message),
        onToast: (message, type) => console.log(type, message),
        onLayout: () => requestAnimationFrame(() => objViewer.Refit())
    });
    searchBar.attach(objViewer);
        </text>
    }
</script>

المكوّن يحقن مجموعات Find و Options و Results ويتعامل مع البحث، والمسح، وعدّ التطابقات، والتنقل بين التطابق السابق/التالي. شريط أدوات العارض المملوك للمضيف يحتاج فقط إلى تبديله:

javascript
searchBar.isOpen() ? searchBar.close() : searchBar.open();

واجهة برمجة التطبيقات العامة صغيرة عن قصد:

الطريقةالغرض
attach(objViewer)ربط الشريط بالعارض المُهيأ؛ مطلوب مرة واحدة
open() / close()إظهار أو إخفاء الشريط؛ الإغلاق أيضًا يزيل التحديدات
reset()مسح المصطلح الحالي، عدد النتائج، والتحديدات
isOpen()إبلاغ ما إذا كان الشريط مرئيًا
setStatus(message)تمرير رسالة الحالة عبر رد النداء المكوَّن

استدعاء onToggle(isOpen) الاختياري يسمح للمضيف بمزامنة زر البحث الخاص به، وonLayout يسمح له بإعادة تحجيم/ملاءمة العارض عندما يتغيّر ارتفاع الشريط. لسلسلة بدء تشغيل العارض المدمج مع البحث والتعليقات التوضيحية، راجع البدء السريع.

البحث من JavaScript

javascript
objViewer.Search(keyword, false, function (resultCount) {
    console.log('Matches:', resultCount);
});

المعامل الثاني هو مطابقة كلمة كاملة/دقيقة. بعد رد النداء:

الطريقةالنتيجة
SearchMatchCount()إجمالي التطابقات الفردية في المستند.
SearchSummary(false)إدخالات [pageNumber, matchCount] دون إعادة الرسم.
SearchSummary(true)نفس الملخص ويرسم تمييزات الصفحات/المصغرات.
GotoSearchMatch(index)ينتقل إلى تطابق بالرقم الصفري.

مسار الوسيط يستخدم search=<term> و exact=true|false ويعيد XML. استخدم واجهة API للودجت بدلاً من تحليل الاستجابة الداخلية بنفسك.

التحقق من قدرة البحث

text
X-Doconut-Can-Search: 1

بعد التهيئة، objViewer.CanSearch() يكشف عن نفس حكم التنسيق/الجلسة. تُعيد false عندما يرسل الخادم 0؛ قبل الاستجابة، أو مع خادم أقدم يُهمل الرأس، يكون الافتراضي true.

ثلاث بوابات مستقلة لا يجب الخلط بينها:

البوابةالسؤال
CanSearch() / response headerهل للعارض المُستَكمل فهرس/مسار بحث أصلي؟
AllowSearchهل طلب تكوين هذا التنسيق استخراج النص حيث يوجد المفتاح؟
LicenseCapability.Searchهل التطبيق مخول بتنفيذ البحث وتلقي حزم الواجهة؟

يمكن أن يكون التنسيق قابلًا للبحث تقنيًا بينما الترخيص الحالي يمنع العملية.

تمكين الاستخراج حسب التنسيق

csharp
var token = await viewer.OpenDocumentAsync(path, new PdfConfig
{
    AllowSearch = true,
    AllowCopy   = true   // اختياري: يسمح للمستخدم بسحب منطقة ونسخ نصها
});

AllowSearch و AllowCopy موجودان في PdfConfig و WordConfig و ExcelConfig و PptConfig. خصائص Office تُفوض إلى PdfConfig المتداخلة. كلاهما افتراضيًا false.

محولات البحث الأصلية موجودة لـ PDF و Word و Excel و PowerPoint و TXT و Visio و البريد الإلكتروني و EPUB و MHT. يستخدم XPS مساره PDF افتراضيًا. HTML و Microsoft Project يستفيدان من إعادة توجيه PDF قائم على النص:

csharp
// DefaultRender = false → تم تحويله إلى PDF قائم على النص → قابل للبحث
var token = await viewer.OpenDocumentAsync(path, new HtmlConfig { DefaultRender = false });

بالنسبة للعارضين الأصليين، CanSearch() يصف قدرة العارض؛ لا يضمن أن المستند يحتوي على نص قابل للاستخدام. يمكن أن ينتج PDF صفحاتها صورًا ممسوحة ضوئيًا صفر نتائج أصلية.

سلوك البحث العادي

يحاول الخادم مصادر البحث بهذا الترتيب:

  1. نتائج ISearchableViewer الأصلية.
  2. فهرس بحث .srh مُسبق الإنشاء.
  3. نتيجة خطأ/فارغة عندما لا يوجد مصدر بحث.

يمكن أن تكون CanSearch() صحيحة لعارض قابل للبحث حتى عندما لا يحتوي مستند معين على طبقة نص وبالتالي لا يُعيد أي تطابقات.

الترخيص وسلوك الواجهة

ترخيص Temporary/Demo النشط يمنح البحث خلال فترته النشطة. ترخيص مفقود وملف TRIAL القديم لا يمنح أي قدرة بحث. بدون بحث:

  • ReferenceCss و ReferenceScripts يحذفان حزم البحث.
  • الوسيط يرفض البحث بدلاً من إرجاع النتائج المرخصة.

قُد رؤية واجهة المستخدم المخصصة من IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search) واستخدم CanSearch() لحكم التنسيق/الجلسة المنفصل.

استكشاف الأخطاء وإصلاحها

العَرَضالتحقق
شريط البحث مفقودقدرة البحث و IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar
CanSearch() هو falseعارض التنسيق، مسار DefaultRender المختار، ورأس استجابة التهيئة
البحث يُعيد صفرًا لملف PDF مُمسوح ضوئيًاالمستند لا يحتوي على طبقة نص؛ استخدم مصدرًا يحتوي نصًا أو إسقاط PDF يحافظ على النص
البحث يعمل لكن التمييزات غير متطابقةمسار العرض، الدقة، تحويلات المستند، وصناديق الكلمات المستخرجة

هل كانت هذه الصفحة مفيدة؟