Búsqueda

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

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

Habilitar la interfaz de búsqueda

Search 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 el objViewer inicializado; luego el Ribbon de Search se monta y se adjunta a esa misma instancia.

Search 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 generan solo cuando la licencia otorga Search.

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 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">
    <!-- Viewer controls, including the button that opens 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, el borrado, 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 visor inicializado; requerido una vez
open() / close()Muestra u oculta el Ribbon; cerrar también elimina los resaltados
reset()Borra 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 Search, y onLayout le permite redimensionar/ajustar el visor cuando el Ribbon cambia de altura. Para la secuencia de inicio combinada del Viewer, Search y Annotation, consulte 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)Entradas [pageNumber, matchCount] sin repintar.
SearchSummary(true)Mismo resumen y pinta los 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, el valor predeterminado es true.

No se deben confundir tres puertas independientes:

PuertaPregunta
CanSearch() / encabezado de respuesta¿Tiene el visor resuelto un índice/ruta de búsqueda nativa?
AllowSearch¿Solicitó esta configuración de formato la extracción de texto donde existe el interruptor?
LicenseCapability.Search¿Está la aplicación autorizada a ejecutar búsquedas 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   // optional: lets the user drag a region and copy its text
});

AllowSearch y AllowCopy existen en PdfConfig, WordConfig, ExcelConfig y PptConfig. Las propiedades de Office delegan a su PdfConfig anidado. Ambas tienen false como valor predeterminado.

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 a PDF basada en texto:

csharp
// DefaultRender = false → converted to a text-based PDF → searchable
var token = await viewer.OpenDocumentAsync(path, new HtmlConfig { DefaultRender = false });

Para los renderizadores nativos, CanSearch() describe la capacidad del visor; 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 nativos de ISearchableViewer.
  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 visor 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 Search durante su período activo. Una licencia ausente y un archivo TRIAL heredado no otorgan capacidad de Search. Sin Search:

  • 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 mediante IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search) y use CanSearch() para el veredicto separado de formato/sesión.

Solución de problemas

SíntomaVerificación
Falta la barra de búsquedaCapacidad de Search y IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar
CanSearch() es falsoVisor de formato, ruta DefaultRender seleccionada y encabezado de respuesta de inicialización
Search 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
Search funciona pero los resaltados están desplazadosRuta de renderizado, resolución, transformaciones del documento y cajas de palabras extraídas

¿Fue útil esta página?