검색
Viewer 구성에서 네이티브 텍스트 검색
Doconut Viewer는 포맷 뷰어가 추출한 텍스트 또는 텍스트 기반 PDF 리다이렉트를 사용하여 일반 검색을 제공합니다. Search 라이선스 기능이 필요합니다.
검색 UI 활성화
Search는 Viewer 모듈이며, 독립형 툴바가 아닙니다. 전체 페이지에는 Viewer 리소스, Viewer 툴바, Viewer 마운트, 그리고 초기화된 objViewer가 포함되어야 하며, 그 뒤에 Search Ribbon이 마운트되어 동일한 인스턴스에 연결됩니다.
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
}))내장된 Ribbon은 사용자 정의 UI와 동일한 JavaScript 메서드를 호출합니다.
전체 Viewer 구성을 마크업에 보이게 유지하고, 먼저 docViewer를 초기화한 뒤, 라이선스가 적용된 Ribbon을 연결합니다:
<nav id="toolbar" aria-label="Document viewer controls">
<!-- Viewer 컨트롤, 검색을 여는 버튼 포함 -->
</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는 의도적으로 작습니다:
| 메서드 | 목적 |
|---|---|
attach(objViewer) | 초기화된 뷰어에 Ribbon을 연결합니다; 한 번만 필요합니다 |
open() / close() | Ribbon을 표시하거나 숨깁니다; 닫을 때 하이라이트도 초기화됩니다 |
reset() | 현재 검색어, 결과 수, 하이라이트를 모두 초기화합니다 |
isOpen() | Ribbon이 현재 보이는지 여부를 반환합니다 |
setStatus(message) | 구성된 콜백을 통해 상태 메시지를 전달합니다 |
선택적인 onToggle(isOpen) 콜백을 사용하면 호스트가 Search 버튼과 동기화할 수 있으며, onLayout을 통해 Ribbon 높이가 변할 때 뷰어를 재조정하거나 리사이즈할 수 있습니다. 결합된 Viewer, Search, Annotation 시작 순서는 Quick Start를 참고하세요.
JavaScript에서 Search 호출
objViewer.Search(keyword, false, function (resultCount) {
console.log('Matches:', resultCount);
});두 번째 인자는 전체 단어/정확히 일치하는지를 지정합니다. 콜백 이후:
| 메서드 | 결과 |
|---|---|
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입니다.
혼동해서는 안 되는 세 가지 독립적인 게이트:
| 게이트 | 질문 |
|---|---|
CanSearch() / 응답 헤더 | 현재 뷰어가 네이티브 인덱스/검색 경로를 가지고 있나요? |
AllowSearch | 해당 포맷 설정이 텍스트 추출 스위치를 포함하고 있나요? |
LicenseCapability.Search | 애플리케이션이 검색을 실행하고 UI 번들을 받을 권한이 있나요? |
포맷이 기술적으로 검색 가능하더라도 현재 라이선스가 해당 작업을 금지할 수 있습니다.
포맷별 추출 활성화
var token = await viewer.OpenDocumentAsync(path, new PdfConfig
{
AllowSearch = true,
AllowCopy = true // optional: 사용자가 영역을 드래그하여 텍스트를 복사할 수 있게 함
});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 동작
활성화된 Temporary/Demo 라이선스는 기간 동안 Search 기능을 제공합니다. 라이선스가 없거나 레거시 TRIAL 파일이 있으면 Search 기능이 전혀 제공되지 않습니다. Search가 없을 경우:
ReferenceCss와ReferenceScripts는 검색 번들을 제외합니다.- 미들웨어는 라이선스된 결과 대신 검색을 거부합니다.
IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search)를 사용해 커스텀 UI 가시성을 제어하고, 별도의 포맷/세션 판단을 위해 CanSearch()를 활용하세요.
문제 해결
| 증상 | 점검 |
|---|---|
| 검색 바가 보이지 않음 | Search 기능 및 IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar 설정 |
CanSearch()가 false | 포맷 뷰어, 선택된 DefaultRender 경로, 초기화 응답 헤더 |
| 스캔된 PDF에서 검색 결과가 0 | 문서에 텍스트 레이어가 없음; 텍스트가 포함된 소스나 텍스트를 보존하는 PDF 변환 사용 |
| 검색은 동작하지만 하이라이트가 어긋남 | 렌더링 경로, 해상도, 문서 변환, 추출된 단어 박스 확인 |
이 페이지가 도움이 되었나요?