Búsqueda

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

El Doconut Viewer ofrece una búsqueda normal utilizando 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

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 al Viewer; sus etiquetas se generan solo cuando la licencia concede Search. Las vistas MVC 5 no tienen @inject, por lo que se deben crear las etiquetas en el controlador y pasarlas a ViewBag, junto con la bandera de licencia que necesita la página:

csharp
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;

Escríbalas en la vista con @Html.Raw(ViewBag.ViewerCss) y @Html.Raw(ViewBag.ViewerScripts). En Web Forms, exponga los mismos valores desde el code-behind y escríbalos con <%= %>.

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 ((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>

El if del lado del servidor es importante: sin la capacidad de Search, ReferenceScripts omite el script del Ribbon, por lo que una llamada sin protección a doconutSearchBar(...) lanzaría una excepción y detendría el inicio de la página del viewer. En Web Forms, escriba la misma protección como <% if (IsSearchEnabled) { %> … <% } %>.

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 anteriores/siguientes. 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; 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()Indica 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 Search, y onLayout le permite redimensionar/ajustar el viewer 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 indica coincidencia de palabra completa/exacta. El recuento de coincidencias llega en la devolución de llamada: Search envía la solicitud al servidor y no devuelve nada útil, por lo que var n = objViewer.Search(keyword, false) siempre devuelve undefined — y una página construida de esa manera muestra "nothing found" mientras el visor resalta las coincidencias. Después de la devolución de llamada:

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.

DocImage.axd responde a search=<term> y exact=true|false con XML. Use la API del widget en lugar de analizar esa respuesta interna usted mismo.

Verificar 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() / response header¿El visor resuelto tiene un índice/ruta de búsqueda nativo?
AllowSearch¿Esta configuración de formato solicitó extracción de texto donde existe el interruptor?
LicenseCapability.Search¿La aplicación está autorizada para ejecutar búsquedas y recibir los paquetes de UI?

Un formato puede ser técnicamente buscable mientras que 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 renderizadores nativos, CanSearch() describe la capacidad del visor; no garantiza que un documento concreto contenga texto utilizable. Un PDF cuyas páginas son solo imágenes escaneadas aún puede producir cero resultados nativos.

Comportamiento normal de 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.

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

Licenciamiento y comportamiento de UI

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

  • ReferenceCss y ReferenceScripts omiten los paquetes de búsqueda.
  • DocImage.axd rechaza solicitudes de búsqueda en lugar de devolver resultados.

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

Solución de problemas

SíntomaVerificación
La barra de búsqueda faltaCapacidad de búsqueda y IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar
CanSearch() es falsoVisor de formato, ruta DefaultRender seleccionada y encabezado de respuesta de inicialización
La 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
La 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?