การค้นหา
การค้นหาข้อความแบบดั้งเดิมในโครงสร้าง Viewer
The Doconut Viewer ให้บริการการค้นหาแบบปกติโดยใช้ข้อความที่สกัดจากตัวดูรูปแบบหรือการเปลี่ยนเส้นทาง PDF แบบข้อความ. มันต้องการความสามารถของใบอนุญาต Search.
เปิดใช้งาน UI การค้นหา
Search เป็นโมดูลของ Viewer ไม่ใช่แถบเครื่องมือแบบสแตนด์อโลน. หน้าเว็บทั้งหมดต้องรวมทรัพยากรของ Viewer, แถบเครื่องมือ Viewer, จุดเชื่อมต่อ Viewer, และ objViewer ที่ได้เริ่มต้นแล้ว; จากนั้น Ribbon ของ Search จะถูกเมานท์และแนบเข้ากับอินสแตนซ์เดียวกันนั้น.
Search และ annotation เป็นฟีเจอร์ที่มีใบอนุญาตในตัว, ไม่ใช่แพคเกจ AddPlugin<T>(). ขอรับทรัพยากรการค้นหาจาก Viewer; แท็กของพวกมันจะถูกสร้างขึ้นเฉพาะเมื่อใบอนุญาตให้ใช้ Search. MVC 5 view ไม่มี @inject, ดังนั้นให้สร้างแท็กในคอนโทรลเลอร์และส่งผ่านไปยัง ViewBag พร้อมกับแฟล็กใบอนุญาตที่หน้าต้องการ:
var viewer = Doconut.DoconutHost.Services.GetRequiredService<Viewer>();
ViewBag.ViewerCss = viewer.ReferenceCss(new CssConfig
{
IncludeViewerCss = true,
IncludeSearchCss = true
});
ViewBag.ViewerScripts = viewer.ReferenceScripts(new ScriptConfig
{
IncludeJQuery = true,
IncludeViewerScripts = true,
IncludeSearchScripts = true,
IncludeSearchBar = true
});
ViewBag.IsSearchEnabled = viewer.IsSearchEnabled;เขียนค่าเหล่านี้ใน view ด้วย @Html.Raw(ViewBag.ViewerCss) และ @Html.Raw(ViewBag.ViewerScripts). ใน Web Forms ให้เปิดเผยค่าที่เดียวกันจาก code-behind แล้วเขียนด้วย <%= %>.
Ribbon ที่ฝังอยู่เรียกใช้เมธอด 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: '/',
ResPath: 'doconut-res/images'
});
@if ((bool)ViewBag.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>เงื่อนไข if ด้านเซิร์ฟเวอร์มีความสำคัญ: หากไม่มีความสามารถ Search, ReferenceScripts จะไม่รวมสคริปต์ของ Ribbon, ทำให้การเรียก doconutSearchBar(...) โดยไม่มีการป้องกันจะทำให้เกิดข้อผิดพลาดและหยุดการเริ่มต้นหน้า Viewer. ใน Web Forms ให้เขียนการป้องกันเดียวกันเป็น <% if (IsSearchEnabled) { %> … <% } %>.
คอมโพเนนต์นี้จะฉีดกลุ่ม Find, Options, และ Results และจัดการการค้นหา, การล้าง, การนับผลลัพธ์, รวมถึงการนำทางไปยังผลลัพธ์ก่อนหน้า/ถัดไป. แถบเครื่องมือ Viewer ที่เป็นของโฮสต์เพียงต้องสลับการแสดงผล:
searchBar.isOpen() ? searchBar.close() : searchBar.open();API สาธารณะของมันถูกออกแบบให้เล็กและกระชับ:
| เมธอด | วัตถุประสงค์ |
|---|---|
attach(objViewer) | เชื่อมต่อ Ribbon กับ viewer ที่ได้เริ่มต้นแล้ว; จำเป็นต้องทำครั้งเดียว |
open() / close() | แสดงหรือซ่อน Ribbon; การปิดจะลบไฮไลท์ด้วย |
reset() | ล้างคำค้นปัจจุบัน, จำนวนผลลัพธ์, และไฮไลท์ |
isOpen() | รายงานว่า Ribbon แสดงอยู่หรือไม่ |
setStatus(message) | ส่งต่อข้อความสถานะผ่านคอลแบ็กที่กำหนด |
คอลแบ็ก onToggle(isOpen) ทางเลือกช่วยให้โฮสต์ซิงโครไนซ์ปุ่ม Search ของตน, ส่วน onLayout ช่วยให้รีไซส์/รีฟิต viewer เมื่อความสูงของ Ribbon เปลี่ยน. สำหรับลำดับการเริ่มต้นของ Viewer, Search, และ Annotation ที่รวมกัน, ดูที่ เริ่มต้นอย่างรวดเร็ว.
ค้นหาจาก JavaScript
objViewer.Search(keyword, false, function (resultCount) {
console.log('Matches:', resultCount);
});อาร์กิวเมนต์ที่สองใช้สำหรับการจับคู่แบบคำเต็ม/แม่นยำ จำนวนการจับคู่จะถูกส่งกลับใน callback: Search เองจะส่งคำขอไปยังเซิร์ฟเวอร์และไม่ได้คืนค่าอะไรที่เป็นประโยชน์ ดังนั้น var n = objViewer.Search(keyword, false) จะอ่านค่าเป็น undefined เสมอ — และหน้าที่สร้างแบบนี้จะแสดงว่า “ไม่พบอะไร” แม้ว่าผู้ชมจะไฮไลท์การจับคู่ก็ตาม หลังจาก callback:
| วิธี | ผลลัพธ์ |
|---|---|
SearchMatchCount() | จำนวนการจับคู่แต่ละรายการทั้งหมดในเอกสาร |
SearchSummary(false) | รายการ [pageNumber, matchCount] โดยไม่ทำการรีเพนท์ |
SearchSummary(true) | สรุปเดียวกันและวาดไฮไลท์บนหน้า/ภาพย่อ |
GotoSearchMatch(index) | นำทางไปยังดัชนีการจับคู่ที่เริ่มจากศูนย์ |
DocImage.axd ตอบ search=<term> และ exact=true|false ด้วย XML ใช้ widget API แทนการพาร์สการตอบกลับภายในด้วยตนเอง
ตรวจสอบความสามารถในการค้นหา
การตอบสนองการเริ่มต้นรายงาน:
X-Doconut-Can-Search: 1หลังจากการเริ่มต้น objViewer.CanSearch() จะเปิดเผยผลการตัดสินใจรูปแบบ/เซสชันเดียวกัน มันจะคืนค่า false เมื่อเซิร์ฟเวอร์ส่ง 0; ก่อนที่การตอบสนองจะมาถึง หรือกับเซิร์ฟเวอร์รุ่นเก่าที่ละเว้นหัวนี้ จะตั้งค่าเริ่มต้นเป็น true
ต้องไม่สับสนระหว่างสามประตูอิสระต่อไปนี้:
| ประตู | คำถาม |
|---|---|
CanSearch() / response header | Viewer ที่แก้ไขแล้วมีดัชนี/เส้นทางการค้นหาแบบเนทีฟหรือไม่? |
AllowSearch | การตั้งค่า format นี้ได้ร้องขอการสกัดข้อความที่สวิตช์นี้มีอยู่หรือไม่? |
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
มี adapter การค้นหาแบบเนทีฟสำหรับ 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จะละเว้นชุดค้นหาDocImage.axdปฏิเสธคำขอการค้นหาแทนที่จะส่งผลลัพธ์
ควบคุมการมองเห็น UI แบบกำหนดเองจาก IDoconutLicenseService.IsCapabilityGranted(LicenseCapability.Search) และใช้ CanSearch() สำหรับการตัดสินใจรูปแบบ/เซสชันแยกต่างหาก
การแก้ไขปัญหา
| อาการ | ตรวจสอบ |
|---|---|
| แถบค้นหาหายไป | ความสามารถในการค้นหาและ IncludeSearchCss/IncludeSearchScripts/IncludeSearchBar |
CanSearch() เป็น false | Viewer ของรูปแบบ, เส้นทาง DefaultRender ที่เลือก, และหัวการตอบสนองการเริ่มต้น |
| การค้นหาส่งคืนศูนย์สำหรับ PDF ที่สแกน | เอกสารไม่มีชั้นข้อความ; ใช้แหล่งข้อมูลที่มีข้อความหรือการฉาย PDF ที่รักษาข้อความไว้ |
| การค้นทำงานแต่ไฮไลท์ตำแหน่งผิด | เส้นทางการเรนเดอร์, ความละเอียด, การแปลงเอกสาร, และกล่องคำที่สกัดออกมา |
หน้านี้เป็นประโยชน์หรือไม่?