Пошук
Рідний текстовий пошук у складі Viewer
Doconut Viewer забезпечує звичайний пошук, використовуючи текст, витягнутий форматом переглядача, або перенаправлення у вигляді текстового PDF. Для цього потрібна можливість ліцензії Search.
Увімкнення інтерфейсу пошуку
Search є модулем Viewer, а не окремою панеллю інструментів. Повна сторінка повинна включати ресурси Viewer, панель інструментів Viewer, монтування Viewer та ініціалізований objViewer; після цього Ribbon пошуку монтується і підключається до того ж екземпляра.
Search та анотація — це вбудовані ліцензовані функції, а не пакети AddPlugin<T>(). Запитуйте ресурси пошуку у впровадженого Viewer; їхні теги генеруються лише коли ліцензія надає Search.
@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:
<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, що належить хосту, лише потребує перемикання:
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
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 віджета, а не парсингом внутрішньої відповіді самостійно.
Перевірка можливості пошуку
Відповідь ініціалізації повідомляє:
X-Doconut-Can-Search: 1Після ініціалізації objViewer.CanSearch() повертає той самий verdict формату/сесії. Він повертає false, коли сервер надсилає 0; до отримання відповіді або при старішому сервері, який не надсилає заголовок, за замовчуванням повертає true.
Три незалежні ворота не слід плутати:
| Ворота | Питання |
|---|---|
CanSearch() / заголовок відповіді | Чи має визначений переглядач рідний індекс/шлях пошуку? |
AllowSearch | Чи запитувала ця конфігурація формату витяг тексту, де існує перемикач? |
LicenseCapability.Search | Чи авторизовано застосунок виконувати пошук і отримувати UI пакети? |
Формат може бути технічно пошуковим, хоча поточна ліцензія забороняє операцію.
Увімкнення витягування за форматом
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:
// DefaultRender = false → converted to a text-based PDF → searchable
var token = await viewer.OpenDocumentAsync(path, new HtmlConfig { DefaultRender = false });Для рідних рендерерів CanSearch() описує можливість переглядача; це не гарантує, що конкретний документ містить придатний текст. PDF, сторінки якого лише скановані зображення, може повернути нуль рідних результатів.
Звичайна поведінка пошуку
Сервер пробує джерела пошуку у такому порядку:
- Рідні результати
ISearchableViewer. - Попередньо створений індекс пошуку
.srh. - Помилка/порожній результат, коли джерело пошуку відсутнє.
Індекс .srh — це артефакт пошуку, опублікований разом із зображеннями сторінок, коли документи подаються зі спільного сховища, тому вузол, який ніколи не відкривав документ, все одно може відповідати на пошуки — дивіться Розподілені розгортання.
CanSearch() може бути true для переглядача, що підтримує пошук, навіть коли конкретний сканований документ не має текстового шару і тому не повертає збігів.
Ліцензування та поведінка інтерфейсу
Активна тимчасова/демо‑ліцензія надає Search протягом свого активного періоду. Відсутня ліцензія та застарілий файл TRIAL не надають можливості Search. Без Search:
ReferenceCssтаReferenceScriptsне включають пакети пошуку.- Проміжне ПЗ відхиляє пошук замість повернення ліцензованих результатів.
Керуйте видимістю кастомного UI через IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search) і використовуйте CanSearch() для окремого verdict формату/сесії.
Устранення неполадок
| Симптом | Перевірка |
|---|---|
| Панель пошуку відсутня | Можливість пошуку та IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar |
CanSearch() повертає false | Переглядач формату, обраний шлях DefaultRender та заголовок відповіді ініціалізації |
| Пошук повертає нуль для сканованого PDF | Документ не має текстового шару; використайте джерело з текстом або проекцію PDF, що зберігає текст |
| Пошук працює, але підсвічування зміщене | Шлях рендерингу, роздільна здатність, трансформації документа та витягнуті коробки слів |
Чи була ця сторінка корисною?