Пошук

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

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

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

Search — це модуль Viewer, а не окрема панель інструментів. Повна сторінка повинна включати ресурси Viewer, панель інструментів Viewer, монтування Viewer та ініціалізований objViewer; потім Search 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
}))

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

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

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

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

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

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

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

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

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