검색
Viewer 구성에서 네이티브 텍스트 검색
Doconut Viewer는 포맷 뷰어에서 추출된 텍스트 또는 텍스트 기반 PDF 리다이렉트를 사용하여 일반 검색을 제공합니다. 이는 Search 라이선스 기능이 필요합니다.
검색 UI 활성화
Search는 Viewer 모듈이며 독립형 툴바가 아닙니다. 전체 페이지에는 Viewer 리소스, Viewer 툴바, Viewer 마운트 및 초기화된 objViewer가 포함되어야 하며; 그 후 Search 리본이 마운트되어 동일한 인스턴스에 연결됩니다.
Search와 annotation은 내장된 라이선스 기능이며, AddPlugin<T>() 패키지가 아닙니다. Viewer에서 검색 리소스를 요청하십시오; 라이선스가 Search를 허용할 때만 해당 태그가 생성됩니다. MVC 5 뷰에는 @inject가 없으므로 컨트롤러에서 태그를 생성하고 ViewBag에 전달하며, 페이지에 필요한 라이선스 플래그와 함께 전달합니다:
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;뷰에서 @Html.Raw(ViewBag.ViewerCss)와 @Html.Raw(ViewBag.ViewerScripts)를 사용하여 이를 작성하십시오. Web Forms에서는 코드비하인드에서 동일한 값을 노출하고 <%= %>를 사용하여 작성합니다.
내장된 리본은 커스텀 UI에서 사용할 수 있는 동일한 JavaScript 메서드를 호출합니다.
마크업에 전체 Viewer 구성을 표시된 상태로 유지하고, 먼저 docViewer를 초기화한 다음 라이선스가 적용된 리본을 연결하십시오:
<nav id="toolbar" aria-label="Document viewer controls">
<!-- 검색을 여는 버튼을 포함한 뷰어 컨트롤 -->
</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>서버 측 if가 중요합니다: Search 기능이 없으면 ReferenceScripts가 리본 스크립트를 제외하므로, 보호되지 않은 doconutSearchBar(...) 호출은 예외를 발생시켜 Viewer 페이지 시작을 중단합니다. Web Forms에서는 동일한 보호 코드를 <% if (IsSearchEnabled) { %> … <% } %>로 작성하십시오.
이 컴포넌트는 Find, Options, Results 그룹을 주입하고 검색, 초기화, 매치 카운트 및 이전/다음 매치 탐색을 처리합니다. 호스트가 소유한 Viewer 툴바는 이를 토글하기만 하면 됩니다:
searchBar.isOpen() ? searchBar.close() : searchBar.open();공개 API는 의도적으로 간단합니다:
| 메서드 | 목적 |
|---|---|
attach(objViewer) | 초기화된 Viewer에 리본을 연결합니다; 한 번만 필요합니다 |
open() / close() | 리본을 표시하거나 숨깁니다; 닫을 때 하이라이트도 초기화됩니다 |
reset() | 현재 검색어, 결과 수 및 하이라이트를 초기화합니다 |
isOpen() | 리본이 표시되는지 여부를 반환합니다 |
setStatus(message) | 구성된 콜백을 통해 상태 메시지를 전달합니다 |
선택적 onToggle(isOpen) 콜백은 호스트가 Search 버튼을 동기화하도록 하고, onLayout는 리본 높이가 변경될 때 Viewer를 크기 조정/재배치하도록 합니다. 결합된 Viewer, Search 및 Annotation 시작 순서에 대해서는 빠른 시작.
JavaScript에서 검색
objViewer.Search(keyword, false, function (resultCount) {
console.log('Matches:', resultCount);
});두 번째 인자는 전체 단어/정확히 일치하는 매칭입니다. 매치 수는 콜백에서 전달됩니다: Search 자체가 서버로 전송되어 유용한 것을 반환하지 않으므로 var n = objViewer.Search(keyword, false)는 항상 undefined을 읽습니다 — 그리고 이렇게 만든 페이지는 "nothing found"를 보고하지만 뷰어는 매치를 강조 표시합니다. 콜백 이후:
| 방법 | 결과 |
|---|---|
SearchMatchCount() | 문서 내 개별 매치 총합. |
SearchSummary(false) | 재페인팅 없이 [pageNumber, matchCount] 항목. |
SearchSummary(true) | 동일 요약 및 페이지/썸네일 강조 표시를 그립니다. |
GotoSearchMatch(index) | 0 기반 매치 인덱스로 이동합니다. |
DocImage.axd는 XML로 search=<term>와 exact=true|false에 응답합니다. 내부 응답을 직접 파싱하기보다 위젯 API를 사용하십시오.
검색 기능 확인
초기화 응답이 보고합니다:
X-Doconut-Can-Search: 1초기화 후, objViewer.CanSearch()는 동일한 형식/세션 판정을 노출합니다. 서버가 0를 보낼 때 false를 반환합니다; 응답 이전이거나 헤더를 생략하는 오래된 서버의 경우 기본값은 true입니다.
세 개의 독립적인 게이트를 혼동해서는 안 됩니다:
| 게이트 | 질문 |
|---|---|
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()는 특정 문서에 텍스트 레이어가 없어 매치가 반환되지 않더라도 검색 가능한 뷰어에 대해 true일 수 있습니다.
라이선스 및 UI 동작
활성 임시/데모 라이선스는 활성 기간 동안 검색을 허용합니다. 라이선스가 없고 레거시 TRIAL 파일이 있으면 검색 기능이 제공되지 않습니다. 검색이 없을 경우:
ReferenceCss와ReferenceScripts는 검색 번들을 생략합니다.DocImage.axd는 결과를 반환하는 대신 검색 요청을 거부합니다.
IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search)에서 사용자 UI 가시성을 제어하고 별도 형식/세션 판정을 위해 CanSearch()를 사용하십시오.
문제 해결
| 증상 | 확인 |
|---|---|
| 검색 바가 없음 | 검색 기능 및 IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar |
CanSearch()는 false입니다 | 형식 뷰어, 선택된 DefaultRender 경로, 및 초기화 응답 헤더 |
| 스캔된 PDF에서 검색 결과가 0 | 문서에 텍스트 레이어가 없습니다; 텍스트가 포함된 소스를 사용하거나 텍스트를 보존하는 PDF 투영을 사용하십시오 |
| 검색은 작동하지만 강조 표시가 어긋남 | 렌더링 경로, 해상도, 문서 변환 및 추출된 단어 박스 |
이 페이지가 도움이 되었나요?