Pesquisa
Pesquisa de texto nativa na composição do Viewer
O Doconut Viewer fornece pesquisa normal usando texto extraído pelo visualizador de formato ou um redirecionamento de PDF baseado em texto. Ele requer a capacidade de licença Search.
Habilitar a interface de pesquisa
A pesquisa é um módulo do Viewer, não uma barra de ferramentas independente. A página completa deve incluir os recursos do Viewer, a barra de ferramentas do Viewer, a montagem do Viewer e o objViewer inicializado; a Ribbon de Pesquisa é então montada e anexada à mesma instância.
Pesquisa e anotação são recursos licenciados incorporados, não pacotes AddPlugin<T>(). Solicite os recursos de pesquisa de Viewer; suas tags são emitidas somente quando a licença concede Pesquisa. As visualizações MVC 5 não possuem @inject, portanto construa as tags no controlador e passe-as em ViewBag, juntamente com a bandeira de licença que a página necessita:
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;Escreva-as na visualização com @Html.Raw(ViewBag.ViewerCss) e @Html.Raw(ViewBag.ViewerScripts). No Web Forms, exponha os mesmos valores do code-behind e escreva-os com <%= %>.
A ribbon incorporada chama os mesmos métodos JavaScript disponíveis para uma UI personalizada.
Mantenha a composição completa do Viewer visível no markup, inicialize docViewer primeiro e, em seguida, anexe a Ribbon licenciada:
<nav id="toolbar" aria-label="Document viewer controls">
<!-- Controles do visualizador, incluindo o botão que abre a Pesquisa -->
</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>O if do lado do servidor é importante: sem a capacidade de Pesquisa, ReferenceScripts omite o script da Ribbon, de modo que uma chamada não protegida a doconutSearchBar(...) lançaria uma exceção e impediria a página do viewer de iniciar. No Web Forms, escreva a mesma proteção como <% if (IsSearchEnabled) { %> … <% } %>.
O componente injeta os grupos Find, Options e Results e gerencia a pesquisa, limpeza, contagem de correspondências e navegação de correspondência anterior/próxima. Uma barra de ferramentas do Viewer de propriedade do host só precisa alterná‑la:
searchBar.isOpen() ? searchBar.close() : searchBar.open();Sua API pública é intencionalmente pequena:
| Método | Propósito |
|---|---|
attach(objViewer) | Conecta a Ribbon ao viewer inicializado; necessário uma vez |
open() / close() | Mostra ou oculta a Ribbon; fechar também limpa os realces |
reset() | Limpa o termo atual, a contagem de resultados e os realces |
isOpen() | Informa se a Ribbon está visível |
setStatus(message) | Encaminha uma mensagem de status através do callback configurado |
O callback opcional onToggle(isOpen) permite que o host sincronize seu botão de Pesquisa, e onLayout permite redimensionar/ajustar o viewer quando a altura da Ribbon mudar. Para a sequência de inicialização combinada de Viewer, Pesquisa e Anotação, veja Quick Start.
Pesquisa a partir de JavaScript
objViewer.Search(keyword, false, function (resultCount) {
console.log('Matches:', resultCount);
});O segundo argumento é correspondência de palavra inteira/exata. A contagem de correspondências chega na callback: Search em si vai ao servidor e não retorna nada útil, então var n = objViewer.Search(keyword, false) sempre lê undefined — e uma página construída dessa forma relata "nothing found" enquanto o visualizador destaca as correspondências. Após a callback:
| Método | Resultado |
|---|---|
SearchMatchCount() | Total de correspondências individuais no documento. |
SearchSummary(false) | [pageNumber, matchCount] entradas sem repintura. |
SearchSummary(true) | Mesmo resumo e pinta realces de página/miniatura. |
GotoSearchMatch(index) | Navega para um índice de correspondência baseado em zero. |
DocImage.axd responde search=<term> e exact=true|false com XML. Use a API do widget em vez de analisar essa resposta interna você mesmo.
Verificar capacidade de pesquisa
A resposta de inicialização relata:
X-Doconut-Can-Search: 1Após a inicialização, objViewer.CanSearch() expõe o mesmo veredicto de formato/sessão. Ele retorna false quando o servidor envia 0; antes da resposta, ou com um servidor mais antigo que omite o cabeçalho, ele padrão para true.
Três portas independentes não devem ser confundidas:
| Porta | Pergunta |
|---|---|
CanSearch() / response header | O visualizador resolvido tem um caminho de índice/pesquisa nativo? |
AllowSearch | Esta configuração de formato solicitou extração de texto onde o interruptor existe? |
LicenseCapability.Search | O aplicativo está autorizado a executar pesquisa e receber os pacotes de UI? |
Um formato pode ser tecnicamente pesquisável enquanto a licença atual nega a operação.
Habilitar extração por formato
var token = await viewer.OpenDocumentAsync(path, new PdfConfig
{
AllowSearch = true,
AllowCopy = true // opcional: permite ao usuário arrastar uma região e copiar seu texto
});AllowSearch e AllowCopy existem em PdfConfig, WordConfig, ExcelConfig e PptConfig. As propriedades do Office delegam para seus PdfConfig aninhados. Ambas padrão para false.
Adaptadores nativos de pesquisa normais existem para PDF, Word, Excel, PowerPoint, TXT, Visio, e‑mail, EPUB e MHT. XPS usa seu caminho PDF por padrão. HTML e Microsoft Project se beneficiam de um redirecionamento PDF baseado em texto:
// DefaultRender = false → convertido em um PDF baseado em texto → pesquisável
var token = await viewer.OpenDocumentAsync(path, new HtmlConfig { DefaultRender = false });Para renderizadores nativos, CanSearch() descreve a capacidade do visualizador; não garante que um documento específico contenha texto utilizável. Um PDF cujas páginas são apenas imagens escaneadas ainda pode produzir zero resultados nativos.
Comportamento normal de pesquisa
O servidor tenta fontes de pesquisa nesta ordem:
- Resultados nativos de
ISearchableViewer. - Um índice de pesquisa
.srhpré-construído. - Um erro/resultado vazio quando nenhuma fonte de pesquisa existe.
CanSearch() pode ser verdadeiro para um visualizador pesquisável mesmo quando um documento específico não tem camada de texto e, portanto, não retorna correspondências.
Licenciamento e comportamento da UI
Uma licença Temporária/Demo ativa concede Pesquisa durante seu período ativo. Uma licença ausente e um arquivo legado TRIAL não concedem capacidade de Pesquisa. Sem Pesquisa:
ReferenceCsseReferenceScriptsomitem os pacotes de pesquisa.DocImage.axdrecusa solicitações de pesquisa em vez de retornar resultados.
Controle a visibilidade da UI personalizada a partir de IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search) e use CanSearch() para o veredicto separado de formato/sessão.
Solução de problemas
| Sintoma | Verificação |
|---|---|
| Barra de pesquisa está ausente | Capacidade de pesquisa e IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar |
CanSearch() é falso | Visualizador de formato, caminho DefaultRender selecionado e cabeçalho da resposta de inicialização |
| Pesquisa retorna zero para um PDF escaneado | O documento não tem camada de texto; use uma fonte que contenha texto ou uma projeção PDF que preserve o texto |
| Pesquisa funciona mas os realces estão deslocados | Caminho de renderização, resolução, transformações do documento e caixas de palavras extraídas |
Esta página foi útil?