جستجو

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

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

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

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

Search و annotation ویژگی‌های دارای مجوز داخلی هستند، نه بسته‌های AddPlugin<T>(). منابع جستجو را از Viewer تزریق‌شده درخواست کنید؛ برچسب‌های آنها فقط زمانی صادر می‌شوند که مجوز Search را اعطا کند.

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، شامل دکمه‌ای که 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 را تزریق می‌کند و جستجو، پاک‌سازی، شمارش تطابق‌ها و ناوبری به‌سابقه/بعدی را مدیریت می‌نماید. نوار ابزار Viewer متعلق به میزبان فقط کافی است آن را باز یا بسته کند:

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

API عمومی آن به‌طور عمدی کوچک است:

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

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

جستجو از JavaScript

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

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

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

مسیر میانی (middleware) از پارامترهای 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

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

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

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

عیب‌یابی

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

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