جستجو

جستجوی متن بومی در ترکیب نمایشگر

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

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

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

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

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>

کامپوننت گروه‌های یافتن، گزینه‌ها و نتایج را تزریق می‌کند و جستجو، پاک‌سازی، شمارش تطابق‌ها و ناوبری پیشین/بعدی تطابق‌ها را مدیریت می‌کند. یک نوار ابزار نمایشگر متعلق به میزبان فقط نیاز به تغییر وضعیت آن دارد:

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

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

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

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

جستجو از جاوااسکریپت

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() / هدر پاسخآیا نمایشگر حل‌شده مسیر ایندکس/جستجوی بومی دارد؟
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 باشد حتی اگر سند خاصی لایه متن نداشته باشد و بنابراین هیچ تطابقی برنگرداند.

رفتار مجوز و رابط کاربری

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

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

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

عیب‌یابی

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

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