การค้นหา

การค้นหาข้อความแบบเนทีฟในส่วนประกอบ 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 รวมถึงปุ่มที่เปิด 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: '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 สาธารณะของมันถูกออกแบบให้เล็กโดยเจตนา:

MethodPurpose
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:

MethodResult
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.

ต้องไม่สับสนกับสามเกตอิสระต่อไปนี้:

GateQuestion
CanSearch() / response headerตัว Viewer ที่ได้รับการแก้ไขมีดัชนี/เส้นทางการค้นหาแบบเนทีฟหรือไม่?
AllowSearchการตั้งค่า format นี้ได้ร้องขอการสกัดข้อความที่สวิตช์นี้มีอยู่หรือไม่?
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 แบบข้อความ → searchable
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 จะละเว้นชุด search
  • middleware ปฏิเสธการค้นหาแทนการคืนผลลัพธ์ที่มีใบอนุญาต

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

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

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

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