Vyhledávání

Nativní textové vyhledávání v sestavení Vieweru

Viewer Doconut poskytuje běžné vyhledávání pomocí textu extrahovaného formátovým prohlížečem nebo textovým přesměrováním PDF. Vyžaduje licenci Search.

Povolení uživatelského rozhraní vyhledávání

Vyhledávání je modul Vieweru, nikoli samostatná lišta nástrojů. Celá stránka musí zahrnovat zdroje Vieweru, lištu nástrojů Vieweru, připojení Vieweru a inicializovaný objViewer; Ribbon pro vyhledávání je poté namontován a připojen k téže instanci.

Vyhledávání a anotace jsou vestavěné licencované funkce, ne balíčky AddPlugin<T>(). Požádejte o vyhledávací zdroje z Viewer; jejich značky jsou generovány pouze tehdy, když licence povoluje vyhledávání. Pohledy MVC 5 nemají @inject, takže vytvořte značky v kontroleru a předejte je přes ViewBag spolu s licenčním příznakem, který stránka potřebuje:

csharp
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;

Zapište je do pohledu pomocí @Html.Raw(ViewBag.ViewerCss) a @Html.Raw(ViewBag.ViewerScripts). Ve Web Forms vystavte stejné hodnoty z kódu-behind a zapište je pomocí <%= %>.

Vložený ribbon volá stejné JavaScriptové metody, které jsou k dispozici pro vlastní UI.

Udržujte kompletní sestavení Vieweru viditelné v markupu, nejprve inicializujte docViewer a poté připojte licencovaný Ribbon:

html
<nav id="toolbar" aria-label="Document viewer controls">
    <!-- Ovládací prvky prohlížeče, včetně tlačítka, které otevírá vyhledávání -->
</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>

Serverová podmínka if je důležitá: bez schopnosti vyhledávání ReferenceScripts vynechá skript Ribbonu, takže nechráněné volání doconutSearchBar(...) by vyvolalo výjimku a zastavilo načítání stránky Vieweru. Ve Web Forms napište stejnou ochranu jako <% if (IsSearchEnabled) { %> … <% } %>.

Komponenta vkládá skupiny Find, Options a Results a zajišťuje vyhledávání, čištění, počítání shod a navigaci na předchozí/další shodu. Lišta Vieweru vlastněná hostitelem ji stačí přepínat:

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

Jeho veřejné API je úmyslně malé:

MetodaÚčel
attach(objViewer)Připojí Ribbon k inicializovanému prohlížeči; vyžadováno jednou
open() / close()Zobrazí nebo skryje Ribbon; zavření také vymaže zvýraznění
reset()Vymaže aktuální termín, počet výsledků a zvýraznění
isOpen()Vrátí, zda je Ribbon viditelný
setStatus(message)Přepošle stavovou zprávu prostřednictvím nakonfigurovaného zpětného volání

Volitelný zpětný volání onToggle(isOpen) umožňuje hostiteli synchronizovat jeho tlačítko vyhledávání a onLayout mu umožňuje změnit velikost/přizpůsobit prohlížeč, když se výška Ribbonu změní. Pro sekvenci spuštění kombinovaného Vieweru, vyhledávání a anotací viz Rychlý start.

Vyhledávání z JavaScriptu

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

Druhý argument určuje vyhledávání celých slov/přesnou shodu. Počet shod je předán v callbacku: Search sám odesílá požadavek na server a nevrací nic užitečného, takže var n = objViewer.Search(keyword, false) vždy vrací undefined — a stránka vytvořená tímto způsobem hlásí „nothing found“, zatímco prohlížeč zvýrazní shody. Po callbacku:

MetodaVýsledek
SearchMatchCount()Celkový počet jednotlivých shod v dokumentu.
SearchSummary(false)[pageNumber, matchCount] položky bez překreslení.
SearchSummary(true)Stejný souhrn a vykresluje zvýraznění stránky/miniaturního náhledu.
GotoSearchMatch(index)Naviguje na shodu s nulovým indexem.

