Wyszukiwanie

Natywne wyszukiwanie tekstu w kompozycji Viewer

Doconut Viewer zapewnia standardowe Wyszukiwanie przy użyciu tekstu wyodrębnionego przez przeglądarkę formatu lub przekierowania PDF opartego na tekście. Wymaga możliwości licencyjnej 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, montaż Viewer oraz zainicjowany objViewer; wstążka Wyszukiwania jest następnie montowana i podłączana do tej samej instancji.

Wyszukiwanie 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 zezwala na Wyszukiwanie.

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
}))

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

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: '/',
        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, liczbę dopasowań i nawigację do poprzedniego/następnego dopasowania. Pasek narzędzi Viewer zarządzany przez hosta potrzebuje jedynie przełączenia go:

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

Jego publiczne API jest celowo małe:

MetodaCel
attach(objViewer)Połącz wstążkę z zainicjowanym przeglądarką; wymagane jednorazowo
open() / close()Pokaż lub ukryj wstążkę; zamknięcie również czyści 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 synchronizować przycisk Wyszukiwania, a onLayout umożliwia mu zmianę rozmiaru/dopasowanie widoku, gdy wysokość wstążki się zmienia. 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);
});

Drugim argumentem jest dopasowanie całego słowa/dokładne. Po wywołaniu zwrotnym:

MetodaWynik
SearchMatchCount()Łączna liczba indywidualnych dopasowań w dokumencie.
SearchSummary(false)Wpisy [pageNumber, matchCount] bez ponownego rysowania.
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. Użyj API widgetu zamiast samodzielnie parsować tę wewnętrzną odpowiedź.

Sprawdź możliwości wyszukiwania

Odpowiedź inicjalizacji raportuje:

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 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 rozwiązany viewer posiada natywną ścieżkę indeksu/wyszukiwania?
AllowSearchCzy ta konfiguracja formatu żądała wyodrębnienia tekstu, gdzie przełącznik istnieje?
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 tej operacji.

Włącz wyodrębnianie per format

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

AllowSearch i AllowCopy istnieją na PdfConfig, WordConfig, ExcelConfig i PptConfig. Właściwości Office delegują do ich zagnieżdżonych PdfConfig. Oba domyślnie ustawione są na false.

Standardowe adaptery natywnego 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 PDF opartego na tekście:

csharp
// DefaultRender = false → przekształcony do PDF opartego na tekście → przeszukiwalny
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. Wyniki z natywnego przeglądarki formatu.
  2. Wstępnie zbudowany indeks wyszukiwania .srh.
  3. Błąd/pusty wynik, gdy nie istnieje żadne źródło wyszukiwania.

Indeks .srh jest artefaktem wyszukiwania publikowanym razem z obrazami stron, gdy dokumenty są serwowane z udostępnionego magazynu, więc węzeł, który nigdy nie otworzył dokumentu, może nadal odpowiadać na wyszukiwania — zobacz Rozproszone wdrożenia.

CanSearch() może być prawdziwe dla przeglądarki z możliwością wyszukiwania, nawet gdy konkretny zeskanowany dokument nie ma warstwy tekstowej i dlatego nie zwraca dopasowań.

Licencjonowanie i zachowanie UI

Aktywna licencja Temporary/Demo przyznaje Wyszukiwanie w trakcie swojego aktywnego okresu. Brak licencji i starszy plik TRIAL nie przyznają możliwości Wyszukiwania. Bez Wyszukiwania:

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

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

Rozwiązywanie problemów

ObjawSprawdź
Pasek wyszukiwania jest nieobecnyMożliwość wyszukiwania oraz IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar
CanSearch() jest fałszywePrzeglądarka formatu, wybrana ścieżka DefaultRender oraz nagłówek odpowiedzi inicjalizacji
Wyszukiwanie zwraca zero dla zeskanowanego PDFDokument nie ma 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 i wyodrębnione ramki słów

Czy ta strona była pomocna?