Wyszukiwanie

Natywne wyszukiwanie tekstu w kompozycji Viewer

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

Włącz interfejs wyszukiwania

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

Wyszukiwanie i adnotacje są wbudowanymi funkcjami objętymi licencją, a nie pakietami AddPlugin<T>(). Żądaj zasobów wyszukiwania z wstrzykniętego Viewer; ich znaczniki są generowane tylko wtedy, gdy licencja zezwala na 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 własnego interfejsu UI.

Utrzymaj 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 przeglądarki, w tym przycisk otwierający wyszukiwanie -->
</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 należący do hosta potrzebuje jedynie przełączenia go:

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

Jego publiczne API jest celowo małe:

MetodaCel
attach(objViewer)Podłącz wstążkę do zainicjowanego przeglądarki; wymagane raz
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łoś, czy wstążka jest widoczna
setStatus(message)Przekaż komunikat statusu przez skonfigurowane wywołanie zwrotne

Opcjonalne wywołanie zwrotne onToggle(isOpen) pozwala hostowi zsynchronizować przycisk Search, a onLayout umożliwia zmianę rozmiaru/dopasowanie przeglądarki, gdy wstążka zmienia wysokość. Sekwencję uruchamiania połączonych komponentów Viewer, Search i Annotation można zobaczyć w Quick Start.

Wyszukiwanie z JavaScript

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

Drugi argument określa dopasowanie całych słów/ścisłe dopasowanie. Po wywołaniu zwrotnym:

MetodaWynik
SearchMatchCount()Łączna liczba pojedynczych dopasowań w dokumencie.
SearchSummary(false)Wpisy [pageNumber, matchCount] bez ponownego renderowania.
SearchSummary(true)Ta sama 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. Należy korzystać z API widgetu zamiast samodzielnie parsować tę wewnętrzną odpowiedź.

Sprawdź możliwość wyszukiwania

Odpowiedź inicjalizacji zawiera:

text
X-Doconut-Can-Search: 1

Po inicjalizacji objViewer.CanSearch() zwraca tę samą ocenę 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 przeglądarka ma natywną ścieżkę indeksu/wyszukiwania?
AllowSearchCzy ta konfiguracja 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 wykonania operacji.

Włącz wyodrębnianie per format

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

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

Standardowe adaptery natywnego wyszukiwania istnieją dla PDF, Word, Excel, PowerPoint, TXT, Visio, email, EPUB i MHT. XPS domyślnie korzysta ze ś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 → możliwe wyszukiwanie
var token = await viewer.OpenDocumentAsync(path, new HtmlConfig { DefaultRender = false });

Dla natywnych renderów CanSearch() opisuje możliwości przeglądarki; 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 przeglądarki obsługującej wyszukiwanie, nawet gdy konkretny zeskanowany dokument nie ma warstwy tekstowej i w związku z tym nie zwraca żadnych dopasowań.

Licencjonowanie i zachowanie UI

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

  • ReferenceCss i ReferenceScripts pomijają pakiety wyszukiwania.
  • Środkowe oprogramowanie odrzuca wyszukiwanie zamiast zwracać licencjonowane wyniki.

Widoczność własnego UI steruj za pomocą IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search) i używaj CanSearch() do oceny oddzielnego formatu/sesji.

Rozwiązywanie problemów

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

Czy ta strona była pomocna?