using ComPDFKit.PDFPage; using compdfkit_tools.PDFControlUI; using ComPDFKitViewer.PdfViewer; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace compdfkit_tools.PDFControl { /// /// UserControl1.xaml 的交互逻辑 /// public partial class CPDFSearchControl : UserControl { /// /// PDFViewer /// private CPDFViewer pdfView; private int currentHighLightIndex { get; set; } = -1; private PDFTextSearch textSearch; private string keyWord; private SolidColorBrush highLightBrush = new SolidColorBrush(Color.FromArgb(0x99, 0xFF, 0xF7, 0x00)); public CPDFSearchControl() { InitializeComponent(); Loaded += PDFSearch_Loaded; } /// /// 设置PDFViewer /// public void InitWithPDFViewer(CPDFViewer newPDFView) { pdfView = newPDFView; } private void PDFSearch_Loaded(object sender, RoutedEventArgs e) { textSearch = new PDFTextSearch(); SearchInput.SearchEvent += SearchInput_SearchEvent; SearchInput.FindNextEvent += SearchInput_FindNextEvent; SearchInput.FindPreviousEvent += SearchInput_FindPreviousEvent; textSearch.SearchPercentHandler += TextSearch_SearchPercentHandler; textSearch.SearchCancelHandler += TextSearch_SearchCancelHandler; textSearch.SearchCompletedHandler += TextSearch_SearchCompletedHandler; SearchResult.SelectionChanged += SearchResult_SelectionChanged; } /// ///高亮上一个搜索结果 /// private void SearchInput_FindPreviousEvent(object sender, EventArgs e) { if (currentHighLightIndex > 0) { currentHighLightIndex--; BindSearchResult result = SearchResult.GetItem(currentHighLightIndex); HighLightSelectResult(result); } } /// /// 高亮下一个搜索结果 /// private void SearchInput_FindNextEvent(object sender, EventArgs e) { currentHighLightIndex++; if (currentHighLightIndex >= 0) { BindSearchResult result = SearchResult.GetItem(currentHighLightIndex); HighLightSelectResult(result); } } /// /// 高亮选中搜索结果 /// private void SearchResult_SelectionChanged(object sender, int e) { currentHighLightIndex = e; BindSearchResult result = SearchResult.GetSelectItem(); HighLightSelectResult(result); } /// /// 搜索完成绑定数据 /// private void TextSearch_SearchCompletedHandler(object sender, TextSearchResult e) { Dispatcher.Invoke(() => { List resultList = new List(); foreach (int pageIndex in e.Items.Keys) { List textSearchItems = e.Items[pageIndex]; foreach (TextSearchItem item in textSearchItems) { resultList.Add(new BindSearchResult() { PageIndex = item.PageIndex, TextContent = item.TextContent, TextRect = item.TextRect, SearchWord = keyWord, HighLightColor = Color.FromArgb(0x99, 0xFF, 0xF7, 0x00), PageRotate = item.PageRotate }); } } SearchResult.SetSearchResult(resultList); }); } /// /// 搜索取消通知 /// private void TextSearch_SearchCancelHandler(object sender, TextSearchResult e) { Dispatcher.InvokeAsync(() => { Debug.WriteLine("Text Search Canceled"); }); } /// /// 搜索进度通知 /// private void TextSearch_SearchPercentHandler(object sender, TextSearchResult e) { Dispatcher.InvokeAsync(() => { Debug.WriteLine($"Search percent: {e.Percent}"); }); } /// /// 搜索执行事件 /// private void SearchInput_SearchEvent(object sender, string e) { if (string.IsNullOrEmpty(e)) { return; } if (pdfView == null || pdfView.Document == null) { return; } if (textSearch != null && textSearch.CanDoSearch) { keyWord = e; textSearch.TextSearchDocument = pdfView.Document; textSearch.SearchText(e, C_Search_Options.Search_Case_Insensitive); } } /// /// 高亮搜索结果 /// private void HighLightSelectResult(BindSearchResult result) { if (result == null) { return; } List selectList = new List(); selectList.Add(new TextSearchItem() { PageIndex = result.PageIndex, TextRect = result.TextRect, TextContent = result.TextContent, PageRotate = result.PageRotate, }); pdfView.SetPageSelectText(selectList, highLightBrush); } } }