Пошук

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

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

Вбудований 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: '/',
        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() / response headerЧи має вирішений переглядач власний індекс/шлях пошуку?
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, електронної пошти, 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. Результати від рідного переглядача формату.
  2. Попередньо створений індекс пошуку .srh.
  3. Помилка/порожній результат, коли жодне джерело пошуку не існує.

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

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

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

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

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

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

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

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

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