بحث

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

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

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

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

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

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

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

html
<nav id="toolbar" aria-label="Document viewer controls">
    <!-- Viewer controls, including the button that opens Search -->
</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
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. استخدم واجهة الـ widget بدلاً من تحليل الاستجابة الداخلية بنفسك.

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

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

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   // optional: lets the user drag a region and copy its text
});

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 → converted to a text-based PDF → searchable
var token = await viewer.OpenDocumentAsync(path, new HtmlConfig { DefaultRender = false });

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

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

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

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

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

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

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

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

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

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

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

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