การค้นหา

การค้นหาข้อความแบบเนทีฟในส่วนประกอบ 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
}))

ริบบอนที่ฝังอยู่เรียกใช้เมธอด JavaScript เดียวกันที่ UI แบบกำหนดเองสามารถเข้าถึงได้ .

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

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: '/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)ไปยังการจับคู่ที่ตำแหน่ง index (เริ่มจากศูนย์)

เส้นทางมิดเดิลแวร์ใช้ search=<term> และ exact=true|false แล้วคืนค่าเป็น XML . ควรใช้ widget API แทนการพาร์ส XML ภายในด้วยตนเอง .

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

การตอบสนองจากการเริ่มต้นจะรายงาน:

text
X-Doconut-Can-Search: 1

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

มีสามเกตที่ต้องแยกแยะไม่ให้สับสน:

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

รูปแบบหนึ่งอาจเป็น searchable ทางเทคนิคในขณะที่ใบอนุญาตปัจจุบันปฏิเสธการดำเนินการนั้น .

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

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 .

มีอะแดปเตอร์ native‑search สำหรับ PDF, Word, Excel, PowerPoint, TXT, Visio, email, 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 });

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

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

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

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

CanSearch() อาจเป็น true สำหรับ viewer ที่ searchable แม้ว่าเอกสารสแกนบางฉบับจะไม่มีเลเยอร์ข้อความและจึงไม่มีผลลัพธ์ใด ๆ .

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

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

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

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

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

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

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