Suche

Native Textsuche in der Viewer-Zusammensetzung

Der Doconut Viewer bietet die normale Suche, indem er Text verwendet, der vom Format‑Viewer extrahiert wird, oder über eine textbasierte PDF‑Umleitung. Sie erfordert die Lizenzfunktion Search.

Suchoberfläche aktivieren

Suche ist ein Viewer‑Modul, keine eigenständige Symbolleiste. Die komplette Seite muss die Viewer‑Ressourcen, die Viewer‑Symbolleiste, die Viewer‑Einbindung und das initialisierte objViewer enthalten; das Search‑Ribbon wird dann eingebunden und an dieselbe Instanz angehängt.

Suche und Annotation sind integrierte lizenzierte Funktionen, keine AddPlugin<T>()‑Pakete. Fordern Sie die Suchressourcen vom Viewer an; ihre Tags werden nur ausgegeben, wenn die Lizenz Suche gewährt. MVC 5‑Views haben kein @inject, daher bauen Sie die Tags im Controller und übergeben sie über ViewBag, zusammen mit dem Lizenz‑Flag, das die Seite benötigt:

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;

Schreiben Sie sie in die View mit @Html.Raw(ViewBag.ViewerCss) und @Html.Raw(ViewBag.ViewerScripts). In Web Forms geben Sie dieselben Werte aus dem Code‑Behind aus und schreiben sie mit <%= %>.

Das eingebettete Ribbon ruft dieselben JavaScript‑Methoden auf, die einer benutzerdefinierten UI zur Verfügung stehen.

Halten Sie die komplette Viewer‑Zusammensetzung im Markup sichtbar, initialisieren Sie zuerst docViewer und hängen Sie dann das lizenzierte Ribbon an:

html
<nav id="toolbar" aria-label="Document viewer controls">
    <!-- Viewer‑Steuerelemente, einschließlich der Schaltfläche, die die Suche öffnet -->
</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>

Die serverseitige if‑Anweisung ist wichtig: Ohne die Suchfunktion lässt ReferenceScripts das Ribbon‑Skript weg, sodass ein ungeschützter Aufruf von doconutSearchBar(...) einen Fehler auslöst und das Laden der Viewer‑Seite verhindert. In Web Forms schreiben Sie dieselbe Prüfung als <% if (IsSearchEnabled) { %> … <% } %>.

Die Komponente fügt die Gruppen Finden, Optionen und Ergebnisse ein und verwaltet die Suche, das Löschen, Trefferzahlen sowie die Navigation zu vorherigen/nächsten Treffern. Eine host‑eigene Viewer‑Symbolleiste muss sie nur umschalten:

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

Die öffentliche API ist bewusst klein gehalten:

MethodeZweck
attach(objViewer)Verbinde das Ribbon mit dem initialisierten Viewer; einmalig erforderlich
open() / close()Zeige oder verberge das Ribbon; beim Schließen werden auch Hervorhebungen entfernt
reset()Lösche den aktuellen Begriff, die Ergebnisanzahl und Hervorhebungen
isOpen()Gibt zurück, ob das Ribbon sichtbar ist
setStatus(message)Leite eine Statusnachricht über den konfigurierten Callback weiter

Der optionale Callback onToggle(isOpen) ermöglicht es dem Host, seine Suchschaltfläche zu synchronisieren, und onLayout lässt ihn den Viewer neu skalieren/anpassen, wenn das Ribbon die Höhe ändert. Für die kombinierte Startsequenz von Viewer, Suche und Annotation siehe Schnellstart.

Suche aus JavaScript

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

Das zweite Argument steht für die Vollwort-/exakte Übereinstimmung. Die Trefferanzahl wird im Callback übergeben: Search selbst ruft den Server auf und liefert nichts Nützliches, sodass var n = objViewer.Search(keyword, false) immer undefined zurückgibt — und eine auf diese Weise erstellte Seite meldet „nothing found“, während der Viewer die Treffer hervorhebt. Nach dem Callback:

MethodeErgebnis
SearchMatchCount()Gesamtzahl einzelner Treffer im Dokument.
SearchSummary(false)[pageNumber, matchCount]‑Einträge ohne Neuzeichnen.
SearchSummary(true)Gleiche Zusammenfassung und zeichnet Seiten-/Thumbnail‑Markierungen.
GotoSearchMatch(index)Navigiert zu einem nullbasierten Treffer‑Index.

