חיפוש
חיפוש טקסט מקורי בהרכבת הצופה
ה-Doconut Viewer מספק חיפוש רגיל באמצעות טקסט שמופק מצופה הפורמט או הפנייה מחדש של PDF מבוסס טקסט. הוא דורש את יכולת הרישיון Search.
הפעלת ממשק חיפוש
חיפוש הוא מודול של הצופה, לא סרגל כלים נפרד. על הדף המלא לכלול את משאבי הצופה, סרגל הכלים של הצופה, הרכבה של הצופה, ואת objViewer שהותחל; לאחר מכן ריבון החיפוש מותקן ומחובר לאותו מופע.
חיפוש והערה הם תכונות מורשות מובנות, ולא חבילות 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
}))הריבון המוטמע קורא לאותן שיטות JavaScript הזמינות לממשק משתמש מותאם.
שמור על הרכבה מלאה של הצופה גלויה בסימון, אתחל את docViewer תחילה, ולאחר מכן חבר את הריבון המורשה:
<nav id="toolbar" aria-label="Document viewer controls">
<!-- בקרות הצופה, כולל את הכפתור הפותח את 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 (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 ומטפל בחיפוש, ניקוי, ספירות התאמות, וניווט התאמה קודמת/הבאה. סרגל הכלים של הצופה שבבעלות המארח צריך רק להחליף את מצבו:
searchBar.isOpen() ? searchBar.close() : searchBar.open();ה-API הציבורי שלו מכוון להיות קטן:
| שיטה | מטרה |
|---|---|
attach(objViewer) | חבר את הריבון לצופה שהותחל; נדרש פעם אחת |
open() / close() | הצג או הסתר את הריבון; סגירה גם מנקה הדגשות |
reset() | נקה את המונח הנוכחי, ספירת התוצאות, והדגשות |
isOpen() | דווח האם הריבון גלוי |
setStatus(message) | העבר הודעת סטטוס דרך הקריאה חזרה המוגדרת |
הקריאה חזרה האופציונלית onToggle(isOpen) מאפשרת למארח לסנכרן את כפתור החיפוש שלו, ו-onLayout מאפשרת לו לשנות את גודל/התאמת הצופה כאשר הריבון משנה גובה. עבור רצף האתחול המשולב של הצופה, חיפוש והערה, ראה התחלה מהירה.
חיפוש מ-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 של הווידג'ט במקום לנתח את התגובה הפנימית בעצמך.
בדיקת יכולת חיפוש
תשובת האתחול מדווחת:
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 // אופציונלי: מאפשר למשתמש לגרור אזור ולהעתיק את הטקסט שלו
});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 → מומר ל‑PDF מבוסס‑טקסט → ניתן לחיפוש
var token = await viewer.OpenDocumentAsync(path, new HtmlConfig { DefaultRender = false });למתאמי רינדור מקוריים, CanSearch() מתאר את יכולת הצופה; הוא אינו מבטיח שמסמך מסוים מכיל טקסט שמיש. PDF שדפיו הם רק תמונות סרוקות עדיין יכול להפיק אפס תוצאות מקוריות.
התנהגות חיפוש רגילה
השרת מנסה מקורות חיפוש לפי הסדר הבא:
- תוצאות מקוריות של
ISearchableViewer. - אינדקס חיפוש
.srhשנבנה מראש. - תוצאה של שגיאה/ריקה כאשר אין מקור חיפוש.
האינדקס .srh הוא תוצר החיפוש המתפרסם לצד תמונות העמודים כאשר מסמכים מוגשים מאחסון משותף, ולכן צומת שמעולם לא פתח את המסמך עדיין יכול לענות על חיפושים — ראה פריסות מבוזרות.
CanSearch() יכול להיות אמת עבור צופה שניתן לחיפוש גם כאשר מסמך סרוק מסוים אינו מכיל שכבת טקסט ולכן מחזיר אפס התאמות.
רישוי והתנהגות ממשק משתמש
רישיון זמני/דמו פעיל מעניק חיפוש במהלך תקופתו הפעילה. רישיון חסר וקובץ TRIAL מיושן אינם מעניקים יכולת חיפוש. ללא חיפוש:
ReferenceCssו-ReferenceScriptsמשמיטים את חבילות החיפוש.- המידלוור דוחה חיפוש במקום להחזיר תוצאות מורשות.
הפעל את נראות הממשק המותאם אישית מ-IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search) והשתמש ב-CanSearch() עבור פסק הדין של פורמט/סשן נפרד.
פתרון בעיות
| סימפטום | בדיקה |
|---|---|
| סרגל החיפוש חסר | יכולת חיפוש ו-IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar |
CanSearch() הוא שקר | מציג פורמט, נתיב DefaultRender נבחר, וכותרת תגובת האתחול |
| החיפוש מחזיר אפס עבור PDF סרוק | למסמך אין שכבת טקסט; השתמש במקור נושא טקסט או בפרויקט PDF ששומר על הטקסט |
| החיפוש עובד אך ההדגשות מוזזות | נתיב הרינדור, רזולוציה, טרנספורמציות המסמך, ותיבות מילים מחולצות |
האם דף זה היה מועיל?