חיפוש

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

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

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

חיפוש הוא מודול של Viewer, ולא סרגל כלים נפרד. העמוד המלא חייב לכלול את משאבי ה-Viewer, סרגל הכלים של ה-Viewer, הרכבה של ה-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 הזמינות לממשק משתמש מותאם.

שמור על הרכבת ה-Viewer המלאה גלויה בתגיות, אתחל תחילה את docViewer, ולאחר מכן חבר את ה-Ribbon המורשה:

html
<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 ומטפלת בחיפוש, ניקוי, ספירת התאמות, וניווט התאמה קודמת/הבאה. סרגל הכלים של ה-Viewer שבבעלות המארח צריך רק להחליף את מצבו:

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

ה-API הציבורי שלו מכוון להיות קטן:

מתודהמטרה
attach(objViewer)מחבר את ה-Ribbon לצופה המאתחל; נדרש פעם אחת
open() / close()מציג או מסתיר את ה-Ribbon; סגירה גם מנקה הדגשות
reset()מנקה את המונח הנוכחי, ספירת התוצאות, וההדגשות
isOpen()מדווח האם ה-Ribbon גלוי
setStatus(message)מעביר הודעת מצב דרך ה-callback המוגדר

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

חיפוש מ-JavaScript

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

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

מתודהתוצאה
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() מציג את אותו פסק דין של פורמט/סשן. הוא מחזיר false כאשר השרת שולח 0; לפני התגובה, או עם שרת ישן שמוותר על הכותרת, הוא משתמש ב-true כברירת מחדל.

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

שערשאלה
CanSearch() / response headerהאם לצופה המיועד יש מסלול אינדקס/חיפוש מקורי?
AllowSearchהאם תצורת הפורמט ביקשה חילוץ טקסט במקום שהמתג קיים?
LicenseCapability.Searchהאם היישום מורשה לבצע חיפוש ולקבל את חבילות ה-UI?

פורמט יכול להיות טכנית ניתן לחיפוש בעוד שהרישיון הנוכחי דוחה את הפעולה.

הפעלת חילוץ לפי פורמט

csharp
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 מבוסס טקסט:

csharp
// DefaultRender = false → הומר ל‑PDF מבוסס‑טקסט → ניתן לחיפוש
var token = await viewer.OpenDocumentAsync(path, new HtmlConfig { DefaultRender = false });

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

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

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

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

האינדקס .srh הוא תוצר החיפוש המתפרסם לצד תמונות העמודים כאשר מסמכים מוגשים מאחסון משותף, ולכן צומת שמעולם לא פתח את המסמך עדיין יכול לענות על חיפושים — ראה פריסות מבוזרות.

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

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

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

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

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

פתרון בעיות

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

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