DocImage.axd beantwortet search=<term> und exact=true|false mit XML. Verwenden Sie die Widget‑API, anstatt die interne Antwort selbst zu parsen.

Suchfähigkeit prüfen

Die Initialisierungsantwort meldet:

text
X-Doconut-Can-Search: 1

Nach der Initialisierung gibt objViewer.CanSearch() dasselbe Format‑/Session‑Ergebnis zurück. Es liefert false, wenn der Server 0 sendet; vor der Antwort oder bei einem älteren Server, der den Header weglässt, ist der Standardwert true.

Drei unabhängige Tore dürfen nicht verwechselt werden:

TorFrage
CanSearch() / Response‑HeaderHat der aufgelöste Viewer einen nativen Index‑/Suchpfad?
AllowSearchHat diese Format‑Konfiguration die Textextraktion angefordert, wo der Schalter existiert?
LicenseCapability.SearchIst die Anwendung autorisiert, die Suche auszuführen und die UI‑Pakete zu erhalten?

Ein Format kann technisch durchsuchbar sein, während die aktuelle Lizenz die Operation verweigert.

Extraktion pro Format aktivieren

csharp
var token = await viewer.OpenDocumentAsync(path, new PdfConfig
{
    AllowSearch = true,
    AllowCopy   = true   // optional: lässt den Benutzer einen Bereich ziehen und dessen Text kopieren
});

AllowSearch und AllowCopy existieren in PdfConfig, WordConfig, ExcelConfig und PptConfig. Die Office‑Eigenschaften delegieren an ihr verschachteltes PdfConfig. Beide haben standardmäßig den Wert false.

Normale native‑Suchadapter existieren für PDF, Word, Excel, PowerPoint, TXT, Visio, E‑Mail, EPUB und MHT. XPS verwendet standardmäßig seinen PDF‑Pfad. HTML und Microsoft Project profitieren von einer textbasierten PDF‑Umleitung:

csharp
// DefaultRender = false → konvertiert zu einem textbasierten PDF → durchsuchbar
var token = await viewer.OpenDocumentAsync(path, new HtmlConfig { DefaultRender = false });

Für native Renderer beschreibt CanSearch() die Fähigkeit des Viewers; es garantiert nicht, dass ein bestimmtes Dokument nutzbaren Text enthält. Ein PDF, dessen Seiten nur gescannte Bilder sind, kann dennoch null native Ergebnisse liefern.

Normales Suchverhalten

Der Server versucht Suchquellen in dieser Reihenfolge:

  1. Native ISearchableViewer‑Ergebnisse.
  2. Ein vorgefertigter .srh‑Suchindex.
  3. Ein Fehler-/Leerergebnis, wenn keine Suchquelle existiert.

CanSearch() kann für einen durchsuchbaren Viewer true sein, selbst wenn ein bestimmtes Dokument keine Textebene hat und daher keine Treffer zurückgibt.

Lizenzierung und UI-Verhalten

Eine aktive Temporary/Demo‑Lizenz gewährt Suche während ihres aktiven Zeitraums. Eine fehlende Lizenz und die alte TRIAL‑Datei gewähren keine Suchfunktion. Ohne Suche:

  • ReferenceCss und ReferenceScripts lassen die Such‑Bundles weg.
  • DocImage.axd verweigert Suchanfragen, anstatt Ergebnisse zurückzugeben.

Steuern Sie die Sichtbarkeit benutzerdefinierter UI‑Elemente über IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search) und verwenden Sie CanSearch() für das separate Format‑/Session‑Ergebnis.

Fehlerbehebung

SymptomPrüfung
Suchleiste fehltSuchfähigkeit und IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar
CanSearch() ist falseFormat‑Viewer, ausgewählter DefaultRender‑Pfad und Initialisierungs‑Response‑Header
Suche liefert null für ein gescanntes PDFDas Dokument hat keine Textebene; verwenden Sie eine texthaltige Quelle oder eine PDF‑Projektion, die Text bewahrt
Suche funktioniert, aber Markierungen sind versetztRender‑Pfad, Auflösung, Dokument‑Transformationen und extrahierte Wort‑Boxen

War diese Seite hilfreich?