جستجو

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

Viewer Doconut جستجوی عادی را با استفاده از متنی که توسط Viewer فرمت استخراج می‌شود یا یک تغییر مسیر PDF مبتنی بر متن فراهم می‌کند. این قابلیت نیاز به مجوز Search دارد.

فعال‌سازی رابط کاربری جستجو

Search یک ماژول Viewer است، نه یک نوار ابزار مستقل. صفحه کامل باید شامل منابع Viewer، نوار ابزار Viewer، محل نصب Viewer و objViewer مقداردهی اولیه باشد؛ سپس Ribbon جستجو نصب و به همان نمونه متصل می‌شود.

Search و annotation ویژگی‌های دارای مجوز داخلی هستند، نه بسته‌های 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 موجود برای یک UI سفارشی را فراخوانی می‌کند.

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

html
<nav id="toolbar" aria-label="Document viewer controls">
    <!-- کنترل‌های Viewer، شامل دکمه‌ای که جستجو را باز می‌کند -->
</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 را تزریق می‌کند و جستجو، پاک‌سازی، شمارش مطابقت‌ها و ناوبری به مطابقت قبلی/بعدی را مدیریت می‌کند. یک نوار ابزار 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 به آن امکان تغییر اندازه/بازتنظیم Viewer را هنگام تغییر ارتفاع Ribbon می‌دهد. برای توالی راه‌اندازی ترکیبی 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() همان verdict فرمت/نشست را نشان می‌دهد. وقتی سرور 0 بفرستد false برمی‌گرداند؛ قبل از دریافت پاسخ یا در سرورهای قدیمی که این هدر را حذف می‌کنند، به‌صورت پیش‌فرض true است.

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

دروازهسؤال
CanSearch() / response headerآیا 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. نتایج بومی ISearchableViewer.
  2. یک ایندکس جستجوی پیش‌ساخته .srh.
  3. یک نتیجه خطا/خالی وقتی منبع جستجویی وجود ندارد.

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

مجوزدهی و رفتار UI

یک مجوز فعال Temporary/Demo در دوره فعال خود جستجو را می‌دهد. یک مجوز گمشده و فایل legacy TRIAL هیچ قابلیت جستجویی فراهم نمی‌کند. بدون جستجو:

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

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

عیب‌یابی

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

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