Поиск
Нативный текстовый поиск в составе Viewer
Doconut Viewer предоставляет обычный поиск, используя текст, извлечённый просмотрщиком формата, или перенаправление PDF на основе текста. Для работы требуется возможность лицензии Search.
Включить пользовательский интерфейс поиска
Поиск — это модуль Viewer, а не отдельная панель инструментов. Полная страница должна включать ресурсы Viewer, панель инструментов Viewer, монтирование Viewer и инициализированный objViewer; после этого лента поиска монтируется и привязывается к тому же экземпляру.
Поиск и аннотации являются встроенными лицензированными функциями, а не пакетами 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
}))Встроенная лента вызывает те же методы JavaScript, доступные пользовательскому интерфейсу.
Сохраните полную композицию Viewer видимой в разметке, сначала инициализируйте docViewer, а затем прикрепите лицензированную ленту:
<nav id="toolbar" aria-label="Document viewer controls">
<!-- Элементы управления просмотрщиком, включая кнопку, открывающую поиск -->
</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 и обрабатывает поиск, очистку, подсчёт совпадений и навигацию по предыдущим/следующим совпадениям. Панель инструментов, принадлежащая хосту, должна лишь переключать её:
searchBar.isOpen() ? searchBar.close() : searchBar.open();Его публичный API намеренно небольшого размера:
| Method | Назначение |
|---|---|
attach(objViewer) | Подключить ленту к инициализированному просмотрщику; требуется один раз |
open() / close() | Показать или скрыть ленту; закрытие также очищает выделения |
reset() | Очистить текущий запрос, количество результатов и выделения |
isOpen() | Сообщить, видна ли лента |
setStatus(message) | Передать сообщение статуса через настроенный обратный вызов |
Необязательный обратный вызов onToggle(isOpen) позволяет хосту синхронизировать кнопку поиска, а onLayout — изменять размер/переподгонять просмотрщик, когда высота ленты меняется. Для последовательности запуска комбинированного Viewer, Search и Annotation см. Быстрый старт.
Поиск из JavaScript
objViewer.Search(keyword, false, function (resultCount) {
console.log('Matches:', resultCount);
});Второй аргумент отвечает за поиск целых слов/точное совпадение. После выполнения обратного вызова:
| Method | Результат |
|---|---|
SearchMatchCount() | Общее количество отдельных совпадений в документе. |
SearchSummary(false) | Записи [pageNumber, matchCount] без перерисовки. |
SearchSummary(true) | Тот же свод и рисует выделения на страницах/миниатюрах. |
GotoSearchMatch(index) | Переходит к совпадению с нулевым индексом. |
Маршрут промежуточного слоя использует search=<term> и exact=true|false и возвращает XML. Пользуйтесь API виджета, а не парсите внутренний ответ самостоятельно.
Проверить возможность поиска
Ответ инициализации содержит:
X-Doconut-Can-Search: 1После инициализации objViewer.CanSearch() выдаёт тот же вердикт формата/сессии. Он возвращает false, когда сервер посылает 0; до получения ответа или при старом сервере, который не отправляет заголовок, значение по умолчанию — true.
Три независимых условия не следует путать:
| Gate | Вопрос |
|---|---|
CanSearch() / response header | Имеет ли выбранный просмотрщик собственный индекс/путь поиска? |
AllowSearch | Запрашивала ли конфигурация формата извлечение текста, где существует переключатель? |
LicenseCapability.Search | Разрешено ли приложению выполнять поиск и получать UI‑пакеты? |
Формат может быть технически searchable, тогда как текущая лицензия запрещает операцию.
Включить извлечение по формату
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
Активная временная/демо‑лицензия предоставляет возможность Search в течение своего активного периода. Отсутствующая лицензия и устаревший файл TRIAL не предоставляют возможности Search. Без Search:
ReferenceCssиReferenceScriptsне включают пакеты поиска.- Промежуточный слой отклоняет запросы поиска вместо возврата лицензированных результатов.
Управляйте видимостью пользовательского UI через IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search) и используйте CanSearch() для отдельного вердикта формата/сессии.
Устранение неполадок
| Симптом | Проверка |
|---|---|
| Полоса поиска отсутствует | Возможность поиска и IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar |
CanSearch() возвращает false | Просмотрщик формата, выбранный путь DefaultRender и заголовок ответа инициализации |
| Поиск возвращает ноль для отсканированного PDF | Документ не содержит текстового слоя; используйте источник с текстом или проекцию PDF, сохраняющую текст |
| Поиск работает, но выделения смещены | Путь рендеринга, разрешение, преобразования документа и извлечённые коробки слов |
Была ли эта страница полезной?