Пошук

Вбудований текстовий пошук у складі 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‑методи, які доступні для кастомного інтерфейсу.

Залиште повний склад Viewer видимим у розмітці, спочатку ініціалізуйте docViewer, а потім приєднайте ліцензований Ribbon:

html
<nav id="toolbar" aria-label="Document viewer controls">
    <!-- Керування переглядачем, включаючи кнопку, що відкриває пошук -->
</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, 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() повертає те саме рішення щодо формату/сесії. Він повертає false, коли сервер надсилає 0; до отримання відповіді або при старішому сервері, який не включає заголовок, за замовчуванням повертає true.

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

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

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

Увімкнення витягування за форматом

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

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

Звичайна поведінка пошуку

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

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

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

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

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

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

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

Усунення неполадок

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

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