חיפוש

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

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

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

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

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

הקריאה חזרה האופציונלית 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. תוצאה של שגיאה/ריקה כאשר אין מקור חיפוש.

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

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

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

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

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

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

פתרון בעיות

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

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