Пошук
Рідний текстовий пошук у складі Viewer
Doconut Viewer забезпечує звичайний пошук, використовуючи текст, витягнутий переглядачем формату, або перенаправлення PDF на основі тексту. Для цього потрібна ліцензійна можливість Search.
Увімкнення інтерфейсу пошуку
Пошук — це модуль Viewer, а не окрема панель інструментів. Повна сторінка повинна містити ресурси Viewer, панель інструментів Viewer, монтування Viewer та ініціалізований objViewer; після цього Ribbon пошуку монтується та підключається до того ж екземпляра.
Пошук і анотація — це вбудовані ліцензовані функції, а не пакети AddPlugin<T>(). Запитуйте ресурси пошуку у Viewer; їхні теги генеруються лише коли ліцензія дозволяє пошук. У представленнях MVC 5 немає @inject, тому створюйте теги у контролері та передавайте їх через ViewBag разом із прапорцем ліцензії, який потрібен сторінці:
var viewer = Doconut.DoconutHost.Services.GetRequiredService<Viewer>();
ViewBag.ViewerCss = viewer.ReferenceCss(new CssConfig
{
IncludeViewerCss = true,
IncludeSearchCss = true
});
ViewBag.ViewerScripts = viewer.ReferenceScripts(new ScriptConfig
{
IncludeJQuery = true,
IncludeViewerScripts = true,
IncludeSearchScripts = true,
IncludeSearchBar = true
});
ViewBag.IsSearchEnabled = viewer.IsSearchEnabled;Запишіть їх у представлення за допомогою @Html.Raw(ViewBag.ViewerCss) та @Html.Raw(ViewBag.ViewerScripts). У Web Forms експонуйте ті ж значення з коду‑задника і виводьте їх за допомогою <%= %>.
Вбудований Ribbon викликає ті ж JavaScript‑методи, що доступні кастомному UI.
Залиште повний склад Viewer видимим у розмітці, спочатку ініціалізуйте docViewer, а потім підключіть ліцензований Ribbon:
<nav id="toolbar" aria-label="Document viewer controls">
<!-- Елементи керування Viewer, включаючи кнопку, що відкриває Пошук -->
</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 ((bool)ViewBag.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>Серверна умова if має значення: без можливості Search ReferenceScripts не включає скрипт Ribbon, тому незахищений виклик doconutSearchBar(...) викличе помилку і зупинить завантаження сторінки Viewer. У Web Forms запишіть той самий захист як <% if (IsSearchEnabled) { %> … <% } %>.
Компонент інжектує групи 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, Search та Annotation дивіться Швидкий старт.
Пошук з JavaScript
objViewer.Search(keyword, false, function (resultCount) {
console.log('Matches:', resultCount);
});Другий аргумент відповідає за пошук цілих слів/точне співпадіння. Кількість збігів надходить у зворотному виклику: Search сам звертається до сервера і не повертає нічого корисного, тому var n = objViewer.Search(keyword, false) завжди має значення undefined — і сторінка, створена таким чином, повідомляє «нічого не знайдено», хоча переглядач підсвічує збіги. Після зворотного виклику:
| Метод | Результат |
|---|---|
SearchMatchCount() | Загальна кількість окремих збігів у документі. |
SearchSummary(false) | Записи [pageNumber, matchCount] без перерисовки. |
SearchSummary(true) | Той самий підсумок і малює підсвічування сторінки/мініатюри. |
GotoSearchMatch(index) | Переміщає до збігу за індексом, починаючи з нуля. |
DocImage.axd відповідає на запити search=<term> та exact=true|false у форматі XML. Користуйтеся API віджету, а не розбирайте цю внутрішню відповідь самостійно.
Перевірка можливості пошуку
Відповідь ініціалізації містить:
X-Doconut-Can-Search: 1Після ініціалізації objViewer.CanSearch() повертає той самий verdict формату/сесії. Він повертає false, коли сервер надсилає 0; до отримання відповіді або при використанні старішого сервера, який не надсилає заголовок, значення за замовчуванням — true.
Три незалежні «ворота», які не слід плутати:
| Ворота | Питання |
|---|---|
CanSearch() / response header | Чи має вирішений переглядач вбудований індекс/шлях пошуку? |
AllowSearch | Чи запитував цей формат конфігурацію витягування тексту, де існує перемикач? |
LicenseCapability.Search | Чи дозволено застосунку виконувати пошук і отримувати UI‑пакети? |
Формат може бути технічно пошуковим, хоча поточна ліцензія забороняє цю операцію.
Увімкнути витягування для формату
var token = await viewer.OpenDocumentAsync(path, new PdfConfig
{
AllowSearch = true,
AllowCopy = true // optional: дозволяє користувачеві виділити область і скопіювати її текст
});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 → доступний для пошуку
var token = await viewer.OpenDocumentAsync(path, new HtmlConfig { DefaultRender = false });Для нативних рендерерів CanSearch() описує можливості переглядача; це не гарантує, що конкретний документ містить придатний текст. PDF, сторінки якого є лише сканованими зображеннями, може не давати жодних нативних результатів.
Нормальна поведінка пошуку
Сервер намагається використовувати джерела пошуку у такому порядку:
- Результати вбудованого
ISearchableViewer. - Попередньо створений індекс пошуку
.srh. - Помилка/порожній результат, коли джерело пошуку відсутнє.
CanSearch() може бути true для переглядача, що підтримує пошук, навіть якщо конкретний документ не має текстового шару і, отже, не повертає збігів.
Ліцензування та поведінка UI
Активна тимчасова/демо‑ліцензія надає можливість пошуку протягом свого активного періоду. Відсутність ліцензії та застарілий файл TRIAL не дають можливості пошуку. Без пошуку:
ReferenceCssіReferenceScriptsне включають пакети пошуку.DocImage.axdвідхиляє запити пошуку замість повернення результатів.
Керуйте видимістю власного UI через IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search) і використовуйте CanSearch() для окремого verdict формату/сесії.
Устранення проблем
| Симптом | Перевірка |
|---|---|
| Панель пошуку відсутня | Можливість пошуку та IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar |
CanSearch() повертає false | Переглядач формату, вибраний шлях DefaultRender та заголовок відповіді ініціалізації |
| Пошук повертає нуль для сканованого PDF | Документ не має текстового шару; використайте джерело з текстом або проекцію PDF, що зберігає текст |
| Пошук працює, але підсвічування зміщене | Шлях рендерингу, роздільна здатність, трансформації документа та видобуті блоки слів |
Чи була ця сторінка корисною?