חיפוש

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

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

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

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

חיפוש והערה הם תכונות ברישיון מובנות, ולא חבילות AddPlugin<T>(). בקש את משאבי החיפוש מ‑Viewer; התגים שלהם נוצרות רק כאשר הרישיון מאפשר חיפוש. לתצוגות MVC 5 אין @inject, ולכן יש לבנות את התגים בבקר ולשלוח אותם דרך ViewBag, יחד עם דגל הרישיון שהדף צריך:

csharp
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, ולאחר מכן חבר את הריבון ברישיון:

html
<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 שבבעלות המארח צריך רק להחליף את מצבו:

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

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

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

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

חיפוש מ-JavaScript

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

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

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

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

csharp
// DefaultRender = false → converted to a text-based PDF → searchable
var token = await viewer.OpenDocumentAsync(path, new HtmlConfig { DefaultRender = false });

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

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

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

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

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

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

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

  • ReferenceCss ו-ReferenceScripts משאירים את חבילות החיפוש.
  • DocImage.axd מסרב לבקשות חיפוש במקום להחזיר תוצאות.

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

פתרון בעיות

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

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