Tìm kiếm

Tìm kiếm văn bản gốc trong thành phần Viewer

Trình Doconut Viewer cung cấp chức năng Search thông thường bằng cách sử dụng văn bản được trích xuất bởi trình xem định dạng hoặc một chuyển hướng PDF dựa trên văn bản. Nó yêu cầu khả năng cấp phép Search.

Bật giao diện người dùng tìm kiếm

Search là một mô-đun Viewer, không phải là một thanh công cụ độc lập. Trang đầy đủ phải bao gồm các tài nguyên Viewer, thanh công cụ Viewer, phần gắn Viewer, và objViewer đã được khởi tạo; Search Ribbon sau đó được gắn và đính kèm vào cùng một thể hiện.

Search và annotation là các tính năng có giấy phép tích hợp sẵn, không phải là các gói AddPlugin<T>(). Yêu cầu các tài nguyên tìm kiếm từ Viewer đã được tiêm; các thẻ của chúng chỉ được phát ra khi giấy phép cho phép 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
}))

Ribbon nhúng gọi các phương thức JavaScript giống như trong UI tùy chỉnh.

Giữ cho toàn bộ thành phần Viewer hiển thị trong markup, khởi tạo docViewer trước, và sau đó đính kèm Ribbon có giấy phép:

html
<nav id="toolbar" aria-label="Document viewer controls">
    <!-- Các điều khiển của Viewer, bao gồm nút mở 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: '/',
        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>

Thành phần này tiêm các nhóm Find, Options và Results và xử lý việc tìm kiếm, xóa, đếm số kết quả khớp, và điều hướng khớp trước/sau. Thanh công cụ Viewer thuộc host chỉ cần bật/tắt nó:

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

API công cộng của nó được thiết kế cố ý nhỏ gọn:

Phương thứcMục đích
attach(objViewer)Kết nối Ribbon tới viewer đã được khởi tạo; yêu cầu một lần
open() / close()Hiển thị hoặc ẩn Ribbon; đóng cũng sẽ xóa các điểm nhấn
reset()Xóa thuật ngữ hiện tại, số lượng kết quả và các điểm nhấn
isOpen()Báo cáo xem Ribbon có đang hiển thị hay không
setStatus(message)Chuyển tiếp một thông điệp trạng thái qua callback đã cấu hình

Callback tùy chọn onToggle(isOpen) cho phép host đồng bộ nút Search của mình, và onLayout cho phép nó thay đổi kích thước/điều chỉnh lại viewer khi Ribbon thay đổi chiều cao. Đối với chuỗi khởi động kết hợp của Viewer, Search và Annotation, xem Quick Start.

Tìm kiếm từ JavaScript

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

Tham số thứ hai là khớp toàn từ/chính xác. Sau callback:

Phương thứcKết quả
SearchMatchCount()Tổng số kết quả khớp riêng lẻ trong tài liệu.
SearchSummary(false)[pageNumber, matchCount] mục mà không cần vẽ lại.
SearchSummary(true)Tóm tắt tương tự và vẽ các điểm nhấn trên trang/ảnh thu nhỏ.
GotoSearchMatch(index)Điều hướng tới chỉ mục khớp bắt đầu từ 0.

Đường dẫn middleware sử dụng search=<term> và exact=true|false và trả về XML. Hãy sử dụng API widget thay vì tự phân tích phản hồi nội bộ đó.

Kiểm tra khả năng tìm kiếm

Phản hồi khởi tạo báo cáo:

text
X-Doconut-Can-Search: 1

Sau khi khởi tạo, objViewer.CanSearch() hiển thị cùng một quyết định định dạng/phiên. Nó trả về false khi máy chủ gửi 0; trước phản hồi, hoặc với máy chủ cũ hơn bỏ qua tiêu đề, nó mặc định là true.

Ba cổng độc lập không được nhầm lẫn:

