検索

Viewer構成におけるネイティブテキスト検索

Doconut Viewerは、フォーマットビューアによって抽出されたテキストまたはテキストベースのPDFリダイレクトを使用した通常の検索を提供します。Search ライセンス機能が必要です。

検索 UI を有効にする

Search は Viewer モジュールであり、単体のツールバーではありません。完全なページには Viewer リソース、Viewer ツールバー、Viewer のマウント、そして初期化された objViewer が含まれている必要があります。その後、Search リボンがマウントされ、同じインスタンスに添付されます。

Search と annotation は組み込みのライセンス機能であり、AddPlugin<T>() パッケージではありません。インジェクトされた Viewer から検索リソースを要求します。ライセンスが 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
}))

埋め込まれたリボンは、カスタム UI と同じ JavaScript メソッドを呼び出します。

完全な Viewer 構成をマークアップ内に残し、最初に docViewer を初期化し、次にライセンス済みリボンを添付します。

html
<nav id="toolbar" aria-label="Document viewer controls">
    <!-- Viewer controls, including the button that opens 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>

コンポーネントは Find、Options、Results グループを注入し、検索、クリア、マッチ数、前後のマッチナビゲーションを処理します。ホスト所有の Viewer ツールバーは、以下のようにトグルするだけで済みます。

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

公開 API は意図的に小さく設計されています。

メソッド目的
attach(objViewer)初期化されたビューアにリボンを接続します。1回だけ必要です
open() / close()リボンを表示または非表示にします。close() はハイライトもクリアします
reset()現在の検索語、結果数、ハイライトをクリアします
isOpen()リボンが表示されているかどうかを返します
setStatus(message)設定されたコールバックを通じてステータスメッセージを転送します

オプションの onToggle(isOpen) コールバックでホストは Search ボタンと同期させることができ、onLayout でリボンの高さが変わったときにビューアをリサイズ/リフィットさせます。Viewer、Search、Annotation の起動シーケンスの詳細は、クイックスタート を参照してください。

JavaScript から検索する

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

第2引数は単語全体/完全一致を指定します。コールバック後に利用できるメソッドは次のとおりです。

メソッド結果
SearchMatchCount()ドキュメント内の個別マッチ総数
SearchSummary(false)再描画せずに [pageNumber, matchCount] エントリを取得
SearchSummary(true)同上に加えてページ/サムネイルハイライトを描画
GotoSearchMatch(index)0 ベースのインデックスで該当ページへ移動

ミドルウェアのルートは search=<term>exact=true|false を受け取り XML を返しますが、内部レスポンスを自前で解析するのではなく、ウィジェット API を使用してください。

検索機能の有無を確認する

初期化レスポンスは次のヘッダーを返します。

text
X-Doconut-Can-Search: 1

初期化後、objViewer.CanSearch() が同じフォーマット/セッションの判定を公開します。サーバーが 0 を返した場合は false を返し、レスポンスが無い、または古いサーバーでヘッダーが省略された場合はデフォルトで true になります。

混同してはいけない 3 つの独立したゲートは次のとおりです。

ゲート質問
CanSearch() / レスポンスヘッダー解決されたビューアにネイティブインデックス/検索パスがありますか?
AllowSearchこのフォーマット設定でテキスト抽出が有効になっていますか?
LicenseCapability.Searchアプリケーションは検索を実行し UI バンドルを受け取る権限がありますか?

フォーマットが技術的に検索可能でも、現在のライセンスが操作を拒否することがあります。

フォーマットごとに抽出を有効にする

csharp
var token = await viewer.OpenDocumentAsync(path, new PdfConfig
{
    AllowSearch = true,
    AllowCopy   = true   // optional: lets the user drag a region and copy its text
});

AllowSearchAllowCopyPdfConfigWordConfigExcelConfigPptConfig に存在し、Office プロパティはそれらのネストされた PdfConfig に委譲します。デフォルトは false です。

PDF、Word、Excel、PowerPoint、TXT、Visio、メール、EPUB、MHT には標準のネイティブ検索アダプタがあります。XPS はデフォルトで PDF パスを使用します。HTML と Microsoft Project はテキストベースの PDF リダイレクトの恩恵を受けます。

csharp
// DefaultRender = false → converted to a text-based PDF → searchable
var token = await viewer.OpenDocumentAsync(path, new HtmlConfig { DefaultRender = false });

ネイティブレンダラの場合、CanSearch() はビューアの機能を示しますが、特定のドキュメントに使用可能なテキストが含まれていることを保証するものではありません。ページがスキャン画像のみの PDF でも、ネイティブ結果は 0 になることがあります。

通常の検索動作

サーバーは次の順序で検索ソースを試みます。

  1. ネイティブ ISearchableViewer の結果。
  2. 事前構築された .srh 検索インデックス。
  3. 検索ソースが存在しない場合のエラー/空結果。

CanSearch()true でも、特定のスキャンドキュメントにテキスト層がなくマッチが返らないことがあります。

ライセンスと UI の挙動

アクティブな Temporary/Demo ライセンスは有効期間中に Search を許可します。ライセンスが無い、またはレガシー TRIAL ファイルがある場合は Search 機能が提供されません。Search が無い場合は次のようになります。

  • ReferenceCssReferenceScripts は検索バンドルを除外します。
  • ミドルウェアは検索を拒否し、ライセンス済み結果は返しません。

IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search) でカスタム UI の表示可否を制御し、CanSearch() でフォーマット/セッションごとの判定を取得してください。

トラブルシューティング

症状確認項目
検索バーが表示されない検索機能と IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar の設定
CanSearch() が falseフォーマットビューア、選択された DefaultRender パス、初期化レスポンスヘッダー
スキャン PDF で検索結果が 0ドキュメントにテキスト層がない。テキストを含むソースまたはテキストを保持する PDF 投影を使用
検索は機能するがハイライトがずれるレンダリングパス、解像度、ドキュメント変換、抽出された単語ボックス

このページは役に立ちましたか?