Пошук

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

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

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

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
}))

Вбудована стрічка викликає ті ж методи JavaScript, які доступні для користувацького інтерфейсу.

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

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 і обробляє пошук, очищення, підрахунок збігів та навігацію попередній/наступний збіг. Панель інструментів переглядача, що належить хосту, лише потребує перемикання її:

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

Його публічний API навмисно невеликий:

МетодПризначення
attach(objViewer)Підключити стрічку до ініціалізованого переглядача; потрібно один раз
open() / close()Показати або сховати стрічку; закриття також очищає підсвічування
reset()Очистити поточний запит, кількість результатів та підсвічування
isOpen()Повернути, чи стрічка видима
setStatus(message)Передати повідомлення про статус через налаштований зворотний виклик

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

Пошук з 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   // 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 для переглядача з можливістю пошуку, навіть якщо конкретний документ не має текстового шару і, відповідно, не повертає збігів.

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

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

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

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

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

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

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