Пошук

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

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

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

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

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

Необов’язковий зворотний виклик onToggle(isOpen) дозволяє хосту синхронізувати кнопку Search, а onLayout — змінювати розмір/перефіт переглядача, коли висота Ribbon змінюється. Для послідовності запуску комбінованого 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() повертає той самий verdict формату/сесії. Він повертає false, коли сервер надсилає 0; до отримання відповіді або при старішому сервері, який не надсилає заголовок, за замовчуванням повертає true.

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

ВоротаПитання
CanSearch() / заголовок відповідіЧи має визначений переглядач рідний індекс/шлях пошуку?
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, email, 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. Помилка/порожній результат, коли джерело пошуку відсутнє.

Індекс .srh — це артефакт пошуку, опублікований разом із зображеннями сторінок, коли документи подаються зі спільного сховища, тому вузол, який ніколи не відкривав документ, все одно може відповідати на пошуки — дивіться Розподілені розгортання.

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

Ліцензування та поведінка інтерфейсу

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

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

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

Устранення неполадок

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

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