חיפוש
חיפוש טקסט מקורי במרכיב הצופה
ה‑Doconut Viewer מספק חיפוש רגיל באמצעות טקסט שמופק מצופה הפורמט או הפנייה מחדש של PDF מבוסס‑טקסט. הוא דורש את יכולת הרישיון Search.
הפעלת ממשק החיפוש
חיפוש הוא מודול של Viewer, ולא סרגל נפרד. על הדף המלא לכלול את משאבי ה‑Viewer, סרגל הכלים של ה‑Viewer, הרכבת ה‑Viewer, וה‑objViewer שהאותחל; לאחר מכן ה‑Search Ribbon מורכב ומחובר לאותו מופע.
חיפוש והסבריות הם תכונות מורשות מובנות, ולא חבילות AddPlugin<T>(). יש לבקש את משאבי החיפוש מה‑Viewer המוזרק; התגים שלהם נשלחים רק כאשר הרישיון מעניק חיפוש.
@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 המורשה:
<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 בבעלות המארח צריך רק להחליף את המצב:
searchBar.isOpen() ? searchBar.close() : searchBar.open();ה‑API הציבורי שלו מכוון להיות קטן:
| Method | Purpose |
|---|---|
attach(objViewer) | מחבר את ה‑Ribbon לצופה שהאותחל; נדרש פעם אחת |
open() / close() | מציג או מסתיר את ה‑Ribbon; סגירה גם מנקה הדגשות |
reset() | מנקה את המונח הנוכחי, ספירת תוצאות והדגשות |
isOpen() | מדווח האם ה‑Ribbon גלוי |
setStatus(message) | מעביר הודעת מצב דרך ה‑callback המוגדר |
ה‑callback האופציונלי onToggle(isOpen) מאפשר למארח לסנכרן את כפתור החיפוש שלו, ו‑onLayout מאפשר לו לשנות גודל/להתאים את הצופה כאשר גובה ה‑Ribbon משתנה. עבור רצף האתחול המשולב של Viewer, Search ו‑Annotation, ראו את
התחלה מהירה.
חיפוש מ‑JavaScript
objViewer.Search(keyword, false, function (resultCount) {
console.log('Matches:', resultCount);
});הפרמטר השני הוא התאמה של מילה שלמה/מדויקת. לאחר הקריאה חזרה:
| Method | Result |
|---|---|
SearchMatchCount() | סך כל ההתאמות הפרטיות במסמך. |
SearchSummary(false) | רשומות [pageNumber, matchCount] ללא צביעת מחדש. |
SearchSummary(true) | אותה סיכום וגם מצביע צביעת עמוד/תמונה ממוזערת. |
GotoSearchMatch(index) | נווט להתאמה בעלת אינדקס אפס‑מבוסס. |
נתיב המידלוור משתמש ב‑search=<term> ו‑exact=true|false ומחזיר XML. השתמשו ב‑API של ה‑widget במקום לנתח את התגובה הפנימית בעצמכם.
בדיקת יכולת חיפוש
תשובת האתחול מדווחת:
X-Doconut-Can-Search: 1לאחר האתחול, objViewer.CanSearch() חושף את אותו פסק דין של פורמט/סשן. הוא מחזיר false כאשר השרת שולח 0; לפני קבלת התשובה, או עם שרת ישן שמוותר על הכותרת, הוא מניח true.
שלושה שערים בלתי תלויים שלא יש לבלבל ביניהם:
| Gate | Question |
|---|---|
CanSearch() / response header | האם לצופה המיועד יש אינדקס/נתיב חיפוש מקורי? |
AllowSearch | האם קונפיגורציית הפורמט ביקשה חילוץ טקסט שבו המתג קיים? |
LicenseCapability.Search | האם האפליקציה מורשית לבצע חיפוש ולקבל את חבילות ה‑UI? |
פורמט יכול להיות טכנית בר-חיפוש בעוד שהרישיון הנוכחי דוחה את הפעולה.
הפעלת חילוץ לפי פורמט
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 מבוסס‑טקסט:
// DefaultRender = false → converted to a text-based PDF → searchable
var token = await viewer.OpenDocumentAsync(path, new HtmlConfig { DefaultRender = false });למתאמים מקומיים, CanSearch() מתאר את יכולת הצופה; הוא אינו מבטיח שמסמך מסוים מכיל טקסט שניתן להשתמש בו. PDF שהדפים שלו הם רק תמונות סרוקות עדיין עשוי להחזיר אפס תוצאות מקומיות.
התנהגות חיפוש רגילה
השרת מנסה מקורות חיפוש בסדר הבא:
- תוצאות
ISearchableViewerמקורי. - אינדקס חיפוש
.srhשנבנה מראש. - שגיאה/תוצאה ריקה כאשר אין מקור חיפוש.
CanSearch() יכול להיות true לצופה בר‑חיפוש גם כאשר למסמך מסוים אין שכבת טקסט ולכן הוא מחזיר אפס התאמות.
רישוי והתנהגות UI
רישיון Temporary/Demo פעיל מעניק חיפוש במהלך תקופתו הפעילה. רישיון חסר וקובץ TRIAL ישן אינם מעניקים יכולת חיפוש. ללא חיפוש:
ReferenceCssו‑ReferenceScriptsמשאירים את חבילות החיפוש.- המידלוור דוחה חיפוש במקום להחזיר תוצאות מורשות.
הניעו נראות UI מותאם אישית דרך IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search) והשתמשו ב‑CanSearch() לפסק הדין של הפורמט/סשן בנפרד.
פתרון בעיות
| Symptom | Check |
|---|---|
| Search bar is missing | Search capability and IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar |
CanSearch() is false | Format viewer, selected DefaultRender path, and initialization response header |
| Search returns zero for a scanned PDF | The document has no text layer; use a text-bearing source or a PDF projection that preserves text |
| Search works but highlights are offset | Rendering path, resolution, document transforms, and extracted word boxes |
האם דף זה היה מועיל?