การค้นหา

การค้นหาข้อความแบบเนทีฟในส่วนประกอบ Viewer

Doconut Viewer ให้การค้นหาปกติโดยใช้ข้อความที่สกัดจากตัวดูฟอร์แมตหรือการเปลี่ยนเส้นทางเป็น PDF แบบข้อความ มันต้องการความสามารถของใบอนุญาต Search.

เปิดใช้งาน UI การค้นหา

Search เป็นโมดูลของ Viewer ไม่ใช่แถบเครื่องมือแบบสแตนด์อโลน หน้าเต็มต้องรวมทรัพยากร Viewer, แถบเครื่องมือ Viewer, การเมานท์ Viewer, และ objViewer ที่ได้เริ่มต้นแล้ว; จากนั้น Ribbon ของ Search จะถูกเมานท์และแนบไปยังอินสแตนซ์เดียวกันนั้น

Search และ annotation เป็นฟีเจอร์ที่มีใบอนุญาตในตัว ไม่ใช่แพคเกจ AddPlugin<T>() ขอทรัพยากรการค้นหาจาก Viewer ที่ฉีดเข้า; แท็กของพวกมันจะถูกส่งออกเฉพาะเมื่อใบอนุญาตให้ใช้ Search

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 เดียวกันที่ใช้ได้กับ UI ที่กำหนดเอง

เก็บส่วนประกอบ Viewer ทั้งหมดให้มองเห็นใน markup, เริ่มต้น docViewer ก่อน, แล้วจึงแนบ Ribbon ที่มีใบอนุญาต:

html
<nav id="toolbar" aria-label="Document viewer controls">
    <!-- ควบคุม Viewer, รวมถึงปุ่มที่เปิดการค้นหา -->
</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 และจัดการการค้นหา, การล้าง, จำนวนการจับคู่, และการนำทางไปยังการจับคู่ก่อนหน้า/ถัดไป แถบเครื่องมือ Viewer ที่เป็นของโฮสต์เพียงแค่สลับเปิด/ปิดก็พอ:

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

API สาธารณะของมันถูกออกแบบให้เล็กที่สุดเท่าที่จะเป็นไปได้:

วิธีการวัตถุประสงค์
attach(objViewer)เชื่อม Ribbon กับ viewer ที่ได้เริ่มต้นแล้ว; ต้องทำครั้งเดียว
open() / close()แสดงหรือซ่อน Ribbon; การปิดยังทำการลบไฮไลท์ด้วย
reset()ล้างคำค้นปัจจุบัน, จำนวนผลลัพธ์, และไฮไลท์
isOpen()รายงานว่า Ribbon แสดงอยู่หรือไม่
setStatus(message)ส่งต่อข้อความสถานะผ่าน callback ที่กำหนด

callback ทางเลือก onToggle(isOpen) ช่วยให้โฮสต์ซิงโครไนซ์ปุ่ม Search ของตน, และ onLayout ช่วยให้มันปรับขนาด/รีฟิต viewer เมื่อความสูงของ 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 ใช้ widget API แทนการพาร์สการตอบกลับภายในด้วยตนเอง

ตรวจสอบความสามารถในการค้นหา

การตอบกลับการเริ่มต้นรายงาน:

text
X-Doconut-Can-Search: 1

หลังจากเริ่มต้น, objViewer.CanSearch() จะเปิดเผยคำตัดสินของฟอร์แมต/เซสชันเดียวกัน มันจะคืนค่า false เมื่อเซิร์ฟเวอร์ส่ง 0; ก่อนที่ตอบกลับจะมาถึง, หรือกับเซิร์ฟเวอร์เก่าที่ละเว้นหัว, ค่าเริ่มต้นจะเป็น true.

ต้องไม่สับสนระหว่างประตูอิสระสามประตูต่อไปนี้:

ประตูคำถาม
CanSearch() / response headerViewer ที่กำหนดมีดัชนี/เส้นทางการค้นหาแบบเนทีฟหรือไม่?
AllowSearchการตั้งค่าฟอร์แมตนี้ได้ร้องขอการสกัดข้อความที่สวิตช์มีอยู่หรือไม่?
LicenseCapability.Searchแอปพลิเคชันได้รับอนุญาตให้ทำการค้นหาและรับ UI bundles หรือไม่?

ฟอร์แมตอาจเป็น searchable ทางเทคนิคในขณะที่ใบอนุญาตปัจจุบันปฏิเสธการดำเนินการ

เปิดการสกัดข้อความตามฟอร์แมต

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, email, EPUB, และ MHT. XPS ใช้เส้นทาง PDF เป็นค่าเริ่มต้น HTML และ Microsoft Project ได้ประโยชน์จากการเปลี่ยนเส้นทางเป็น PDF แบบข้อความ:

csharp
// DefaultRender = false → แปลงเป็น PDF แบบข้อความ → สามารถค้นหาได้
var token = await viewer.OpenDocumentAsync(path, new HtmlConfig { DefaultRender = false });

สำหรับเรนเดอร์เนทีฟ, CanSearch() บรรยายความสามารถของ viewer; มันไม่ได้รับประกันว่าเอกสารใดเอกสารหนึ่งมีข้อความที่ใช้ได้ PDF ที่หน้าทั้งหมดเป็นภาพสแกนอาจยังให้ผลลัพธ์เนทีฟเป็นศูนย์ได้

พฤติกรรมการค้นหาปกติ

เซิร์ฟเวอร์พยายามใช้แหล่งค้นหาในลำดับต่อไปนี้:

  1. ผลลัพธ์ ISearchableViewer แบบเนทีฟ
  2. ดัชนีการค้นหา .srh ที่สร้างไว้ล่วงหน้า
  3. ข้อผิดพลาด/ผลลัพธ์ว่างเมื่อไม่มีแหล่งค้นหา

CanSearch() สามารถเป็น true สำหรับ viewer ที่ searchable แม้เอกสารสแกนเฉพาะบางฉบับไม่มีชั้นข้อความและจึงคืนค่าไม่มีการจับคู่

การให้ใบอนุญาตและพฤติกรรม UI

ใบอนุญาต Temporary/Demo ที่ใช้งานอยู่ให้สิทธิ์ Search ในช่วงเวลาที่ใช้งาน ใบอนุญาตที่หายไปและไฟล์ TRIAL รุ่นเก่าไม่ให้ความสามารถ Search ใด ๆ หากไม่มี Search:

  • ReferenceCss และ ReferenceScripts จะละเว้นชุดค้นหา
  • Middleware ปฏิเสธการค้นหาแทนที่จะคืนผลลัพธ์ที่ได้รับใบอนุญาต

ควบคุมการมองเห็น UI ที่กำหนดเองจาก IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search) และใช้ CanSearch() สำหรับคำตัดสินฟอร์แมต/เซสชันแยกต่างหาก

การแก้ไขปัญหา

อาการตรวจสอบ
แถบค้นหาหายไปความสามารถในการค้นหาและ IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar
CanSearch() เป็น falseViewer ฟอร์แมต, เส้นทาง DefaultRender ที่เลือก, และหัวตอบรับการเริ่มต้น
การค้นหาส่งคืนศูนย์สำหรับ PDF ที่สแกนเอกสารไม่มีชั้นข้อความ; ใช้แหล่งที่มีข้อความหรือการฉาย PDF ที่รักษาข้อความไว้
การค้นหาทำงานแต่ไฮไลท์เบี่ยงเบนเส้นทางการเรนเดอร์, ความละเอียด, การแปลงเอกสาร, และกล่องคำที่สกัด

หน้านี้เป็นประโยชน์หรือไม่?