Пошук
Рідний текстовий пошук у складі Viewer
Doconut Viewer забезпечує звичайний Пошук, використовуючи текст, отриманий з переглядача формату, або
перенаправлення PDF на основі тексту. Для цього потрібна можливість ліцензії Search.
Увімкнення інтерфейсу пошуку
Пошук — це модуль Viewer, а не окрема панель інструментів. Повна сторінка повинна включати
ресурси Viewer, панель інструментів Viewer, монтування Viewer та ініціалізований objViewer; після цього
Ribbon Пошуку монтується і приєднується до того ж екземпляра.
Пошук і анотації — вбудовані ліцензовані функції, а не пакети AddPlugin<T>(). Запитуйте ресурси пошуку у
вбудованого Viewer; їхні теги додаються лише коли ліцензія надає Пошук.
@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‑методи, які доступні для кастомного UI.
Залиште повний склад Viewer видимим у розмітці, спочатку ініціалізуйте docViewer,
а потім приєднайте ліцензований Ribbon:
<nav id="toolbar" aria-label="Document viewer controls">
<!-- Контролі Viewer, включаючи кнопку, яка відкриває 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, що належить хосту, потребує лише перемикання її:
searchBar.isOpen() ? searchBar.close() : searchBar.open();Його публічний API навмисно невеликий:
| Метод | Призначення |
|---|---|
attach(objViewer) | Підключає Ribbon до ініціалізованого переглядача; потрібно один раз |
open() / close() | Показати або сховати Ribbon; закриття також очищає підсвічування |
reset() | Очистити поточний термін, кількість результатів і підсвічування |
isOpen() | Повертає, чи видимий Ribbon |
setStatus(message) | Передає повідомлення статусу через налаштований зворотний виклик |
Опціональний зворотний виклик onToggle(isOpen) дозволяє хосту синхронізувати свою кнопку Пошуку, а
onLayout дозволяє змінювати розмір/перефітити переглядач, коли висота Ribbon змінюється. Для комбінованої
послідовності запуску Viewer, Пошуку та Анотацій дивіться
Швидкий старт.
Пошук з 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‑пакети? |
Формат може бути технічно пошуковим, хоча поточна ліцензія забороняє операцію.
Увімкнення витягування per format
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 на основі тексту:
// DefaultRender = false → конвертується у PDF на основі тексту → searchable
var token = await viewer.OpenDocumentAsync(path, new HtmlConfig { DefaultRender = false });Для нативних рендерерів CanSearch() описує можливість переглядача; це не гарантує, що конкретний документ містить придатний текст. PDF, сторінки якого лише скановані зображення, може не давати жодних нативних результатів.
Нормальна поведінка пошуку
Сервер перебирає джерела пошуку у такому порядку:
- Нативні результати
ISearchableViewer. - Попередньо створений індекс
.srh. - Помилка/порожня відповідь, коли джерела пошуку відсутні.
CanSearch() може бути true для переглядача, що підтримує пошук, навіть коли конкретний документ не має текстового шару і тому не повертає збігів.
Ліцензування та поведінка UI
Активна тимчасова/демо‑ліцензія надає Пошук протягом свого активного періоду. Відсутність ліцензії та застарілий файл TRIAL не надають можливості Пошуку. Без Пошуку:
ReferenceCssіReferenceScriptsне включають пошукові пакети.- Проміжне ПЗ відхиляє пошук замість повернення ліцензованих результатів.
Керуйте видимістю кастомного UI через IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search) і використовуйте CanSearch() для окремого verdict формату/сесії.
Устранення проблем
| Симптом | Перевірка |
|---|---|
| Панель пошуку відсутня | Можливість пошуку та IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar |
CanSearch() повертає false | Переглядач формату, обраний шлях DefaultRender та заголовок відповіді ініціалізації |
| Пошук повертає нуль для сканованого PDF | У документі немає текстового шару; використайте джерело з текстом або PDF‑проекцію, що зберігає текст |
| Пошук працює, але підсвічування зміщене | Шлях рендерингу, роздільна здатність, трансформації документа та видобуті бокси слів |
Чи була ця сторінка корисною?