Sök

Inbyggd textsökning i Viewer-sammansättningen

Doconut Viewer erbjuder normal Search med text som extraheras av formatvisaren eller en textbaserad PDF-omdirigering. Den kräver licenskapaciteten Search.

Aktivera sök‑UI

Search är en Viewer-modul, inte ett fristående verktygsfält. Den kompletta sidan måste inkludera Viewer-resurserna, Viewer-verktygsfältet, Viewer-mounten och den initierade objViewer; Search‑Ribbon monteras sedan och fästs på samma instans.

Search och annotering är inbyggda licensierade funktioner, inte AddPlugin<T>()‑paket. Begär sökresurserna från den injicerade Viewer; deras taggar genereras endast när licensen beviljar 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
}))

Den inbäddade Ribbon anropar samma JavaScript‑metoder som är tillgängliga för ett anpassat UI.

Behåll den kompletta Viewer-sammansättningen synlig i markupen, initiera docViewer först och fäst sedan den licensierade Ribbon:

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>

Komponenten injicerar grupperna Find, Options och Results och hanterar sökning, rensning, matchningsantal och navigering till föregående/nästa matchning. Ett host‑ägda Viewer-verktygsfält behöver bara växla den:

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

Det offentliga API:et är avsiktligt litet:

MetodSyfte
attach(objViewer)Koppla Ribbon till den initierade viewern; krävs en gång
open() / close()Visa eller dölja Ribbon; stängning rensar även markeringar
reset()Rensa aktuell term, resultatantal och markeringar
isOpen()Rapportera om Ribbon är synlig
setStatus(message)Skicka ett statusmeddelande via den konfigurerade callbacken

Den valfria onToggle(isOpen)‑callbacken låter hosten synkronisera sin Search‑knapp, och onLayout låter den ändra storlek/justera viewern när Ribbon ändrar höjd. För den kombinerade Viewer-, Search- och Annotation‑startsekvensen, se Quick Start.

Sök från JavaScript

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

Det andra argumentet är helord/ exakt matchning. Efter callbacken:

MetodResultat
SearchMatchCount()Totalt antal individuella träffar i dokumentet.
SearchSummary(false)[pageNumber, matchCount]‑poster utan ommålning.
SearchSummary(true)Samma sammanfattning och målar upp sid‑ och miniatyrmarkeringar.
GotoSearchMatch(index)Navigerar till ett nollbaserat matchningsindex.

Mellanprogrammets rutt använder search=<term> och exact=true|false och returnerar XML. Använd widget‑API:t istället för att själv tolka det interna svaret.

Kontrollera sökkapacitet

Initieringssvaret rapporterar:

text
X-Doconut-Can-Search: 1

Efter initiering exponerar objViewer.CanSearch() samma format-/sessionsbedömning. Den returnerar false när servern skickar 0; före svaret, eller med en äldre server som utelämnar headern, är standardvärdet true.

Tre oberoende grindar får inte förväxlas:

GrindFråga
CanSearch() / response headerHar den upplösta viewern ett inbyggt index/sökväg?
AllowSearchBegärde detta formatkonfiguration textutdrag där växeln finns?
LicenseCapability.SearchÄr applikationen auktoriserad att utföra sökning och ta emot UI‑paketen?

Ett format kan tekniskt sett vara sökbart medan den aktuella licensen nekar operationen.

Aktivera extraktion per format

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 och AllowCopy finns på PdfConfig, WordConfig, ExcelConfig och PptConfig. Office‑egenskaperna delegaterar till deras inbäddade PdfConfig. Båda har standardvärdet false.

Normala inbyggda sök‑adaptrar finns för PDF, Word, Excel, PowerPoint, TXT, Visio, e‑post, EPUB och MHT. XPS använder sin PDF‑väg som standard. HTML och Microsoft Project drar nytta av en textbaserad PDF‑omdirigering:

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

För inbyggda renderare beskriver CanSearch() viewer‑kapaciteten; den garanterar inte att ett specifikt dokument innehåller användbar text. En PDF vars sidor endast är skannade bilder kan fortfarande ge noll inbyggda resultat.

Normalt sökbeteende

Servern försöker sökkällor i följande ordning:

  1. Inbyggda ISearchableViewer‑resultat.
  2. Ett förbyggt .srh‑sökindex.
  3. Ett fel/tomt resultat när ingen sökkälla finns.

.srh‑indexet är sökartefakten som publiceras tillsammans med sidbilderna när dokument levereras från delad lagring, så en nod som aldrig öppnat dokumentet fortfarande kan svara på sökningar — se Distributed Deployments.

CanSearch() kan vara true för en sökbar viewer även när ett specifikt skannat dokument saknar textlager och därför returnerar inga träffar.

Licensiering och UI‑beteende

En aktiv Tillfällig/Demo‑licens beviljar Search under sin aktiva period. En saknad licens och ett äldre TRIAL‑fil beviljar ingen Search‑kapacitet. Utan Search:

  • ReferenceCss och ReferenceScripts utelämnar sök‑paketen.
  • Mellanprogrammet nekar sökning istället för att returnera licensierade resultat.

Styr synlighet för anpassat UI via IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search) och använd CanSearch() för den separata format-/sessionsbedömningen.

Felsökning

SymptomKontroll
Sökfältet saknasSökfunktion och IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar
CanSearch() är falseFormatvisare, vald DefaultRender‑väg och initieringssvarets header
Sökning returnerar noll för en skannad PDFDokumentet saknar textlager; använd en textbärande källa eller en PDF-projektion som bevarar text
Sökning fungerar men markeringar är förskjutnaRenderingsväg, upplösning, dokumenttransformeringar och extraherade ordboxar

Var den här sidan hjälpsam?