Tìm kiếm

Tìm kiếm văn bản gốc trong cấu trúc 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 cấp 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à 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; sau đó Ribbon Tìm kiếm đượ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 sẵn, 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ác thẻ của chúng chỉ được phát ra khi giấy phép cho phép Tìm kiếm. Các view MVC 5 không có @inject, vì vậy hãy tạo các thẻ trong controller và truyền chúng qua ViewBag, cùng với cờ giấy phép mà trang cần:

csharp
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;

Viết chúng trong view bằng @Html.Raw(ViewBag.ViewerCss) và @Html.Raw(ViewBag.ViewerScripts). Trong Web Forms, hãy mở rộng các giá trị tương tự từ code-behind và viết chúng bằng <%= %>.

Ribbon được nhúng gọi các phương thức JavaScript giống như trong giao diện người dùng tùy chỉnh.

Giữ cấu trúc 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 ((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>

Câu lệnh if phía máy chủ rất quan trọng: nếu không có khả năng Tìm kiếm, ReferenceScripts sẽ không bao gồm script của Ribbon, vì vậy một lời gọi doconutSearchBar(...) không được bảo vệ sẽ gây lỗi và ngăn trang viewer khởi động. Trong Web Forms, viết cùng một bảo vệ như <% if (IsSearchEnabled) { %> … <% } %>.

Thành phần này chèn các nhóm Tìm kiếm, Tùy chọn và Kết quả và xử lý việc tìm kiếm, xóa, đếm số khớp, và điều hướng khớp trước/sau. Thanh công cụ Viewer thuộc sở hữu máy chủ 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ế cố ý đơn giản:

Phương thứcMục đích
attach(objViewer)Kết nối Ribbon với viewer đã được khởi tạo; cần thực hiện một lần
open() / close()Hiển thị hoặc ẩn Ribbon; khi đóng cũng sẽ xóa các phần nổi bật
reset()Xóa thuật ngữ hiện tại, số lượng kết quả và các phần nổi bật
isOpen()Báo cáo xem 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 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 Viewer, Tìm kiếm và Chú thích, 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à chế độ khớp toàn từ/chính xác. Số lượng kết quả khớp được trả về trong callback: Search tự nó gửi yêu cầu tới máy chủ và không trả về gì có ích, vì vậy var n = objViewer.Search(keyword, false) luôn nhận giá trị undefined — và một trang được xây dựng theo cách này sẽ báo “nothing found” trong khi viewer vẫn làm nổi bật các kết quả khớp. 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)Các mục [pageNumber, matchCount] mà không cần vẽ lại.
SearchSummary(true)Cùng bản tóm tắt và vẽ nổi bật trên trang/ảnh thu nhỏ.
GotoSearchMatch(index)Di chuyển tới chỉ mục kết quả khớp bắt đầu từ 0.

DocImage.axd trả lời các yêu cầu search=<term> và exact=true|false bằng XML. Hãy sử dụng API widget thay vì tự mình 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ũ hơn không có header này, giá trị mặc định là true.

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

CổngCâu hỏi
CanSearch() / response headerTrình xem đã được xác định có đường dẫn 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 này tồn tại không?
LicenseCapability.SearchỨng dụng có được cấp phép 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 hỗ trợ tìm kiếm trong khi giấy phép hiện tại lạ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   // 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 đều có giá trị mặc định là false.

Các bộ điều hợp tìm kiếm gốc thông 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ừ việc chuyển hướng sang 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 trình render gốc, CanSearch() mô tả khả năng của trình xem; 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 số kết quả gốc bằng 0.

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

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

  1. Kết quả gốc từ ISearchableViewer.
  2. Chỉ mục tìm kiếm .srh đã được tạo sẵn.
  3. Lỗi/kết quả rỗng khi không có nguồn tìm kiếm nào.

CanSearch() có thể trả về true cho một trình xem hỗ trợ tìm kiếm ngay cả khi một tài liệu cụ thể không có lớp văn bản và do đó không trả về 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 hiệu lực. Khi thiếu giấy phép và tệp TRIAL cũ không cung cấp khả năng Search. Khi không có Search:

  • ReferenceCss và ReferenceScripts không bao gồm các gói tìm kiếm.
  • DocImage.axd từ chối các yêu cầu tìm kiếm thay vì trả về kết quả.

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

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ề falseTrình xem đị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; hãy 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
Tìm kiếm hoạt động nhưng các vùng nổi bật 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?