Busca

Busca de texto nativa na composição do Visualizador

O Visualizador Doconut oferece Busca normal usando texto extraído pelo visualizador de formato ou um redirecionamento para PDF baseado em texto. Requer a capacidade de licença Search.

Habilitar a interface de busca

Busca é um módulo do Visualizador, não uma barra de ferramentas independente. A página completa deve incluir os recursos do Visualizador, a barra de ferramentas do Visualizador, a montagem do Visualizador e o objViewer inicializado; a Faixa de Busca é então montada e anexada à mesma instância.

Busca e anotação são recursos licenciados incorporados, não pacotes AddPlugin<T>(). Solicite os recursos de busca do Viewer injetado; suas tags são emitidas somente quando a licença concede Busca.

html
@Html.Raw(Viewer.ReferenceCss(new CssConfig
{
    IncludeViewerCss = true,
    IncludeSearchCss = true
}))

@Html.Raw(Viewer.ReferenceScripts(new ScriptConfig
{
    IncludeJQuery = true,
    IncludeViewerScripts = true,
    IncludeSearchScripts = true,
    IncludeSearchBar = true
}))

A faixa incorporada chama os mesmos métodos JavaScript disponíveis para uma interface personalizada.

Mantenha a composição completa do Visualizador visível na marcação, inicialize docViewer primeiro e, em seguida, anexe a Faixa licenciada:

html
<nav id="toolbar" aria-label="Document viewer controls">
    <!-- Controles do visualizador, incluindo o botão que abre a Busca -->
</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 (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>

O componente injeta os grupos Encontrar, Opções e Resultados e gerencia a busca, limpeza, contagem de correspondências e navegação entre correspondências anterior/próxima. Uma barra de ferramentas do Visualizador controlada pelo host só precisa alterná‑la:

javascript
searchBar.isOpen() ? searchBar.close() : searchBar.open();

Sua API pública é intencionalmente pequena:

MétodoPropósito
attach(objViewer)Conecta a Faixa ao visualizador inicializado; necessário uma única vez
open() / close()Exibe ou oculta a Faixa; fechar também limpa os realces
reset()Limpa o termo atual, a contagem de resultados e os realces
isOpen()Informa se a Faixa 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 Busca, e onLayout permite redimensionar/ajustar o visualizador quando a altura da Faixa muda. Para a sequência de inicialização combinada do Visualizador, Busca e Anotação, veja Início Rápido.

Busca via JavaScript

javascript
objViewer.Search(keyword, false, function (resultCount) {
    console.log('Matches:', resultCount);
});

O segundo argumento indica correspondência de palavra inteira/exata. Após o callback:

MétodoResultado
SearchMatchCount()Total de correspondências individuais no documento.
SearchSummary(false)Entradas [pageNumber, matchCount] 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.

A rota do middleware usa search=<term> e exact=true|false e retorna XML. Use a API do widget em vez de analisar essa resposta interna você mesmo.

Verificar a capacidade de busca

A resposta de inicialização relata:

text
X-Doconut-Can-Search: 1

Após a inicialização, objViewer.CanSearch() expõe o mesmo veredicto de formato/sessão. Retorna false quando o servidor envia 0; antes da resposta, ou com um servidor mais antigo que omite o cabeçalho, o padrão é true.

Três portas independentes não devem ser confundidas:

PortaPergunta
CanSearch() / cabeçalho de respostaO visualizador resolvido tem um caminho de índice/busca nativo?
AllowSearchEsta configuração de formato solicitou extração de texto onde a opção existe?
LicenseCapability.SearchO aplicativo está autorizado a executar busca 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

csharp
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 ao seu PdfConfig aninhado. Ambas têm false como padrão.

Adaptadores de busca nativa normais existem para PDF, Word, Excel, PowerPoint, TXT, Visio, email, EPUB e MHT. XPS usa seu caminho PDF por padrão. HTML e Microsoft Project se beneficiam de um redirecionamento para PDF baseado em texto:

csharp
// DefaultRender = false → convertido para 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 padrão da Busca

O servidor tenta fontes de busca nesta ordem:

  1. Resultados nativos de ISearchableViewer.
  2. Um índice de busca .srh pré-construído.
  3. Um erro/resultado vazio quando nenhuma fonte de busca existe.

O índice .srh é o artefato de busca publicado junto às imagens de página quando os documentos são servidos a partir de armazenamento compartilhado, de modo que um nó que nunca abriu o documento ainda pode responder a buscas — veja Implantações Distribuídas.

CanSearch() pode ser verdadeiro para um visualizador pesquisável mesmo quando um documento escaneado específico não possui camada de texto e, portanto, não retorna correspondências.

Licenciamento e comportamento da UI

Uma licença Temporária/Demo ativa concede Busca durante seu período ativo. Uma licença ausente e o arquivo legado TRIAL não concedem capacidade de Busca. Sem Busca:

  • ReferenceCss e ReferenceScripts omitem os pacotes de busca.
  • O middleware nega a busca em vez de retornar resultados licenciados.

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

SintomaVerificação
Barra de Busca está ausenteCapacidade de Busca e IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar
CanSearch() é falsoVisualizador de formato, caminho DefaultRender selecionado e cabeçalho de resposta de inicialização
Busca retorna zero para um PDF escaneadoO documento não tem camada de texto; use uma fonte que contenha texto ou uma projeção de PDF que preserve o texto
Busca funciona mas os realces estão deslocadosCaminho de renderização, resolução, transformações do documento e caixas de palavras extraídas

Esta página foi útil?