Пошук

Рідний текстовий пошук у складі Viewer

Doconut Viewer забезпечує звичайний пошук, використовуючи текст, витягнутий переглядачем формату, або перенаправлення PDF на основі тексту. Для цього потрібна ліцензійна можливість Search.

Увімкнення інтерфейсу пошуку

Пошук — це модуль Viewer, а не окрема панель інструментів. Повна сторінка повинна містити ресурси Viewer, панель інструментів Viewer, монтування Viewer та ініціалізований objViewer; після цього Ribbon пошуку монтується та підключається до того ж екземпляра.

Пошук і анотація — це вбудовані ліцензовані функції, а не пакети AddPlugin<T>(). Запитуйте ресурси пошуку у Viewer; їхні теги генеруються лише коли ліцензія дозволяє пошук. У представленнях MVC 5 немає @inject, тому створюйте теги у контролері та передавайте їх через ViewBag разом із прапорцем ліцензії, який потрібен сторінці:

csharp
var viewer = Doconut.DoconutHost.Services.GetRequiredService<Viewer>();
ViewBag.ViewerCss = viewer.ReferenceCss(new CssConfig
{
    IncludeViewerCss = true,
    IncludeSearchCss = true
});
ViewBag.ViewerScripts = viewer.ReferenceScripts(new ScriptConfig
{
    IncludeJQuery        = true,
    IncludeViewerScripts = true,
    IncludeSearchScripts = true,
    IncludeSearchBar     = true
});
ViewBag.IsSearchEnabled = viewer.IsSearchEnabled;

Запишіть їх у представлення за допомогою @Html.Raw(ViewBag.ViewerCss) та @Html.Raw(ViewBag.ViewerScripts). У Web Forms експонуйте ті ж значення з коду‑задника і виводьте їх за допомогою <%= %>.

Вбудований 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: '/',
        ResPath: 'doconut-res/images'
    });

    @if ((bool)ViewBag.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>

Серверна умова if має значення: без можливості Search ReferenceScripts не включає скрипт Ribbon, тому незахищений виклик doconutSearchBar(...) викличе помилку і зупинить завантаження сторінки Viewer. У Web Forms запишіть той самий захист як <% if (IsSearchEnabled) { %> … <% } %>.

Компонент інжектує групи 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, Search та Annotation дивіться Швидкий старт.

Пошук з JavaScript

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

Другий аргумент відповідає за пошук цілих слів/точне співпадіння. Кількість збігів надходить у зворотному виклику: Search сам звертається до сервера і не повертає нічого корисного, тому var n = objViewer.Search(keyword, false) завжди має значення undefined — і сторінка, створена таким чином, повідомляє «нічого не знайдено», хоча переглядач підсвічує збіги. Після зворотного виклику:

МетодРезультат
SearchMatchCount()Загальна кількість окремих збігів у документі.
SearchSummary(false)Записи [pageNumber, matchCount] без перерисовки.
SearchSummary(true)Той самий підсумок і малює підсвічування сторінки/мініатюри.
GotoSearchMatch(index)Переміщає до збігу за індексом, починаючи з нуля.

DocImage.axd відповідає на запити search=<term> та exact=true|false у форматі XML. Користуйтеся API віджету, а не розбирайте цю внутрішню відповідь самостійно.

Перевірка можливості пошуку

Відповідь ініціалізації містить:

text
X-Doconut-Can-Search: 1

Після ініціалізації objViewer.CanSearch() повертає той самий verdict формату/сесії. Він повертає false, коли сервер надсилає 0; до отримання відповіді або при використанні старішого сервера, який не надсилає заголовок, значення за замовчуванням — true.

Три незалежні «ворота», які не слід плутати:

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

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

Увімкнути витягування для формату

csharp
var token = await viewer.OpenDocumentAsync(path, new PdfConfig
{
    AllowSearch = true,
    AllowCopy   = true   // optional: дозволяє користувачеві виділити область і скопіювати її текст
});

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 → доступний для пошуку
var token = await viewer.OpenDocumentAsync(path, new HtmlConfig { DefaultRender = false });

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

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

Сервер намагається використовувати джерела пошуку у такому порядку:

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

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

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

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

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

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

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

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

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