Wyszukiwanie
Natywne wyszukiwanie tekstu w kompozycji Viewer
Viewer Doconut 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; wówczas wstążka wyszukiwania jest 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 Viewer; ich tagi są generowane tylko wtedy, gdy licencja zezwala na wyszukiwanie. Widoki MVC 5 nie mają @inject, więc zbuduj tagi w kontrolerze i przekaż je za pomocą ViewBag, wraz z flagą licencji, której potrzebuje strona:
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;Zapisz je w widoku przy użyciu @Html.Raw(ViewBag.ViewerCss) i @Html.Raw(ViewBag.ViewerScripts). W Web Forms udostępnij te same wartości z kodu zaplecza i zapisz je przy użyciu <%= %>.
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ę:
<nav id="toolbar" aria-label="Document viewer controls">
<!-- Kontrolki przeglądarki, 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: '/',
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>Po stronie serwera if ma znaczenie: bez możliwości wyszukiwania, ReferenceScripts pomija skrypt wstążki, więc niechronione wywołanie doconutSearchBar(...) spowodowałoby błąd i zatrzymałoby uruchamianie strony viewer. W Web Forms zapisz tę samą ochronę jako <% if (IsSearchEnabled) { %> … <% } %>.
Komponent wstrzykuje grupy Znajdź, Opcje i Wyniki 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:
searchBar.isOpen() ? searchBar.close() : searchBar.open();Jego publiczne API jest celowo małe:
| Metoda | Cel |
|---|---|
attach(objViewer) | Połącz wstążkę z zainicjowanym viewer; 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 zmienić rozmiar/dopasować viewer, gdy wstążka zmienia wysokość. Aby zobaczyć sekwencję uruchamiania połączonych Viewer, Search i Annotation, zobacz Szybki start.
Wyszukiwanie z JavaScript
objViewer.Search(keyword, false, function (resultCount) {
console.log('Matches:', resultCount);
});Drugi argument oznacza dopasowanie całego słowa/ścisłe dopasowanie. Liczba dopasowań przychodzi w wywołaniu zwrotnym: Search samodzielnie wysyła żądanie do serwera i nie zwraca nic użytecznego, więc var n = objViewer.Search(keyword, false) zawsze odczytuje undefined — a strona zbudowana w ten sposób zgłasza „nic nie znaleziono”, podczas gdy przeglądarka podświetla dopasowania. Po wywołaniu zwrotnym:
| Metoda | Wynik |
|---|---|
SearchMatchCount() | Łączna liczba pojedynczych dopasowań w dokumencie. |
SearchSummary(false) | [pageNumber, matchCount] pozycje bez ponownego rysowania. |
SearchSummary(true) | To samo podsumowanie i rysuje podświetlenia stron/miniatur. |
GotoSearchMatch(index) | Przechodzi do indeksu dopasowania liczonego od zera. |
DocImage.axd odpowiada search=<term> i exact=true|false w formacie XML. Użyj API widgetu zamiast samodzielnie parsować tę wewnętrzną odpowiedź.
Sprawdź możliwość wyszukiwania
Odpowiedź inicjalizacji zgłasza:
X-Doconut-Can-Search: 1Po 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:
| Bramka | Pytanie |
|---|---|
CanSearch() / response header | Czy rozwiązany podgląd posiada natywną ścieżkę indeksu/wyszukiwania? |
AllowSearch | Czy ta konfiguracja formatu żądała wyodrębnienia tekstu, gdzie przełącznik istnieje? |
LicenseCapability.Search | Czy 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
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ą 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, e‑mail, EPUB i MHT. XPS domyślnie używa swojej ścieżki PDF. HTML i Microsoft Project korzystają z przekierowania PDF opartego na tekście:
// DefaultRender = false → przekształcony na PDF oparty na tekście → przeszukiwalny
var token = await viewer.OpenDocumentAsync(path, new HtmlConfig { DefaultRender = false });Dla natywnych renderów, CanSearch() opisuje możliwości podglądu; nie gwarantuje to, że konkretny dokument zawiera użyteczny tekst. PDF, którego strony są jedynie zeskanowanymi obrazami, może nadal zwracać zero natywnych wyników.
Standardowe zachowanie wyszukiwania
Serwer próbuje źródeł wyszukiwania w następującej kolejności:
- Natywne wyniki
ISearchableViewer. - Wstępnie zbudowany indeks wyszukiwania
.srh. - Błąd/pusty wynik, gdy nie istnieje żadne źródło wyszukiwania.
CanSearch() może być prawdziwe dla przeglądarki z możliwością wyszukiwania, nawet gdy konkretny dokument nie ma warstwy tekstowej i dlatego nie zwraca dopasowań.
Licencjonowanie i zachowanie UI
Aktywna licencja tymczasowa/demo przyznaje możliwość wyszukiwania w trakcie jej obowiązywania. Brak licencji oraz starszy plik TRIAL nie przyznają możliwości wyszukiwania. Bez wyszukiwania:
ReferenceCssiReferenceScriptspomijają pakiety wyszukiwania.DocImage.axdodrzuca żądania wyszukiwania zamiast zwracać wyniki.
Steruj widocznością własnego UI z IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search) i użyj CanSearch() dla oddzielnej decyzji formatu/sesji.
Rozwiązywanie problemów
| Objaw | Sprawdzenie |
|---|---|
| Pasek wyszukiwania jest nieobecny | Możliwość wyszukiwania oraz IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar |
CanSearch() jest fałszywe | Podgląd formatu, wybrana ścieżka DefaultRender oraz nagłówek odpowiedzi inicjalizacji |
| Wyszukiwanie zwraca zero dla zeskanowanego PDF | Dokument 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 oraz wyodrębnione ramki słów |
Czy ta strona była pomocna?