การค้นหา
การค้นหาข้อความแบบเนทีฟในส่วนประกอบ Viewer
Doconut Viewer ให้การค้นหาปกติโดยใช้ข้อความที่สกัดจากตัวดูรูปแบบหรือการเปลี่ยนเส้นทาง PDF แบบข้อความ . จำเป็นต้องมีความสามารถของใบอนุญาต Search.
เปิดใช้งาน UI การค้นหา
Search เป็นโมดูลของ Viewer ไม่ใช่แถบเครื่องมือแบบสแตนด์อโลน . หน้าเว็บทั้งหมดต้องรวมทรัพยากร Viewer, แถบเครื่องมือ Viewer, จุดเชื่อมต่อ Viewer, และ objViewer ที่ได้ทำการเริ่มต้นแล้ว ; จากนั้น Ribbon ของ Search จะถูกเมานท์และแนบไปยังอินสแตนซ์เดียวกันนั้น .
Search และ annotation เป็นฟีเจอร์ที่มีใบอนุญาตในตัว ไม่ใช่แพ็กเกจ AddPlugin<T>() . ขอรับทรัพยากรการค้นหาจาก Viewer ที่ฉีดเข้า ; แท็กของพวกมันจะถูกปล่อยออกมาเฉพาะเมื่อใบอนุญาตให้ใช้ Search .
@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 ที่มีใบอนุญาต:
<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 ที่เป็นของโฮสต์เพียงแค่สลับเปิด/ปิดได้เท่านั้น:
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
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 ภายในด้วยตนเอง .
ตรวจสอบความสามารถในการค้นหา
การตอบสนองจากการเริ่มต้นจะรายงาน:
X-Doconut-Can-Search: 1หลังจากเริ่มต้น, objViewer.CanSearch() จะเปิดเผยผลการตัดสินใจของรูปแบบ/เซสชันเดียวกัน . หากเซิร์ฟเวอร์ส่ง 0 จะคืนค่า false; ก่อนที่การตอบกลับจะมาถึงหรือกับเซิร์ฟเวอร์รุ่นเก่าที่ไม่มีหัวข้อดังกล่าว, ค่าเริ่มต้นจะเป็น true .
มีสามเกตที่ต้องแยกแยะไม่ให้สับสน:
| เกต | คำถาม |
|---|---|
CanSearch() / response header | Viewer ที่ได้รับการแก้ไขมีดัชนี/เส้นทางการค้นหาแบบเนทีฟหรือไม่? |
AllowSearch | การตั้งค่ารูปแบบนี้ได้ร้องขอการสกัดข้อความที่สวิตช์นี้มีอยู่หรือไม่? |
LicenseCapability.Search | แอปพลิเคชันได้รับอนุญาตให้ดำเนินการค้นหาและรับ UI bundles หรือไม่? |
รูปแบบหนึ่งอาจเป็น searchable ทางเทคนิคในขณะที่ใบอนุญาตปัจจุบันปฏิเสธการดำเนินการนั้น .
เปิดการสกัดข้อความตามรูปแบบ
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 แบบข้อความ:
// DefaultRender = false → converted to a text-based PDF → searchable
var token = await viewer.OpenDocumentAsync(path, new HtmlConfig { DefaultRender = false });สำหรับ renderer แบบเนทีฟ, CanSearch() บรรยายความสามารถของ viewer ; แต่ไม่ได้รับประกันว่าเอกสารใดเอกสารหนึ่งจะมีข้อความที่ใช้ได้ . PDF ที่หน้าเป็นภาพสแกนเท่านั้นอาจให้ผลลัพธ์เนทีฟเป็นศูนย์ .
พฤติกรรมการค้นหาแบบปกติ
เซิร์ฟเวอร์จะพิจารณาแหล่งค้นหาในลำดับต่อไปนี้:
- ผลลัพธ์จาก
ISearchableViewerเนทีฟ . - ดัชนี
.srhที่สร้างไว้ล่วงหน้า . - ผลลัพธ์เป็นข้อผิดพลาด/ว่างเมื่อไม่มีแหล่งค้นหาใด ๆ .
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 ทำงานแต่ไฮไลท์ตำแหน่งผิด | ตรวจสอบเส้นทางการเรนเดอร์, ความละเอียด, การแปลงเอกสาร, และกล่องคำที่สกัดได้ |
หน้านี้เป็นประโยชน์หรือไม่?