Tìm kiếm

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

Doconut Viewer cung cấp tính năng Tìm kiếm 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 chuyển hướng PDF dựa trên văn bản. Nó yêu cầu khả năng giấy phép Search.

Kích hoạt giao diện người dùng tìm kiếm

Tìm kiếm là một mô-đun của 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à đối tượng objViewer đã được khởi tạo; sau đó Ribbon Tìm kiếm sẽ được gắn và đính kèm vào cùng một thể hiện.

Tìm kiếm và chú thích là các tính năng được cấp phép tích hợp, không phải 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 vào; các thẻ của chúng chỉ được phát ra khi giấy phép cho phép Tìm kiếm.

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 được nhúng gọi các phương thức JavaScript giống như UI tùy chỉnh.

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

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: '/',
        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 kết quả khớp, và điều hướng khớp trước/sau. Thanh công cụ Viewer do máy chủ sở hữu chỉ cần bật tắt nó:

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

API công khai của nó được thiết kế tối giản:

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

Callback tùy chọn onToggle(isOpen) cho phép máy chủ đồng bộ nút Tìm kiếm, và onLayout cho phép thay đổi kích thước/gắn lại viewer khi Ribbon thay đổi chiều cao. Đối với chuỗi khởi động kết hợp Viewer, Tìm kiếm và Chú thích, xem xem Bắt đầu nhanh.

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 khi gọi lại:

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

Đường dẫn middleware sử dụng search=<term> và exact=true|false và trả về XML. Hãy 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() cung cấp 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 khi nhận phản hồi, hoặc với máy chủ cũ không có header này, giá trị mặc định là true.

Ba cổng độc lập không nên bị nhầm lẫn:

CổngCâu hỏi
CanSearch() / header phản hồiViewer đã giải quyết có chỉ mục/tìm kiếm gốc 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 ủy 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 là có thể tìm kiếm trong khi giấy phép hiện tại lại từ chối thao tác này.

Kích hoạt trích xuất theo định dạng

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

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 bên trong. Cả hai mặc định là false.

Các bộ chuyển đổi tìm kiếm gốc tồn tại cho PDF, Word, Excel, PowerPoint, TXT, Visio, email, EPUB và MHT. XPS sử dụng đường dẫn PDF 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 → converted to a text-based PDF → searchable
var token = await viewer.OpenDocumentAsync(path, new HtmlConfig { DefaultRender = false });

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

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ự:

  1. Kết quả ISearchableViewer gốc.
  2. Chỉ mục .srh đã được xây dựng trước.
  3. Lỗi/kết quả rỗng khi không có nguồn tìm kiếm nào.

Chỉ mục .srh là tài sản tìm kiếm được công bố cùng với các ảnh trang khi tài liệu được phục vụ từ lưu trữ chung, vì vậy một node chưa bao giờ mở tài liệu vẫn có thể trả lời các truy vấn tìm kiếm — xem Triển khai phân tán.

CanSearch() có thể trả về true 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 đó không trả về khớp nào.

Giấy phép và hành vi UI

Giấy phép Temporary/Demo đang hoạt động cho phép Tìm kiếm trong thời gian hiệu lực. Một giấy phép thiếu hoặc tệp TRIAL cũ không cung cấp khả năng Tìm kiếm. Khi không có Tìm kiếm:

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

Điều khiển 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 tìm kiếm và IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar
CanSearch() trả về falseViewer định dạng, đường dẫn DefaultRender đã chọn, và header phản hồi khởi tạo
Tìm kiếm 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 bảo tồn văn bản
Tìm kiếm hoạt động nhưng các đánh dấu bị lệchĐường dẫn 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?