بحث

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

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

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

البحث هو وحدة Viewer، وليس شريط أدوات مستقل. يجب أن تتضمن الصفحة الكاملة موارد Viewer، شريط أدوات Viewer، تثبيت Viewer، وobjViewer المُهيأ؛ ثم يتم تثبيت شريط البحث (Ribbon) وربطه بنفس المثيل.

البحث والتعليقات التوضيحية هي ميزات مرخصة مدمجة، ليست حزم 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 المتاحة لواجهة مخصصة.

احتفظ بتركيبة Viewer الكاملة مرئية في العلامات، قم بتهيئة 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: '/',
        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 ويتعامل مع البحث، والمسح، وعدّ المطابقات، والتنقل بين المطابقة السابقة/التالية. شريط أدوات Viewer المملوك للمضيف يحتاج فقط إلى تبديله:

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

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

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

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

البحث من 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. استخدم واجهة برمجة تطبيقات الودجت بدلاً من تحليل الاستجابة الداخلية بنفسك.

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

تقرير استجابة التهيئة:

text
X-Doconut-Can-Search: 1

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

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

البوابةالسؤال
CanSearch() / رأس الاستجابةهل للعارض المُسترجع فهرس/مسار بحث أصلي؟
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. نتائج من عارض التنسيق الأصلي.
  2. فهرس بحث .srh مُسبق الإنشاء.
  3. نتيجة خطأ/فارغة عندما لا يوجد مصدر بحث.

فهرس .srh هو الأثر البحثي المنشور جنبًا إلى جنب مع صور الصفحات عندما تُقدم المستندات من تخزين مشترك، لذا يمكن لعقدة لم تفتح المستند أبدًا أن تجيب على عمليات البحث — راجع النشر الموزع.

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

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

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

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

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

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

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

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