DocImage.axd odpovídá na search=<term> a exact=true|false pomocí XML. Použijte widget API místo toho, abyste sami parsovali tuto interní odpověď.

Kontrola možnosti vyhledávání

Inicializační odpověď uvádí:

text
X-Doconut-Can-Search: 1

Po inicializaci objViewer.CanSearch() poskytuje stejný formát/sesní verdikt. Vrací false, když server pošle 0; před odpovědí nebo na starším serveru, který hlavičku vynechává, výchozí hodnota je true.

Tři nezávislé brány nesmí být zaměňovány:

BránaOtázka
CanSearch() / response headerMá vyřešený prohlížeč nativní index/výhledovou cestu?
AllowSearchPožadovalo toto formátové nastavení extrakci textu, kde existuje přepínač?
LicenseCapability.SearchJe aplikace oprávněna provádět vyhledávání a získat UI balíčky?

Formát může být technicky prohledávatelný, zatímco aktuální licence operaci zakazuje.

Povolení extrakce podle formátu

csharp
var token = await viewer.OpenDocumentAsync(path, new PdfConfig
{
    AllowSearch = true,
    AllowCopy   = true   // volitelné: umožňuje uživateli táhnout oblast a zkopírovat její text
});

AllowSearch a AllowCopy existují v PdfConfig, WordConfig, ExcelConfig a PptConfig. Vlastnosti Office delegují na jejich vnořený PdfConfig. Obě mají výchozí hodnotu false.

Normální nativní vyhledávací adaptéry existují pro PDF, Word, Excel, PowerPoint, TXT, Visio, e‑mail, EPUB a MHT. XPS ve výchozím nastavení používá svou PDF cestu. HTML a Microsoft Project těží z přesměrování na textové PDF:

csharp
// DefaultRender = false → převedeno na textové PDF → prohledávatelné
var token = await viewer.OpenDocumentAsync(path, new HtmlConfig { DefaultRender = false });

Pro nativní renderery CanSearch() popisuje schopnost prohlížeče; nezaručuje, že konkrétní dokument obsahuje použitelné textové údaje. PDF, jehož stránky jsou jen naskenované obrázky, může stále vracet nula nativních výsledků.

Normální chování vyhledávání

Server zkouší zdroje vyhledávání v tomto pořadí:

  1. Nativní výsledky ISearchableViewer.
  2. Předpřipravený vyhledávací index .srh.
  3. Chyba/prázdný výsledek, když neexistuje žádný zdroj vyhledávání.

CanSearch() může být true pro prohlížeč s vyhledáváním, i když konkrétní dokument nemá textovou vrstvu a proto nevrací žádné shody.

Licencování a chování UI

Aktivní dočasná/demo licence poskytuje vyhledávání během svého platného období. Chybějící licence a starý soubor TRIAL neumožňují vyhledávání. Bez vyhledávání:

  • ReferenceCss a ReferenceScripts vynechávají vyhledávací balíčky.
  • DocImage.axd odmítá požadavky na vyhledávání místo vrácení výsledků.

Řiďte viditelnost vlastního UI pomocí IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search) a použijte CanSearch() pro samostatný verdikt formátu/sesce.

Řešení problémů

ProblémKontrola
Vyhledávací lišta chybíSchopnost vyhledávání a IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar
CanSearch() je falseProhlížeč formátu, vybraná cesta DefaultRender a inicializační hlavička odpovědi
Vyhledávání vrací nulu pro naskenované PDFDokument nemá textovou vrstvu; použijte zdroj s textem nebo PDF projekci, která zachovává text
Vyhledávání funguje, ale zvýraznění je posunutoCesta renderování, rozlišení, transformace dokumentu a extrahované rámečky slov

Byla tato stránka užitečná?