חיפוש

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

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

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

חיפוש הוא מודול של הצופה, ולא סרגל כלים עצמאי. על הדף המלא לכלול את משאבי הצופה, סרגל הכלים של הצופה, הרכבת הצופה, ואת objViewer שהאותחל; לאחר מכן ריבון החיפוש מורכב ומחובר לאותו מופע.

חיפוש והערה הם תכונות מורשות מובנות, ולא חבילות 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
}))

הריבון המוטמע קורא לאותם מתודות JavaScript הזמינות לממשק משתמש מותאם.

שמור על הרכבת הצופה המלאה גלויה בסימון, אתחל תחילה את docViewer, ולאחר מכן חבר את הריבון המורשה:

html
<nav id="toolbar" aria-label="Document viewer controls">
    <!-- פקדי הצופה, כולל הכפתור הפותח את החיפוש -->
</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 ומטפל בחיפוש, ניקוי, ספירת התאמות, וניווט התאמה קודמת/הבאה. סרגל הכלים של הצופה בבעלות המארח צריך רק להחליף את מצבו:

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

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

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

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

חיפוש מ‑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 של הווידג'ט במקום לנתח את התגובה הפנימית בעצמך.

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

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

text
X-Doconut-Can-Search: 1

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

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

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

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

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

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. תוצאות ISearchableViewer מקוריות.
  2. אינדקס חיפוש קדם‑נבנה .srh.
  3. שגיאה/תוצאה ריקה כאשר אין מקור חיפוש.

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

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

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

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

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

פתרון בעיות

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

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