CổngCâu hỏi
CanSearch() / response headerTrình xem đã giải quyết có đường dẫn chỉ mục/tìm kiếm bản địa không?
AllowSearchCấu hình định dạng này có yêu cầu trích xuất văn bản ở nơi công tắc tồn tại không?
LicenseCapability.SearchỨng dụng có được cấp quyền thực hiện tìm kiếm và nhận các gói UI không?

Một định dạng có thể về mặt kỹ thuật có thể tìm kiếm được trong khi giấy phép hiện tại từ chối thao tác này.

Bật trích xuất theo định dạng

csharp
var token = await viewer.OpenDocumentAsync(path, new PdfConfig
{
    AllowSearch = true,
    AllowCopy   = true   // tùy chọn: cho phép người dùng kéo một vùng và sao chép văn bản của nó
});

AllowSearch và AllowCopy tồn tại trên PdfConfig, WordConfig, ExcelConfig và PptConfig. Các thuộc tính Office ủy quyền cho PdfConfig lồng nhau của chúng. Cả hai mặc định là false.

Các bộ điều hợp tìm kiếm bản địa bình thường tồn tại cho PDF, Word, Excel, PowerPoint, TXT, Visio, email, EPUB và MHT. XPS sử dụng đường dẫn PDF của nó theo mặc định. HTML và Microsoft Project hưởng lợi từ chuyển hướng PDF dựa trên văn bản:

csharp
// DefaultRender = false → được chuyển thành PDF dạng văn bản → có thể tìm kiếm
var token = await viewer.OpenDocumentAsync(path, new HtmlConfig { DefaultRender = false });

Đối với các trình render bản địa, CanSearch() mô tả khả năng của viewer; nó không đảm bảo rằng một tài liệu cụ thể chứa văn bản có thể sử dụng. Một PDF mà các trang chỉ là hình ảnh quét vẫn có thể cho ra không có kết quả bản địa.

Hành vi Tìm kiếm bình thường

Máy chủ thử các nguồn tìm kiếm theo thứ tự sau:

  1. Kết quả từ trình xem bản địa của định dạng.
  2. Một chỉ mục tìm kiếm .srh đã được xây dựng sẵn.
  3. Một lỗi/kết quả trống khi không có nguồn tìm kiếm nào tồn tại.

Chỉ mục .srh là artefact tìm kiếm được xuất bản cùng với các hình ảnh trang khi tài liệu được phục vụ từ lưu trữ chia sẻ, vì vậy một nút chưa bao giờ mở tài liệu vẫn có thể trả lời các tìm kiếm — xem Distributed Deployments.

CanSearch() có thể đúng cho một viewer có khả năng tìm kiếm ngay cả khi một tài liệu quét cụ thể không có lớp văn bản và do đó trả về không có kết quả nào.

Cấp phép và hành vi UI

Giấy phép Temporary/Demo đang hoạt động cho phép Search trong thời gian hoạt động của nó. Một giấy phép thiếu và tệp legacy TRIAL không cung cấp khả năng Search. Khi không có Search:

  • ReferenceCss và ReferenceScripts bỏ qua các gói tìm kiếm.
  • Middleware từ chối tìm kiếm thay vì trả về kết quả có giấy phép.

Điều khiển khả năng hiển thị UI tùy chỉnh từ IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search) và sử dụng CanSearch() cho quyết định định dạng/phiên riêng biệt.

Khắc phục sự cố

Triệu chứngKiểm tra
Thanh tìm kiếm bị thiếuKhả năng Search và IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar
CanSearch() là falseTrình xem định dạng, đường dẫn DefaultRender đã chọn, và tiêu đề phản hồi khởi tạo
Search trả về 0 cho PDF đã quétTài liệu không có lớp văn bản; sử dụng nguồn có văn bản hoặc một phép chiếu PDF giữ lại văn bản
Search hoạt động nhưng các điểm nhấn bị lệchĐường render, độ phân giải, biến đổi tài liệu và các hộp từ đã trích xuất

Trang này có hữu ích không?