Αναζήτηση

Αυθεντική αναζήτηση κειμένου στη σύνθεση του Viewer

Ο Doconut Viewer παρέχει κανονική Αναζήτηση χρησιμοποιώντας κείμενο που εξάγεται από τον προβολέα μορφής ή μια ανακατεύθυνση PDF βασισμένη σε κείμενο. Απαιτεί τη δυνατότητα άδειας Search.

Ενεργοποίηση της διεπαφής χρήστη αναζήτησης

Η Αναζήτηση είναι ένα module του Viewer, όχι μια αυτόνομη γραμμή εργαλείων. Η πλήρης σελίδα πρέπει να περιλαμβάνει τους πόρους του Viewer, τη γραμμή εργαλείων του Viewer, το mount του Viewer και το αρχικοποιημένο objViewer; το Ribbon της Αναζήτησης στη συνέχεια τοποθετείται και συνδέεται με το ίδιο στιγμιότυπο.

Η Αναζήτηση και η σημείωση είναι ενσωματωμένα αδειοδοτημένα χαρακτηριστικά, όχι πακέτα AddPlugin<T>(). Ζητήστε τους πόρους αναζήτησης από το ενσωματωμένο Viewer; οι ετικέτες τους εκδίδονται μόνο όταν η άδεια χορηγεί την Αναζήτηση.

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 καλεί τις ίδιες μεθόδους JavaScript που είναι διαθέσιμες σε προσαρμοσμένη UI.

Διατηρήστε τη πλήρη σύνθεση του Viewer ορατή στο markup, αρχικοποιήστε πρώτα το docViewer και, στη συνέχεια, συνδέστε το αδειοδοτημένο Ribbon:

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: '/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 που ανήκει στον κεντρικό υπολογιστή χρειάζεται μόνο να την εναλλάσσει:

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

Το δημόσιο API του είναι σκόπιμα μικρό:

ΜέθοδοςΣκοπός
attach(objViewer)Συνδέει το Ribbon με τον αρχικοποιημένο προβολέα· απαιτείται μία φορά
open() / close()Εμφανίζει ή κρύβει το Ribbon· το κλείσιμο επίσης καθαρίζει τις επισημάνσεις
reset()Καθαρίζει τον τρέχοντα όρο, τον αριθμό αποτελεσμάτων και τις επισημάνσεις
isOpen()Αναφέρει αν το Ribbon είναι ορατό
setStatus(message)Προωθεί ένα μήνυμα κατάστασης μέσω της ρυθμισμένης κλήσης επιστροφής

Η προαιρετική κλήση onToggle(isOpen) επιτρέπει στον κεντρικό υπολογιστή να συγχρονίσει το κουμπί Αναζήτησης, και το onLayout του επιτρέπει να αλλάζει μέγεθος/προσαρμόζει το viewer όταν το Ribbon αλλάζει ύψος. Για τη συνδυασμένη ακολουθία εκκίνησης Viewer, Αναζήτησης και Σημείωσης, δείτε τη Γρήγορη Έναρξη.

Αναζήτηση από JavaScript

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

Το δεύτερο όρισμα είναι αντιστοίχιση ολόκληρης λέξης/ακριβούς αντιστοίχισης. Μετά την κλήση επιστροφής:

ΜέθοδοςΑποτέλεσμα
SearchMatchCount()Συνολικός αριθμός μεμονωμένων αντιστοιχίσεων στο έγγραφο.
SearchSummary(false)Καταχωρήσεις [pageNumber, matchCount] χωρίς επανασχεδίαση.
SearchSummary(true)Ίδια σύνοψη και ζωγραφίζει επισημάνσεις σελίδας/μικρογραφίας.
GotoSearchMatch(index)Μεταβαίνει σε δείκτη αντιστοίχισης με βάση το μηδέν.

Η διαδρομή του middleware χρησιμοποιεί search=<term> και exact=true|false και επιστρέφει XML. Χρησιμοποιήστε το API του widget αντί να αναλύετε εσείς την εσωτερική απόκριση.

Έλεγχος δυνατότητας αναζήτησης

Η απάντηση αρχικοποίησης αναφέρει:

text
X-Doconut-Can-Search: 1

Μετά την αρχικοποίηση, το objViewer.CanSearch() εκθέτει το ίδιο verdict μορφής/συνεδρίας. Επιστρέφει false όταν ο διακομιστής στέλνει 0; πριν από την απόκριση, ή με παλαιότερο διακομιστή που παραλείπει την κεφαλίδα, προεπιλογή είναι true.

