Пошук

Рідний текстовий пошук у складі 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
}))

Вбудована панель викликає ті ж 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 до ініціалізованого переглядача; потрібно один раз
open() / close()Показати або сховати Ribbon; закриття також очищає підсвічування
reset()Очистити поточний термін, кількість результатів і підсвічування
isOpen()Повертає, чи видимий Ribbon
setStatus(message)Передає повідомлення статусу через налаштований зворотний виклик

Опціональний зворотний виклик onToggle(isOpen) дозволяє хосту синхронізувати свою кнопку Пошуку, а onLayout дозволяє змінювати розмір/перефітити переглядач, коли висота Ribbon змінюється. Для комбінованої послідовності запуску Viewer, Пошуку та Анотацій дивіться Швидкий старт.

Пошук з 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() повертає той самий verdict формату/сесії. Він повертає false, коли сервер надсилає 0; до отримання відповіді або при старішому сервері, який не надсилає заголовок, за замовчуванням повертає true.

Три незалежні гейти не слід плутати:

ГейтПитання
CanSearch() / заголовок відповідіЧи має обраний переглядач вбудований індекс/шлях пошуку?
AllowSearchЧи запитувала конфігурація формату витяг тексту, де існує перемикач?
LicenseCapability.SearchЧи дозволяє застосунок виконувати пошук і отримувати UI‑пакети?

Формат може бути технічно пошуковим, хоча поточна ліцензія забороняє операцію.

Увімкнення витягування per format

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, email, EPUB та MHT. XPS використовує свій PDF‑шлях за замовчуванням. HTML і Microsoft Project отримують перевагу від перенаправлення PDF на основі тексту:

csharp
// DefaultRender = false → конвертується у PDF на основі тексту → searchable
var token = await viewer.OpenDocumentAsync(path, new HtmlConfig { DefaultRender = false });

Для нативних рендерерів CanSearch() описує можливість переглядача; це не гарантує, що конкретний документ містить придатний текст. PDF, сторінки якого лише скановані зображення, може не давати жодних нативних результатів.

Нормальна поведінка пошуку

Сервер перебирає джерела пошуку у такому порядку:

  1. Нативні результати ISearchableViewer.
  2. Попередньо створений індекс .srh.
  3. Помилка/порожня відповідь, коли джерела пошуку відсутні.

CanSearch() може бути true для переглядача, що підтримує пошук, навіть коли конкретний документ не має текстового шару і тому не повертає збігів.

Ліцензування та поведінка UI

Активна тимчасова/демо‑ліцензія надає Пошук протягом свого активного періоду. Відсутність ліцензії та застарілий файл TRIAL не надають можливості Пошуку. Без Пошуку:

  • ReferenceCss і ReferenceScripts не включають пошукові пакети.
  • Проміжне ПЗ відхиляє пошук замість повернення ліцензованих результатів.

Керуйте видимістю кастомного UI через IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search) і використовуйте CanSearch() для окремого verdict формату/сесії.

Устранення проблем

СимптомПеревірка
Панель пошуку відсутняМожливість пошуку та IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar
CanSearch() повертає falseПереглядач формату, обраний шлях DefaultRender та заголовок відповіді ініціалізації
Пошук повертає нуль для сканованого PDFУ документі немає текстового шару; використайте джерело з текстом або PDF‑проекцію, що зберігає текст
Пошук працює, але підсвічування зміщенеШлях рендерингу, роздільна здатність, трансформації документа та видобуті бокси слів

Чи була ця сторінка корисною?