جستجو

جستجوی متنی بومی در ترکیب Viewer

Viewer Doconut جستجوی عادی را با استفاده از متن استخراج‌شده توسط Viewer فرمت یا یک بازگردانی 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
}))

Ribbon جاسازی‌شده همان متدهای JavaScript در دسترس برای یک رابط کاربری سفارشی را فراخوانی می‌کند.

ترکیب کامل Viewer را در نشانه‌گذاری قابل مشاهده نگه دارید، ابتدا docViewer را مقداردهی اولیه کنید، سپس Ribbon لایسنس‌دار را الصاق کنید:

html
<nav id="toolbar" aria-label="Document viewer controls">
    <!-- کنترل‌های Viewer، شامل دکمه‌ای که 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: '/',
        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();

API عمومی آن عمداً کوچک است:

متدهدف
attach(objViewer)اتصال Ribbon به Viewer مقداردهی اولیه‌شده؛ یک بار لازم است
open() / close()نمایش یا مخفی‌سازی Ribbon؛ بستن همچنین هایلایت‌ها را پاک می‌کند
reset()پاک‌سازی عبارت جاری، شمارش نتایج، و هایلایت‌ها
isOpen()گزارش اینکه آیا Ribbon قابل مشاهده است یا خیر
setStatus(message)ارسال پیام وضعیت از طریق callback پیکربندی‌شده

callback اختیاری onToggle(isOpen) به میزبان امکان همگام‌سازی دکمه جستجوی خود را می‌دهد، و onLayout به آن اجازه می‌دهد هنگام تغییر ارتفاع Ribbon، Viewer را بازاندازه‌گیری/متناسب کند. برای توالی راه‌اندازی ترکیبی Viewer، Search و Annotation، به شروع سریع مراجعه کنید.

جستجو از JavaScript

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

آرگومان دوم تطبیق کلمه کامل/دقیق است. پس از callback:

متدنتیجه
SearchMatchCount()کل تطابق‌های فردی در سند.
SearchSummary(false)ورودی‌های [pageNumber, matchCount] بدون بازنقاشی.
SearchSummary(true)همان خلاصه و هایلایت‌های صفحه/تصویر کوچک را می‌کشد.
GotoSearchMatch(index)به ایندکس تطابق صفر-پایه می‌رود.

مسیر میدل‌ویر از search=<term> و exact=true|false استفاده می‌کند و XML برمی‌گرداند. به جای تجزیهٔ دستی پاسخ داخلی، از API ویجت استفاده کنید.

بررسی قابلیت جستجو

پاسخ مقداردهی اولیه گزارش می‌دهد:

text
X-Doconut-Can-Search: 1

پس از مقداردهی اولیه، objViewer.CanSearch() همان حکم فرمت/نشست را نشان می‌دهد. وقتی سرور 0 ارسال می‌کند، false را برمی‌گرداند؛ قبل از پاسخ، یا با سرور قدیمی که هدر را حذف می‌کند، به طور پیش‌فرض true است.

سه گیت مستقل نباید با هم اشتباه شوند:

گیتسؤال
CanSearch() / هدر پاسخآیا Viewer حل‌شده مسیر ایندکس/جستجوی بومی دارد؟
AllowSearchآیا این پیکربندی فرمت درخواست استخراج متن را در جایی که سوئیچ وجود دارد، کرده است؟
LicenseCapability.Searchآیا برنامه مجاز به اجرای جستجو و دریافت بسته‌های UI است؟

یک فرمت می‌تواند از نظر فنی قابل جستجو باشد در حالی که لایسنس فعلی عملیات را رد می‌کند.

فعال‌سازی استخراج برای هر فرمت

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() قابلیت Viewer را توصیف می‌کند؛ این تضمین نمی‌کند که سند خاصی متن قابل استفاده داشته باشد. یک PDF که صفحاتش فقط تصاویر اسکن‌شده هستند می‌تواند همچنان صفر نتیجه بومی تولید کند.

رفتار جستجوی عادی

سرور منابع جستجو را به ترتیب زیر امتحان می‌کند:

  1. نتایج از Viewer بومی فرمت.
  2. یک ایندکس جستجوی پیش‌ساخته .srh.
  3. یک نتیجه خطا/خالی وقتی هیچ منبع جستجویی وجود نداشته باشد.

ایندکس .srh یک اثر جستجو است که همراه با تصاویر صفحه هنگام سرویس‌دهی اسناد از ذخیره‌سازی مشترک منتشر می‌شود، بنابراین یک گره که هرگز سند را باز نکرده است نیز می‌تواند به جستجوها پاسخ دهد — ببینید استقرارهای توزیع‌شده.

CanSearch() می‌تواند برای یک Viewer قابل جستجو درست باشد حتی زمانی که یک سند اسکن‌شده خاص لایه متنی ندارد و بنابراین هیچ تطابقی برنمی‌گرداند.

لایسنس و رفتار UI

یک لایسنس موقت/دموی فعال، جستجو را در دوره فعال خود اعطا می‌کند. یک لایسنس مفقود و فایل قدیمی TRIAL هیچ قابلیت جستجویی را اعطا نمی‌کند. بدون جستجو:

  • ReferenceCss و ReferenceScripts بسته‌های جستجو را حذف می‌کنند.
  • میدل‌ویر به جای برگرداندن نتایج لایسنس‌دار، جستجو را رد می‌کند.

قابلیت نمایش UI سفارشی را از IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search) کنترل کنید و برای حکم جداگانه فرمت/نشست از CanSearch() استفاده کنید.

عیب‌یابی

علائمبررسی
نوار جستجو موجود نیستقابلیت جستجو و IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar
CanSearch() نادرست استViewer فرمت، مسیر انتخاب‌شده DefaultRender، و هدر پاسخ مقداردهی اولیه
جستجو برای یک PDF اسکن‌شده صفر برمی‌گرداندسند لایه متنی ندارد؛ از منبع حاوی متن یا یک پروژکشن PDF که متن را حفظ می‌کند استفاده کنید.
جستجو کار می‌کند اما هایلایت‌ها جابجا هستندمسیر رندرینگ، وضوح، تبدیل‌های سند، و جعبه‌های کلمه استخراج‌شده

آیا این صفحه مفید بود؟