Τρία ανεξάρτητα σημεία δεν πρέπει να συγχέονται:

ΠύληΕρώτηση
CanSearch() / response headerΈχει ο επιλυμένος προβολέας εγγενή ευρετήριο/διαδρομή αναζήτησης;
AllowSearchΖήτησε αυτή η διαμόρφωση μορφής εξαγωγή κειμένου όπου υπάρχει το διακόπτης;
LicenseCapability.SearchΕίναι η εφαρμογή εξουσιοδοτημένη να εκτελεί αναζήτηση και να λαμβάνει τα UI πακέτα;

Μια μορφή μπορεί τεχνικά να είναι αναζητήσιμη ενώ η τρέχουσα άδεια αρνείται τη λειτουργία.

Ενεργοποίηση εξαγωγής ανά μορφή

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 και AllowCopy υπάρχουν στα PdfConfig, WordConfig, ExcelConfig και PptConfig. Οι ιδιότητες Office παραπέμπουν στο ενσωματωμένο PdfConfig. Και τα δύο προεπιλογή είναι false.

Υπάρχουν κανονικοί προσαρμογείς εγγενούς αναζήτησης για PDF, Word, Excel, PowerPoint, TXT, Visio, email, EPUB και MHT. Το XPS χρησιμοποιεί την διαδρομή PDF του από προεπιλογή. Το HTML και το Microsoft Project ωφελούνται από μια ανακατεύθυνση PDF βασισμένη σε κείμενο:

csharp
// DefaultRender = false → converted to a text-based PDF → searchable
var token = await viewer.OpenDocumentAsync(path, new HtmlConfig { DefaultRender = false });

Για εγγενείς renderers, το CanSearch() περιγράφει τη δυνατότητα του viewer· δεν εγγυάται ότι ένα συγκεκριμένο έγγραφο περιέχει χρήσιμο κείμενο. Ένα PDF του οποίου οι σελίδες είναι μόνο σαρωμένες εικόνες μπορεί ακόμη να δώσει μηδενικά εγγενή αποτελέσματα.

Κανονική συμπεριφορά Αναζήτησης

Ο διακομιστής δοκιμάζει πηγές αναζήτησης με αυτή τη σειρά:

  1. Αποτελέσματα εγγενούς ISearchableViewer.
  2. Προκατασκευασμένο ευρετήριο αναζήτησης .srh.
  3. Σφάλμα/κενό αποτέλεσμα όταν δεν υπάρχει πηγή αναζήτησης.

Το CanSearch() μπορεί να είναι αληθές για έναν αναζητήσιμο viewer ακόμη και όταν ένα συγκεκριμένο έγγραφο δεν έχει στρώση κειμένου και έτσι δεν επιστρέφει αντιστοιχίες.

Αδειοδότηση και συμπεριφορά UI

Μια ενεργή άδεια Temporary/Demo χορηγεί Αναζήτηση κατά τη διάρκεια της ενεργής περιόδου. Μια ελλιπής άδεια και το παλιό αρχείο TRIAL δεν χορηγούν καμία δυνατότητα Αναζήτησης. Χωρίς Αναζήτηση:

  • ReferenceCss και ReferenceScripts παραλείπουν τα πακέτα αναζήτησης.
  • Το middleware αρνείται την αναζήτηση αντί να επιστρέφει αδειοδοτημένα αποτελέσματα.

Κατευθύνετε την ορατότητα προσαρμοσμένης UI από IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search) και χρησιμοποιήστε το CanSearch() για το ξεχωριστό verdict μορφής/συνεδρίας.

Αντιμετώπιση προβλημάτων

ΣυμπτωμαΈλεγχος
Η γραμμή αναζήτησης λείπειΔυνατότητα αναζήτησης και IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar
CanSearch() είναι ψευδέςΠροβολέας μορφής, επιλεγμένη διαδρομή DefaultRender και κεφαλίδα απόκρισης αρχικοποίησης
Η αναζήτηση επιστρέφει μηδέν για σκαναρισμένο PDFΤο έγγραφο δεν έχει στρώση κειμένου· χρησιμοποιήστε πηγή με κείμενο ή προβολή PDF που διατηρεί το κείμενο
Η αναζήτηση λειτουργεί αλλά οι επισημάνσεις είναι εκτός θέσηςΔιαδρομή απόδοσης, ανάλυση, μετασχηματισμοί εγγράφου και εξαγόμενα πλαίσια λέξεων

Ήταν αυτή η σελίδα χρήσιμη;