検索
Viewer構成におけるネイティブテキスト検索
Doconut Viewer は、フォーマットビューアが抽出したテキストまたはテキストベースの PDF リダイレクトを使用した通常の検索機能を提供します。Search ライセンス機能が必要です。
検索 UI を有効にする
Search は Viewer のモジュールであり、スタンドアロンのツールバーではありません。完全なページには Viewer リソース、Viewer ツールバー、Viewer のマウント、そして初期化された objViewer が含まれている必要があります。その後、Search リボンが同じインスタンスにマウントされて添付されます。
Search と annotation は組み込みのライセンス機能であり、AddPlugin<T>() パッケージではありません。検索リソースは注入された Viewer から取得し、ライセンスが Search を許可している場合にのみタグが出力されます。
@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 を初期化し、次にライセンス済みリボンを添付します。
<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 ツールバーは以下のようにトグルするだけで済みます。
searchBar.isOpen() ? searchBar.close() : searchBar.open();公開 API は意図的に小さく設計されています。
| Method | Purpose |
|---|---|
attach(objViewer) | 初期化されたビューアにリボンを接続します。1 回だけ必要です |
open() / close() | リボンを表示または非表示にします。閉じるとハイライトもクリアされます |
reset() | 現在の検索語、結果数、ハイライトをクリアします |
isOpen() | リボンが表示中かどうかを返します |
setStatus(message) | 設定されたコールバックを通じてステータスメッセージを転送します |
オプションの onToggle(isOpen) コールバックにより、ホストは Search ボタンと同期させることができ、onLayout によりリボンの高さが変わったときにビューアをリサイズ/リフィットさせることができます。Viewer、Search、Annotation の起動シーケンスの詳細は、クイックスタートをご参照ください。
JavaScript から検索
objViewer.Search(keyword, false, function (resultCount) {
console.log('Matches:', resultCount);
});第 2 引数は単語全体/完全一致を指定します。コールバック後の戻り値は次の通りです。
| Method | Result |
|---|---|
SearchMatchCount() | ドキュメント内の個別マッチ総数 |
SearchSummary(false) | 再描画せずに [pageNumber, matchCount] エントリを返す |
SearchSummary(true) | 同上に加えてページ/サムネイルハイライトを描画 |
GotoSearchMatch(index) | 0 ベースのインデックスで該当ページへ移動 |
ミドルウェアのルートは search=<term> と exact=true|false を使用し、XML を返します。内部レスポンスを自前で解析するのではなく、ウィジェット API を利用してください。
検索機能の確認
初期化レスポンスは次のヘッダーを報告します。
X-Doconut-Can-Search: 1初期化後、objViewer.CanSearch() が同じフォーマット/セッションの判定を公開します。サーバーが 0 を送信した場合は false を返し、ヘッダーが無い古いサーバーの場合はデフォルトで true となります。
混同してはいけない 3 つの独立したゲートがあります。
| Gate | Question |
|---|---|
CanSearch() / response header | 解決されたビューアにネイティブインデックス/検索パスがありますか? |
AllowSearch | このフォーマット設定がテキスト抽出を要求していますか(スイッチが存在しますか)? |
LicenseCapability.Search | アプリケーションは検索を実行し UI バンドルを受け取る権限がありますか? |
フォーマットは技術的に検索可能でも、現在のライセンスが操作を禁止している場合があります。
フォーマットごとの抽出を有効化
var token = await viewer.OpenDocumentAsync(path, new PdfConfig
{
AllowSearch = true,
AllowCopy = true // オプション: ユーザーが領域をドラッグしてテキストをコピーできるようにする
});AllowSearch と AllowCopy は PdfConfig、WordConfig、ExcelConfig、PptConfig に存在します。Office のプロパティはそれらのネストされた PdfConfig に委譲されます。両方ともデフォルトは false です。
PDF、Word、Excel、PowerPoint、TXT、Visio、メール、EPUB、MHT には通常のネイティブ検索アダプタが用意されています。XPS はデフォルトで PDF パスを使用します。HTML と Microsoft Project はテキストベースの PDF リダイレクトの恩恵を受けます。
// DefaultRender = false → テキストベースの PDF に変換 → 検索可能
var token = await viewer.OpenDocumentAsync(path, new HtmlConfig { DefaultRender = false });ネイティブレンダラの場合、CanSearch() はビューアの機能を示すだけで、特定のドキュメントに使用可能なテキストが含まれていることを保証するものではありません。ページがスキャン画像のみの PDF でも、ネイティブ結果は 0 になることがあります。
通常の検索動作
サーバーは次の順序で検索ソースを試みます。
- ネイティブ
ISearchableViewer結果 - 事前構築された
.srh検索インデックス - 検索ソースが存在しない場合のエラー/空結果
CanSearch() は、特定のドキュメントにテキスト層がなくマッチが返らない場合でも、検索可能なビューアであることを示すことがあります。
ライセンスと UI の挙動
アクティブな Temporary/Demo ライセンスは有効期間中に Search を許可します。ライセンスが無い、またはレガシー TRIAL ファイルがある場合は Search 機能が付与されません。Search が無い場合:
ReferenceCssとReferenceScriptsは検索バンドルを除外します- ミドルウェアは検索を拒否し、ライセンス済み結果を返しません
IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search) でカスタム UI の表示可否を制御し、CanSearch() でフォーマット/セッションごとの判定を取得してください。
トラブルシューティング
| Symptom | Check |
|---|---|
| Search bar が表示されない | Search 機能と IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar が有効か |
CanSearch() が false | フォーマットビューア、選択された DefaultRender パス、初期化レスポンスヘッダー |
| スキャン PDF で検索結果が 0 | ドキュメントにテキスト層が無い。テキストを含むソースまたはテキスト保持の PDF 投影を使用 |
| 検索は機能するがハイライトがずれる | レンダリングパス、解像度、ドキュメント変換、抽出された単語ボックス |
このページは役に立ちましたか?