Recherche
Recherche de texte native dans la composition du Viewer
Le Viewer Doconut fournit une recherche normale en utilisant le texte extrait par le visualiseur de format ou une redirection PDF basée sur du texte. Elle nécessite la capacité de licence Search.
Activer l'interface de recherche
Search 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 Search est alors monté et attaché à cette même instance.
Search et annotation sont des fonctionnalités sous licence intégrées, pas des packages AddPlugin<T>(). Demandez les ressources de recherche auprès de Viewer ; leurs balises ne sont émises que lorsque la licence accorde Search. Les vues MVC 5 n'ont pas de @inject, donc créez les balises dans le contrôleur et transmettez‑les via ViewBag, avec le drapeau de licence dont la page a besoin :
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;Écrivez‑les dans la vue avec @Html.Raw(ViewBag.ViewerCss) et @Html.Raw(ViewBag.ViewerScripts). Dans Web Forms, exposez les mêmes valeurs depuis le code‑behind et écrivez‑les avec <%= %>.
Le ruban intégré appelle les mêmes méthodes JavaScript disponibles pour une UI personnalisée.
Gardez la composition complète du Viewer visible dans le balisage, initialisez d'abord docViewer, puis attachez le ruban sous licence :
<nav id="toolbar" aria-label="Document viewer controls">
<!-- Contrôles du Viewer, 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 ((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>Le if côté serveur est important : sans la capacité Search, ReferenceScripts omet le script du ruban, de sorte qu'un appel non protégé à doconutSearchBar(...) provoquerait une exception et empêcherait le démarrage de la page du viewer. Dans Web Forms, écrivez la même garde comme <% if (IsSearchEnabled) { %> … <% } %>.
Le composant injecte les groupes Find, Options et Results et gère la recherche, le nettoyage, le comptage des correspondances, ainsi que la navigation vers la correspondance précédente/suivante. Une barre d'outils du Viewer détenue par l’hôte n’a besoin que de la basculer :
searchBar.isOpen() ? searchBar.close() : searchBar.open();Son API publique est intentionnellement petite :
| Méthode | Objectif |
|---|---|
attach(objViewer) | Connecte le ruban au viewer initialisé ; requis une fois |
open() / close() | Affiche ou masque le ruban ; la fermeture efface é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 Search, 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, Search et Annotation, voir Démarrage rapide.
Recherche depuis JavaScript
objViewer.Search(keyword, false, function (resultCount) {
console.log('Matches:', resultCount);
});Le deuxième argument indique une correspondance mot entier/exacte. Le nombre de correspondances arrive dans le rappel : Search lui‑même interroge le serveur et ne renvoie rien d’utile, ainsi var n = objViewer.Search(keyword, false) renvoie toujours undefined — et une page construite de cette façon indique « nothing found » tandis que le visualiseur met en évidence les correspondances. Après le rappel :
| Méthode | Résultat |
|---|---|
SearchMatchCount() | Total des correspondances individuelles dans le document. |
SearchSummary(false) | Entrées [pageNumber, matchCount] sans rafraîchissement. |
SearchSummary(true) | Même résumé et peint les surlignages de page/vignette. |
GotoSearchMatch(index) | Navigue vers un indice de correspondance basé sur zéro. |
DocImage.axd répond à search=<term> et exact=true|false avec 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
X-Doconut-Can-Search: 1Aprè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 vaut par défaut true.
Trois portes indépendantes ne doivent pas être confondues :
| Portail | Question |
|---|---|
CanSearch() / response header | Le visualiseur résolu possède-t-il un index/chemin de recherche natif ? |
AllowSearch | Cette configuration de format a-t-elle demandé l'extraction de texte où le commutateur existe ? |
LicenseCapability.Search | L'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
var token = await viewer.OpenDocumentAsync(path, new PdfConfig
{
AllowSearch = true,
AllowCopy = true // optionnel : permet à l'utilisateur de sélectionner 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 à leur PdfConfig imbriqué. Les deux sont false par défaut.
Des adaptateurs de recherche native 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 vers un PDF basé sur du texte :
// 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 visualiseur ; 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 tout de même produire zéro résultat natif.
Comportement normal de la recherche
Le serveur tente les sources de recherche dans cet ordre :
- Résultats natifs
ISearchableViewer. - Un index de recherche préconstruit
.srh. - Une erreur/résultat vide lorsqu'aucune source de recherche n'existe.
CanSearch() peut être vrai pour un visualiseur recherchable même lorsqu’un document particulier n’a aucune couche de texte et renvoie donc aucune correspondance.
Licence et comportement de l'interface
Une licence active Temporary/Demo autorise la recherche pendant sa période active. Une licence manquante et le fichier hérité TRIAL n’autorisent aucune capacité de recherche. Sans recherche :
ReferenceCssetReferenceScriptsomettent les paquets de recherche.DocImage.axdrefuse les requêtes de recherche au lieu de renvoyer des résultats.
Pilotez la visibilité de l’UI personnalisée via IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search) et utilisez CanSearch() pour le verdict format/session séparé.
Dépannage
| Symptôme | Vérification |
|---|---|
| La barre de recherche est manquante | Capacité de recherche et IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar |
CanSearch() est false | Visualiseur 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 aucune 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és | Chemin de rendu, résolution, transformations du document, et boîtes de mots extraites |
Cette page était-elle utile ?