חיפוש
חיפוש טקסט מקורי בהרכבת הצופה
ה‑Doconut Viewer מספק חיפוש רגיל באמצעות טקסט שנחץ מצופה הפורמט או הפנייה של PDF מבוסס טקסט. הוא דורש את יכולת הרישיון Search.
הפעלת ממשק החיפוש
חיפוש הוא מודול של Viewer, ולא סרגל כלים עצמאי. על הדף המלא לכלול את משאבי ה‑Viewer, סרגל הכלים של ה‑Viewer, הרכבה של ה‑Viewer, ואת objViewer שהאותחל; לאחר מכן ריבון החיפוש מותקן ומחובר לאותו מופע.
חיפוש והערה הם תכונות ברישיון מובנות, ולא חבילות AddPlugin<T>(). בקש את משאבי החיפוש מ‑Viewer; התגים שלהם נוצרות רק כאשר הרישיון מאפשר חיפוש. לתצוגות MVC 5 אין @inject, ולכן יש לבנות את התגים בבקר ולשלוח אותם דרך ViewBag, יחד עם דגל הרישיון שהדף צריך:
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;כתוב אותם בתצוגה עם @Html.Raw(ViewBag.ViewerCss) ו‑@Html.Raw(ViewBag.ViewerScripts). ב‑Web Forms, חשוף את אותם ערכים מה‑code-behind וכתוב אותם עם <%= %>.
הריבון המוטמע קורא לאותם מתודות JavaScript הזמינות לממשק משתמש מותאם.
שמור על הרכבת ה‑Viewer המלאה גלויה במרקאפ, אתחל תחילה את docViewer, ולאחר מכן חבר את הריבון ברישיון:
<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>ה‑if בצד השרת חשוב: ללא יכולת החיפוש, ReferenceScripts משמיט את סקריפט הריבון, ולכן קריאה לא מוגנת ל‑doconutSearchBar(...) תגרום לשגיאה ותעצור את טעינת דף הצופה. ב‑Web Forms, כתוב את אותו תנאי כ‑<% if (IsSearchEnabled) { %> … <% } %>.
המרכיב מוסיף קבוצות Find, Options ו‑Results ומטפל בחיפוש, ניקוי, ספירת התאמות, וניווט בין התאמה קודמת/הבאה. סרגל הכלים של ה‑Viewer שבבעלות המארח צריך רק להחליף את מצבו:
searchBar.isOpen() ? searchBar.close() : searchBar.open();ה‑API הציבורי שלו מתוכנן להיות קטן:
| מתודה | מטרה |
|---|---|
attach(objViewer) | מחבר את הריבון לצופה שהאותחל; נדרש פעם אחת |
open() / close() | מציג או מסתיר את הריבון; סגירה גם מנקה הדגשות |
reset() | מנקה את המונח הנוכחי, ספירת התוצאות וההדגשות |
isOpen() | מדווח האם הריבון גלוי |
setStatus(message) | מעביר הודעת סטטוס דרך הקריאה חזרה המוגדרת |
ה‑callback האופציונלי onToggle(isOpen) מאפשר למארח לסנכרן את כפתור החיפוש שלו, ו‑onLayout מאפשר לו לשנות גודל/להתאים מחדש את הצופה כאשר הריבון משנה גובה. עבור רצף האתחול המשולב של Viewer, Search ו‑Annotation, ראה
התחלה מהירה.
חיפוש מ-JavaScript
objViewer.Search(keyword, false, function (resultCount) {
console.log('Matches:', resultCount);
});הפרמטר השני הוא התאמה של מילה שלמה/מדויקת. מספר ההתאמות מגיע בקריאה חזרה: Search עצמו פונה לשרת ומחזיר דבר שאינו מועיל, ולכן var n = objViewer.Search(keyword, false) תמיד מחזיר undefined — ודף שנבנה כך מדווח "לא נמצא דבר" בעוד שהצופה מדגיש את ההתאמות. אחרי הקריאה חזרה:
| שיטה | תוצאה |
|---|---|
SearchMatchCount() | סך כל ההתאמות הבודדות במסמך. |
SearchSummary(false) | רשומות [pageNumber, matchCount] ללא צביעת מחדש. |
SearchSummary(true) | אותו סיכום וצובע הדגשות של דף/תמונה ממוזערת. |
GotoSearchMatch(index) | מעביר לאינדקס התאמה שמתחיל מאפס. |
DocImage.axd משיב ל-search=<term> ו-exact=true|false עם XML. השתמש ב-API של הווידג'ט במקום לנתח את התגובה הפנימית בעצמך.
בדיקת יכולת חיפוש
דוח התגובה של האתחול מדווח:
X-Doconut-Can-Search: 1לאחר האתחול, objViewer.CanSearch() מציג את אותו פסק דין של פורמט/סשן. הוא מחזיר false כאשר השרת שולח 0; לפני קבלת התגובה, או עם שרת ישן שמדלג על הכותרת, ברירת המחדל היא true.
שלושה שערים עצמאיים שלא יש לבלבל ביניהם:
| שער | שאלה |
|---|---|
CanSearch() / response header | האם הצופה המיועד כולל אינדקס/נתיב חיפוש מקורי? |
AllowSearch | האם תצורת פורמט זה ביקשה חילוץ טקסט במיקום שבו המתג קיים? |
LicenseCapability.Search | האם האפליקציה מורשית לבצע חיפוש ולקבל את חבילות הממשק? |
פורמט יכול להיות טכנית ניתן לחיפוש בעוד שהרישיון הנוכחי מונע את הפעולה.
הפעלת חילוץ לפי פורמט
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 עבור צופה עם אפשרות חיפוש גם כאשר מסמך מסוים אינו כולל שכבת טקסט ולכן אינו מחזיר התאמות.
רישוי והתנהגות ממשק משתמש
רישיון זמני/דמו פעיל מעניק חיפוש במהלך תקופתו הפעילה. רישיון חסר וקובץ TRIAL מיושן אינם מעניקים יכולת חיפוש. ללא חיפוש:
ReferenceCssו-ReferenceScriptsמשאירים את חבילות החיפוש.DocImage.axdמסרב לבקשות חיפוש במקום להחזיר תוצאות.
הפעלת נראות UI מותאמת אישית מתבצעת דרך IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search) והשתמש ב-CanSearch() עבור פסק הדין של הפורמט/הסשן בנפרד.
פתרון בעיות
| תסמין | בדיקה |
|---|---|
| סרגל החיפוש חסר | יכולת חיפוש ו-IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar |
CanSearch() הוא false | פורמט הצופה, נתיב DefaultRender שנבחר, וכותרת תגובת האתחול |
| חיפוש מחזיר אפס עבור PDF סרוק | למסמך אין שכבת טקסט; השתמש במקור עם טקסט או בהצגת PDF ששומרת על הטקסט |
| החיפוש עובד אך ההדגשות מוזזות | נתיב הרינדור, רזולוציה, שינויי מסמך, ותיבות המילים שהוצאו |
האם דף זה היה מועיל?