Búsqueda

Búsqueda de texto nativa en la composición del Viewer

El Doconut Viewer proporciona Búsqueda normal usando texto extraído por el visor de formato o una redirección de PDF basada en texto. Requiere la capacidad de licencia Search.

Habilitar la interfaz de búsqueda

La Búsqueda es un módulo del Viewer, no una barra de herramientas independiente. La página completa debe incluir los recursos del Viewer, la barra de herramientas del Viewer, el montaje del Viewer y objViewer inicializado; el Ribbon de Búsqueda se monta y se adjunta a esa misma instancia.

La Búsqueda y la anotación son funciones con licencia incorporadas, no paquetes AddPlugin<T>(). Solicite los recursos de búsqueda del Viewer inyectado; sus etiquetas se emiten solo cuando la licencia otorga Búsqueda.

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
}))

El ribbon incrustado llama a los mismos métodos de JavaScript disponibles para una UI personalizada.

Mantenga la composición completa del Viewer visible en el marcado, inicialice docViewer primero y luego adjunte el Ribbon con licencia:

html
<nav id="toolbar" aria-label="Document viewer controls">
    <!-- Controles del visor, incluyendo el botón que abre 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: '/',
        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>

El componente inyecta los grupos Find, Options y Results y maneja la búsqueda, la limpieza, el recuento de coincidencias y la navegación a coincidencias anterior/siguiente. Una barra de herramientas del Viewer administrada por el host solo necesita alternarla:

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

Su API pública es intencionalmente pequeña:

MétodoPropósito
attach(objViewer)Conecta el Ribbon al viewer inicializado; se requiere una vez
open() / close()Muestra u oculta el Ribbon; cerrar también elimina los resaltados
reset()Limpia el término actual, el recuento de resultados y los resaltados
isOpen()Informa si el Ribbon está visible
setStatus(message)Reenvía un mensaje de estado a través del callback configurado

El callback opcional onToggle(isOpen) permite al host sincronizar su botón de Búsqueda, y onLayout le permite redimensionar/ajustar el viewer cuando el Ribbon cambia de altura. Para la secuencia de inicio combinada del Viewer, Búsqueda y Anotación, vea Inicio rápido.

Búsqueda desde JavaScript

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

El segundo argumento es coincidencia de palabra completa/exacta. Después del callback:

MétodoResultado
SearchMatchCount()Total de coincidencias individuales en el documento.
SearchSummary(false)[pageNumber, matchCount] entradas sin repintar.
SearchSummary(true)Mismo resumen y pinta resaltados de página/miniatura.
GotoSearchMatch(index)Navega a un índice de coincidencia basado en cero.

La ruta del middleware usa search=<term> y exact=true|false y devuelve XML. Utilice la API del widget en lugar de analizar esa respuesta interna usted mismo.

Verificar la capacidad de búsqueda

La respuesta de inicialización informa:

text
X-Doconut-Can-Search: 1

Después de la inicialización, objViewer.CanSearch() expone el mismo veredicto de formato/sesión. Devuelve false cuando el servidor envía 0; antes de la respuesta, o con un servidor más antiguo que omite el encabezado, por defecto es true.

No se deben confundir tres puertas independientes:

PuertaPregunta
CanSearch() / response header¿Tiene el viewer resuelto un índice/ruta de búsqueda nativo?
AllowSearch¿Solicitó esta configuración de formato la extracción de texto donde existe el interruptor?
LicenseCapability.Search¿Está la aplicación autorizada para ejecutar la búsqueda y recibir los paquetes UI?

Un formato puede ser técnicamente buscable mientras la licencia actual niega la operación.

Habilitar extracción por formato

csharp
var token = await viewer.OpenDocumentAsync(path, new PdfConfig
{
    AllowSearch = true,
    AllowCopy   = true   // opcional: permite al usuario arrastrar una región y copiar su texto
});

AllowSearch y AllowCopy existen en PdfConfig, WordConfig, ExcelConfig y PptConfig. Las propiedades de Office delegan a sus PdfConfig anidados. Ambos por defecto son false.

Existen adaptadores de búsqueda nativa normales para PDF, Word, Excel, PowerPoint, TXT, Visio, correo electrónico, EPUB y MHT. XPS usa su ruta PDF por defecto. HTML y Microsoft Project se benefician de una redirección de PDF basada en texto:

csharp
// DefaultRender = false → convertido a un PDF basado en texto → buscable
var token = await viewer.OpenDocumentAsync(path, new HtmlConfig { DefaultRender = false });

Para los renderizadores nativos, CanSearch() describe la capacidad del viewer; no garantiza que un documento particular contenga texto utilizable. Un PDF cuyas páginas son solo imágenes escaneadas aún puede producir cero resultados nativos.

Comportamiento normal de la Búsqueda

El servidor intenta fuentes de búsqueda en este orden:

  1. Resultados del visor nativo del formato.
  2. Un índice de búsqueda .srh preconstruido.
  3. Un error/resultado vacío cuando no existe fuente de búsqueda.

El índice .srh es el artefacto de búsqueda publicado junto a las imágenes de página cuando los documentos se sirven desde almacenamiento compartido, por lo que un nodo que nunca abrió el documento aún puede responder búsquedas — vea Despliegues distribuidos.

CanSearch() puede ser verdadero para un viewer buscable incluso cuando un documento escaneado particular no tiene capa de texto y, por lo tanto, no devuelve coincidencias.

Licenciamiento y comportamiento de la UI

Una licencia Temporal/Demo activa otorga Búsqueda durante su período activo. Una licencia faltante y un archivo legacy TRIAL no otorgan capacidad de Búsqueda. Sin Búsqueda:

  • ReferenceCss y ReferenceScripts omiten los paquetes de búsqueda.
  • El middleware niega la búsqueda en lugar de devolver resultados con licencia.

Controle la visibilidad de la UI personalizada desde IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search) y use CanSearch() para el veredicto de formato/sesión separado.

Solución de problemas

SíntomaVerificación
Falta la barra de búsquedacapacidad de búsqueda y IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar
CanSearch() es falsoVisor de formato, ruta DefaultRender seleccionada y encabezado de respuesta de inicialización
Búsqueda devuelve cero para un PDF escaneadoEl documento no tiene capa de texto; use una fuente con texto o una proyección PDF que preserve el texto
Búsqueda funciona pero los resaltados están desalineadosRuta de renderizado, resolución, transformaciones del documento y cajas de palabras extraídas

¿Fue útil esta página?