Wyszukiwanie

Wyszukiwanie tekstu natywnego w kompozycji Viewer

Doconut Viewer zapewnia standardowe wyszukiwanie przy użyciu tekstu wyodrębnionego przez przeglądarkę formatu lub przekierowanie do PDF opartego na tekście. Wymaga uprawnienia licencyjnego Search.

Włącz interfejs wyszukiwania

Search jest modułem Viewer, a nie samodzielnym paskiem narzędzi. Pełna strona musi zawierać zasoby Viewer, pasek narzędzi Viewer, montaż Viewer oraz zainicjowany objViewer; wstążka Search jest następnie montowana i podłączana do tej samej instancji.

Search i adnotacje są wbudowanymi funkcjami licencjonowanymi, a nie pakietami AddPlugin<T>(). Żądaj zasobów wyszukiwania z wstrzykniętego Viewer; ich tagi są emitowane tylko wtedy, gdy licencja przyznaje 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
}))

Wbudowana wstążka wywołuje te same metody JavaScript dostępne dla niestandardowego interfejsu.

Zachowaj pełną kompozycję Viewer widoczną w znacznikach, najpierw zainicjuj docViewer, a następnie podłącz licencjonowaną wstążkę:

html
<nav id="toolbar" aria-label="Document viewer controls">
    <!-- Kontrolki Viewer, w tym przycisk otwierający 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: 'doconut',
        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>

Komponent wstrzykuje grupy Find, Options i Results oraz obsługuje wyszukiwanie, czyszczenie, liczenie dopasowań i nawigację do poprzedniego/następnego dopasowania. Pasek narzędzi Viewer zarządzany przez hosta wymaga jedynie przełączania go:

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

Jego publiczne API jest celowo małe:

MetodaCel
attach(objViewer)Podłącz wstążkę do zainicjowanego viewer; wymagane jednorazowo
open() / close()Pokaż lub ukryj wstążkę; zamknięcie również usuwa podświetlenia
reset()Wyczyść bieżący termin, liczbę wyników i podświetlenia
isOpen()Zgłasza, czy wstążka jest widoczna
setStatus(message)Przekazuje komunikat statusu przez skonfigurowane wywołanie zwrotne

Opcjonalny callback onToggle(isOpen) pozwala hostowi synchronizować przycisk Search, a onLayout umożliwia zmianę rozmiaru/dopasowanie viewer, gdy wstążka zmienia wysokość. Aby zobaczyć sekwencję uruchamiania połączonych Viewer, Search i Annotation, zobacz Szybki start.

Wyszukiwanie z JavaScript

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

Drugi argument to dopasowanie całego słowa/dokładne. Po wywołaniu zwrotnym:

MetodaWynik
SearchMatchCount()Całkowita liczba pojedynczych dopasowań w dokumencie.
SearchSummary(false)[pageNumber, matchCount] wpisy bez ponownego renderowania.
SearchSummary(true)Ten sam podsumowanie i rysuje podświetlenia stron/miniatur.
GotoSearchMatch(index)Nawiguje do dopasowania o indeksie zerowym.

Ścieżka pośrednia używa search=<term> i exact=true|false i zwraca XML. Użyj API widgetu zamiast samodzielnie parsować tę wewnętrzną odpowiedź.

Sprawdź możliwości wyszukiwania

Odpowiedź inicjalizacji zgłasza:

text
X-Doconut-Can-Search: 1

Po inicjalizacji, objViewer.CanSearch() udostępnia tę samą decyzję formatu/sesji. Zwraca false, gdy serwer wysyła 0; przed otrzymaniem odpowiedzi lub przy starszym serwerze, który pomija nagłówek, domyślnie zwraca true.

Trzy niezależne bramki nie powinny być mylone:

BramkaPytanie
CanSearch() / response headerCzy rozpoznany viewer posiada natywną ścieżkę indeksu/wyszukiwania?
AllowSearchCzy konfiguracja tego formatu żądała wyodrębnienia tekstu, gdzie istnieje przełącznik?
LicenseCapability.SearchCzy aplikacja jest uprawniona do wykonywania wyszukiwania i otrzymywania pakietów UI?

Format może być technicznie przeszukiwalny, podczas gdy bieżąca licencja odmawia operacji.

Włącz wyodrębnianie per format

csharp
var token = await viewer.OpenDocumentAsync(path, new PdfConfig
{
    AllowSearch = true,
    AllowCopy   = true   // opcjonalne: pozwala użytkownikowi przeciągnąć obszar i skopiować jego tekst
});

AllowSearch i AllowCopy istnieją w PdfConfig, WordConfig, ExcelConfig i PptConfig. Właściwości Office delegują do ich zagnieżdżonego PdfConfig. Oba domyślnie mają wartość false.

Standardowe natywne adaptery wyszukiwania istnieją dla PDF, Word, Excel, PowerPoint, TXT, Visio, email, EPUB i MHT. XPS domyślnie używa swojej ścieżki PDF. HTML i Microsoft Project korzystają z przekierowania do PDF opartego na tekście:

csharp
// DefaultRender = false → konwertowane na PDF oparty na tekście → przeszukiwalne
var token = await viewer.OpenDocumentAsync(path, new HtmlConfig { DefaultRender = false });

Dla natywnych rendererów, CanSearch() opisuje możliwości viewer; nie gwarantuje, że konkretny dokument zawiera użyteczny tekst. PDF, którego strony są jedynie zeskanowanymi obrazami, może nadal zwracać zero natywnych wyników.

Normalne zachowanie wyszukiwania

Serwer próbuje źródeł wyszukiwania w następującej kolejności:

  1. Natywne wyniki ISearchableViewer.
  2. Wstępnie zbudowany indeks wyszukiwania .srh.
  3. Błąd/pusty wynik, gdy nie istnieje źródło wyszukiwania.

CanSearch() może być prawdziwe dla przeszukiwalnego viewer, nawet gdy konkretny dokument nie ma warstwy tekstowej i w konsekwencji nie zwraca dopasowań.

Licencjonowanie i zachowanie UI

Aktywna licencja Temporary/Demo przyznaje Search w trakcie swojego obowiązywania. Brak licencji oraz starszy plik TRIAL nie przyznają możliwości Search. Bez Search:

  • ReferenceCss i ReferenceScripts pomijają pakiety wyszukiwania.
  • Pośrednik odrzuca wyszukiwanie zamiast zwracać licencjonowane wyniki.

Steruj widocznością niestandardowego UI za pomocą IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search) i użyj CanSearch() dla oddzielnej decyzji formatu/sesji.

Rozwiązywanie problemów

ObjawSprawdź
Pasek wyszukiwania jest nieobecnyMożliwość Search oraz IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar
CanSearch() jest falseViewer formatu, wybrana ścieżka DefaultRender oraz nagłówek odpowiedzi inicjalizacji
Search zwraca zero dla zeskanowanego PDFDokument nie ma warstwy tekstowej; użyj źródła zawierającego tekst lub projekcji PDF zachowującej tekst
Search działa, ale podświetlenia są przesunięteŚcieżka renderowania, rozdzielczość, przekształcenia dokumentu i wyodrębnione ramki słów

Czy ta strona była pomocna?