Recherche

Recherche de texte native dans la composition du Viewer

Le Doconut Viewer fournit une recherche normale en utilisant le texte extrait par le visualiseur de format ou une redirection PDF basée sur le texte. Il nécessite la capacité de licence Search.

Activer l'interface de recherche

La recherche est un module du Viewer, pas une barre d'outils autonome. La page complète doit inclure les ressources du Viewer, la barre d'outils du Viewer, le montage du Viewer, et le objViewer initialisé ; le Ruban de recherche est alors monté et attaché à cette même instance.

La recherche et l'annotation sont des fonctionnalités sous licence intégrées, pas des packages AddPlugin<T>(). Demandez les ressources de recherche auprès du Viewer injecté ; leurs balises ne sont émises que lorsque la licence accorde la recherche.

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

Le ruban intégré appelle les mêmes méthodes JavaScript disponibles pour une interface personnalisée.

Conservez la composition complète du Viewer visible dans le balisage, initialisez d'abord le docViewer, puis attachez le Ruban sous licence :

html
<nav id="toolbar" aria-label="Document viewer controls">
    <!-- Contrôles de la visionneuse, y compris le bouton qui ouvre la recherche -->
</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>

Le composant injecte les groupes Find, Options et Results et gère la recherche, le nettoyage, le comptage des correspondances et la navigation vers la correspondance précédente/suivante. Une barre d'outils du Viewer appartenant à l'hôte n'a besoin que de l'activer :

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

Son API publique est intentionnellement petite :

MéthodeObjectif
attach(objViewer)Connecte le Ruban au viewer initialisé ; requis une fois
open() / close()Affiche ou masque le Ruban ; la fermeture supprime également les surlignages
reset()Efface le terme actuel, le nombre de résultats et les surlignages
isOpen()Indique si le Ruban est visible
setStatus(message)Transmet un message d'état via le rappel configuré

Le rappel optionnel onToggle(isOpen) permet à l'hôte de synchroniser son bouton de recherche, et onLayout lui permet de redimensionner/ajuster le viewer lorsque la hauteur du Ruban change. Pour la séquence de démarrage combinée du Viewer, de la Recherche et de l'Annotation, voir Démarrage rapide.

Recherche depuis JavaScript

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

Le deuxième argument indique une correspondance mot entier/exacte. Après le rappel :

MéthodeRésultat
SearchMatchCount()Nombre total de correspondances individuelles dans le document.
SearchSummary(false)[pageNumber, matchCount] entrées sans rafraîchissement.
SearchSummary(true)Même résumé et peint les surlignages de page/vignette.
GotoSearchMatch(index)Navigue vers un index de correspondance basé sur zéro.

La route middleware utilise search=<term> et exact=true|false et renvoie du XML. Utilisez l'API du widget plutôt que d'analyser vous‑même cette réponse interne.

Vérifier la capacité de recherche

La réponse d'initialisation indique :

text
X-Doconut-Can-Search: 1

Après l'initialisation, objViewer.CanSearch() expose le même verdict format/session. Il renvoie false lorsque le serveur envoie 0 ; avant la réponse, ou avec un serveur plus ancien qui omet l'en‑tête, il revient à true.

Trois portes indépendantes ne doivent pas être confondues :

PorteQuestion
CanSearch() / response headerLe viewer résolu possède‑t‑il un chemin d'index/recherche natif ?
AllowSearchCette configuration de format a‑t‑elle demandé l'extraction de texte où le commutateur existe ?
LicenseCapability.SearchL'application est‑elle autorisée à exécuter la recherche et à recevoir les paquets UI ?

Un format peut être techniquement recherchable alors que la licence actuelle refuse l'opération.

Activer l'extraction par format

csharp
var token = await viewer.OpenDocumentAsync(path, new PdfConfig
{
    AllowSearch = true,
    AllowCopy   = true   // optionnel: permet à l'utilisateur de faire glisser une région et de copier son texte
});

AllowSearch et AllowCopy existent sur PdfConfig, WordConfig, ExcelConfig et PptConfig. Les propriétés Office délèguent à leurs PdfConfig imbriqués. Les deux ont pour valeur par défaut false.

Des adaptateurs de recherche native normaux existent pour PDF, Word, Excel, PowerPoint, TXT, Visio, email, EPUB et MHT. XPS utilise son chemin PDF par défaut. HTML et Microsoft Project bénéficient d'une redirection PDF basée sur le texte :

csharp
// DefaultRender = false → converti en PDF basé sur du texte → recherchable
var token = await viewer.OpenDocumentAsync(path, new HtmlConfig { DefaultRender = false });

Pour les rendus natifs, CanSearch() décrit la capacité du viewer ; cela ne garantit pas qu'un document particulier contienne du texte exploitable. Un PDF dont les pages ne sont que des images numérisées peut toujours produire zéro résultat natif.

Comportement de la recherche normale

Le serveur tente les sources de recherche dans cet ordre :

  1. Résultats du viewer natif du format.
  2. Un index de recherche préconstruit .srh.
  3. Une erreur/résultat vide lorsqu'aucune source de recherche n'existe.

L'index .srh est l'artefact de recherche publié avec les images de page lorsque les documents sont servis depuis un stockage partagé, de sorte qu'un nœud n'ayant jamais ouvert le document peut toujours répondre aux recherches — voir Déploiements distribués.

CanSearch() peut être vrai pour un viewer recherchable même lorsqu'un document numérisé particulier n'a pas de couche de texte et renvoie donc aucune correspondance.

Licence et comportement de l'interface

Une licence Temporaire/Démo active accorde la recherche pendant sa période active. Une licence manquante et un fichier legacy TRIAL n'accordent aucune capacité de recherche. Sans recherche :

  • ReferenceCss et ReferenceScripts omettent les paquets de recherche.
  • Le middleware refuse la recherche au lieu de renvoyer des résultats sous licence.

Contrôlez la visibilité de l'interface personnalisée depuis IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search) et utilisez CanSearch() pour le verdict séparé format/session.

Dépannage

SymptômeVérification
Barre de recherche manquanteCapacité de recherche et IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar
CanSearch() est fauxViewer de format, chemin DefaultRender sélectionné, et en‑tête de réponse d'initialisation
La recherche renvoie zéro pour un PDF numériséLe document n'a pas de couche de texte ; utilisez une source contenant du texte ou une projection PDF qui préserve le texte
La recherche fonctionne mais les surlignages sont décalésChemin de rendu, résolution, transformations du document, et boîtes de mots extraites

Cette page était-elle utile ?