جستجو

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

Viewer Doconut جستجوی عادی را با استفاده از متنی که توسط فرمت ویور استخراج می‌شود یا یک تغییر مسیر 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 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: '/',
        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)ارسال پیام وضعیت از طریق کال‌بک پیکربندی‌شده

کال‌بک اختیاری onToggle(isOpen) به میزبان امکان همگام‌سازی دکمه جستجو را می‌دهد و 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)به اندیس تطابق صفر‑پایه‌ای می‌رود.

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

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

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

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

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

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

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

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

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

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

عیب‌یابی

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

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