Поиск
Нативный текстовый поиск в композиции 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
}))Встроенный ribbon вызывает те же методы JavaScript, доступные пользовательскому интерфейсу.
Сохраняйте полную композицию 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 намеренно небольшой:
| Method | Purpose |
|---|---|
attach(objViewer) | Подключить Ribbon к инициализированному viewer; требуется один раз |
open() / close() | Показать или скрыть Ribbon; закрытие также очищает подсветки |
reset() | Очистить текущий запрос, количество результатов и подсветки |
isOpen() | Сообщить, виден ли Ribbon |
setStatus(message) | Передать статусное сообщение через настроенный callback |
Опциональный callback onToggle(isOpen) позволяет хосту синхронизировать кнопку Поиск, а onLayout позволяет изменять размер/подгонять viewer, когда высота Ribbon меняется. Для последовательности запуска комбинированного Viewer, Search и Annotation см. Быстрый старт.
Поиск из JavaScript
objViewer.Search(keyword, false, function (resultCount) {
console.log('Matches:', resultCount);
});Второй аргумент — поиск целых слов/точное совпадение. После callback:
| Method | Result |
|---|---|
SearchMatchCount() | Общее количество отдельных совпадений в документе. |
SearchSummary(false) | [pageNumber, matchCount] записей без перерисовки. |
SearchSummary(true) | Тот же сводный результат и рисует подсветку страниц/миниатюр. |
GotoSearchMatch(index) | Переходит к совпадению с нулевым индексом. |
Маршрут middleware использует search=<term> и exact=true|false и возвращает XML. Используйте widget API вместо самостоятельного разбора внутреннего ответа.
Проверка возможности поиска
Ответ инициализации сообщает:
X-Doconut-Can-Search: 1После инициализации objViewer.CanSearch() раскрывает тот же вердикт формата/сессии. Он возвращает false, когда сервер отправляет 0; до ответа, или при более старом сервере, который опускает заголовок, по умолчанию используется true.
Три независимых шлюза не должны путаться:
| Шлюз | Вопрос |
|---|---|
CanSearch() / response header | Имеет ли разрешённый viewer нативный путь индекса/поиска? |
AllowSearch | Запрашивала ли конфигурация этого формата извлечение текста, где существует переключатель? |
LicenseCapability.Search | Авторизовано ли приложение выполнять поиск и получать UI‑пакеты? |
Формат может быть технически пригодным для поиска, пока текущая лицензия запрещает эту операцию.
Включение извлечения по формату
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 на основе текста → доступно для поиска
var token = await viewer.OpenDocumentAsync(path, new HtmlConfig { DefaultRender = false });Для нативных рендереров CanSearch() описывает возможности viewer; это не гарантирует, что конкретный документ содержит пригодный текст. PDF, страницы которого являются только отсканированными изображениями, всё равно может дать ноль нативных результатов.
Обычное поведение поиска
Сервер пытается использовать источники поиска в следующем порядке:
- Нативные результаты
ISearchableViewer. - Предсозданный поисковый индекс
.srh. - Ошибка/пустой результат, когда источник поиска отсутствует.
CanSearch() может быть истинным для поискового viewer, даже если у конкретного документа нет текстового слоя и он поэтому не возвращает совпадений.
Лицензирование и поведение UI
Активная временная/демо‑лицензия предоставляет поиск в течение своего активного периода. Отсутствующая лицензия и устаревший файл TRIAL не предоставляют возможности поиска. Без поиска:
ReferenceCssиReferenceScriptsопускают пакеты поиска.- Middleware отказывает в поиске вместо возврата лицензированных результатов.
Управляйте видимостью пользовательского UI через IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search) и используйте CanSearch() для отдельного вердикта формата/сессии.
Устранение неполадок
| Симптом | Проверка |
|---|---|
| Отсутствует строка поиска | Возможность поиска и IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar |
CanSearch() ложно | Просмотрщик формата, выбранный путь DefaultRender и заголовок ответа инициализации |
| Поиск возвращает ноль для отсканированного PDF | Документ не имеет текстового слоя; используйте источник с текстом или проекцию PDF, сохраняющую текст |
| Поиск работает, но подсветка смещена | Путь рендеринга, разрешение, трансформации документа и извлечённые коробки слов |
Была ли эта страница полезной?