חיפוש

חיפוש טקסט מקורי בהרכבת Viewer

ה-Doconut Viewer מספק חיפוש רגיל באמצעות טקסט שהוצא מצופה הפורמט או הפנייה ל‑PDF מבוסס טקסט. הוא דורש את יכולת הרישיון Search.

הפעלת ממשק המשתמש של החיפוש

ה‑Search הוא מודול של Viewer, ולא סרגל כלים נפרד. על העמוד המלא לכלול את משאבי ה‑Viewer, סרגל הכלים של Viewer, הרכבה של Viewer, ואת objViewer שהאותחל; לאחר מכן ה‑Search Ribbon מותקן ומחובר לאותו מופע.

ה‑Search וה‑annotation הם תכונות מורשות מובנות, לא חבילות AddPlugin<T>(). יש לבקש את משאבי החיפוש מה‑Viewer המוזרק; התגים שלהם נשלחים רק כאשר הרישיון מעניק 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 המוטמע קורא לאותן שיטות JavaScript הזמינות לממשק מותאם אישית.

שמור על הרכבת Viewer המלאה גלויה במרקאפ, אתחל תחילה את 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 ל‑viewer שהאותחל; נדרש רק פעם אחת
open() / close()מציג או מסתיר את ה‑Ribbon; סגירה גם מנקה הדגשות
reset()מנקה את המונח הנוכחי, ספירת תוצאות והדגשות
isOpen()מדווח האם ה‑Ribbon גלוי
setStatus(message)מעביר הודעת מצב דרך ה‑callback המוגדר

ה‑callback האופציונלי onToggle(isOpen) מאפשר למארח לסנכרן את כפתור החיפוש שלו, ו‑onLayout מאפשר שינוי גודל/התאמת ה‑viewer כאשר ה‑Ribbon משנה גובה. עבור רצף האתחול המשולב של Viewer, Search ו‑Annotation, ראה את התחלה מהירה.

חיפוש מ‑JavaScript

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

הארגומנט השני הוא התאמה של מילה שלמה/מדויקת. אחרי הקריאה חזרה:

שיטהתוצאה
SearchMatchCount()סך כל ההתאמות הפרטיות במסמך.
SearchSummary(false)רשומות [pageNumber, matchCount] ללא רינדור מחדש.
SearchSummary(true)אותו סיכום ומצייר הדגשות בעמוד/תמונה ממוזערת.
GotoSearchMatch(index)נווט לאינדקס התאמה שמתחיל מאפס.

נתיב המידלוור משתמש ב‑search=<term> וב‑exact=true|false ומחזיר XML. השתמש ב‑API של ה‑widget במקום לנתח את התגובה הפנימית בעצמך.

בדיקת יכולת חיפוש

תשובת האתחול מדווחת:

text
X-Doconut-Can-Search: 1

לאחר האתחול, objViewer.CanSearch() חושף את אותו פסק דין של פורמט/סשן. הוא מחזיר false כאשר השרת שולח 0; לפני קבלת התשובה, או עם שרת ישן שמוותר על הכותרת, הוא מניח true.

שלושה שערים עצמאיים שלא יש לבלבל ביניהם:

שערשאלה
CanSearch() / כותרת תגובההאם ל‑viewer המיועד יש אינדקס/נתיב חיפוש מקורי?
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, דוא"ל, 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 });

למתאמים מקומיים, CanSearch() מתאר את יכולת ה‑viewer; הוא אינו מבטיח שמסמך מסוים מכיל טקסט שמיש. PDF שבו הדפים הם רק תמונות סרוקות עדיין יכול להחזיר אפס תוצאות מקומיות.

התנהגות חיפוש רגילה

השרת מנסה מקורות חיפוש בסדר הבא:

  1. תוצאות ISearchableViewer מקורי.
  2. אינדקס חיפוש .srh שנבנה מראש.
  3. שגיאה/תוצאה ריקה כאשר אין מקור חיפוש.

CanSearch() יכול להיות true עבור viewer שניתן לחיפוש גם כאשר מסמך סרוק ספציפי חסר שכבת טקסט ולכן אינו מחזיר התאמות.

רישוי והתנהגות ממשק משתמש

רישיון Temporary/Demo פעיל מעניק Search במהלך תקופתו הפעילה. קובץ רישיון חסר וקובץ TRIAL ישן אינם מעניקים יכולת Search. ללא Search:

  • ReferenceCss ו‑ReferenceScripts משאירים את חבילות החיפוש.
  • המידלוור דוחה חיפוש במקום להחזיר תוצאות מורשות.

הפעלת נראות UI מותאמת אישית דרך IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search) והשתמש ב‑CanSearch() עבור פסק הדין של הפורמט/הסשן בנפרד.

פתרון בעיות

סימפטוםבדיקה
סרגל החיפוש חסריכולת חיפוש ו‑IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar
CanSearch() מחזיר falseמציג הצופה, נתיב DefaultRender שנבחר, וכותרת תגובת האתחול
חיפוש מחזיר אפס עבור PDF סרוקהמסמך חסר שכבת טקסט; השתמש במקור עם טקסט או בפרוייקציית PDF ששומרת טקסט
חיפוש עובד אך ההדגשות מוזזותנתיב רינדור, רזולוציה, טרנספורמציות מסמך, ותיבות מילים מחולצות

האם דף זה היה מועיל?