CPDFSearchControl.xaml.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. using ComPDFKit.PDFPage;
  2. using compdfkit_tools.PDFControlUI;
  3. using ComPDFKitViewer.PdfViewer;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Diagnostics;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows;
  11. using System.Windows.Controls;
  12. using System.Windows.Data;
  13. using System.Windows.Documents;
  14. using System.Windows.Input;
  15. using System.Windows.Media;
  16. using System.Windows.Media.Imaging;
  17. using System.Windows.Navigation;
  18. using System.Windows.Shapes;
  19. namespace compdfkit_tools.PDFControl
  20. {
  21. /// <summary>
  22. /// UserControl1.xaml 的交互逻辑
  23. /// </summary>
  24. public partial class CPDFSearchControl : UserControl
  25. {
  26. /// <summary>
  27. /// PDFViewer
  28. /// </summary>
  29. private CPDFViewer pdfView;
  30. private int currentHighLightIndex { get; set; } = -1;
  31. private PDFTextSearch textSearch;
  32. private string keyWord;
  33. private SolidColorBrush highLightBrush = new SolidColorBrush(Color.FromArgb(0x99, 0xFF, 0xF7, 0x00));
  34. public CPDFSearchControl()
  35. {
  36. InitializeComponent();
  37. Loaded += PDFSearch_Loaded;
  38. }
  39. /// <summary>
  40. /// 设置PDFViewer
  41. /// </summary>
  42. public void InitWithPDFViewer(CPDFViewer newPDFView)
  43. {
  44. pdfView = newPDFView;
  45. }
  46. private void PDFSearch_Loaded(object sender, RoutedEventArgs e)
  47. {
  48. textSearch = new PDFTextSearch();
  49. SearchInput.SearchEvent += SearchInput_SearchEvent;
  50. SearchInput.FindNextEvent += SearchInput_FindNextEvent;
  51. SearchInput.FindPreviousEvent += SearchInput_FindPreviousEvent;
  52. textSearch.SearchPercentHandler += TextSearch_SearchPercentHandler;
  53. textSearch.SearchCancelHandler += TextSearch_SearchCancelHandler;
  54. textSearch.SearchCompletedHandler += TextSearch_SearchCompletedHandler;
  55. SearchResult.SelectionChanged += SearchResult_SelectionChanged;
  56. }
  57. /// <summary>
  58. ///高亮上一个搜索结果
  59. /// </summary>
  60. private void SearchInput_FindPreviousEvent(object sender, EventArgs e)
  61. {
  62. if (currentHighLightIndex > 0)
  63. {
  64. currentHighLightIndex--;
  65. BindSearchResult result = SearchResult.GetItem(currentHighLightIndex);
  66. HighLightSelectResult(result);
  67. }
  68. }
  69. /// <summary>
  70. /// 高亮下一个搜索结果
  71. /// </summary>
  72. private void SearchInput_FindNextEvent(object sender, EventArgs e)
  73. {
  74. currentHighLightIndex++;
  75. if (currentHighLightIndex >= 0)
  76. {
  77. BindSearchResult result = SearchResult.GetItem(currentHighLightIndex);
  78. HighLightSelectResult(result);
  79. }
  80. }
  81. /// <summary>
  82. /// 高亮选中搜索结果
  83. /// </summary>
  84. private void SearchResult_SelectionChanged(object sender, int e)
  85. {
  86. currentHighLightIndex = e;
  87. BindSearchResult result = SearchResult.GetSelectItem();
  88. HighLightSelectResult(result);
  89. }
  90. /// <summary>
  91. /// 搜索完成绑定数据
  92. /// </summary>
  93. private void TextSearch_SearchCompletedHandler(object sender, TextSearchResult e)
  94. {
  95. Dispatcher.Invoke(() =>
  96. {
  97. List<BindSearchResult> resultList = new List<BindSearchResult>();
  98. foreach (int pageIndex in e.Items.Keys)
  99. {
  100. List<TextSearchItem> textSearchItems = e.Items[pageIndex];
  101. foreach (TextSearchItem item in textSearchItems)
  102. {
  103. resultList.Add(new BindSearchResult()
  104. {
  105. PageIndex = item.PageIndex,
  106. TextContent = item.TextContent,
  107. TextRect = item.TextRect,
  108. SearchWord = keyWord,
  109. HighLightColor = Color.FromArgb(0x99, 0xFF, 0xF7, 0x00),
  110. PageRotate = item.PageRotate
  111. });
  112. }
  113. }
  114. SearchResult.SetSearchResult(resultList);
  115. });
  116. }
  117. /// <summary>
  118. /// 搜索取消通知
  119. /// </summary>
  120. private void TextSearch_SearchCancelHandler(object sender, TextSearchResult e)
  121. {
  122. Dispatcher.InvokeAsync(() =>
  123. {
  124. Debug.WriteLine("Text Search Canceled");
  125. });
  126. }
  127. /// <summary>
  128. /// 搜索进度通知
  129. /// </summary>
  130. private void TextSearch_SearchPercentHandler(object sender, TextSearchResult e)
  131. {
  132. Dispatcher.InvokeAsync(() =>
  133. {
  134. Debug.WriteLine($"Search percent: {e.Percent}");
  135. });
  136. }
  137. /// <summary>
  138. /// 搜索执行事件
  139. /// </summary>
  140. private void SearchInput_SearchEvent(object sender, string e)
  141. {
  142. if (string.IsNullOrEmpty(e))
  143. {
  144. return;
  145. }
  146. if (pdfView == null || pdfView.Document == null)
  147. {
  148. return;
  149. }
  150. if (textSearch != null && textSearch.CanDoSearch)
  151. {
  152. keyWord = e;
  153. textSearch.TextSearchDocument = pdfView.Document;
  154. textSearch.SearchText(e, C_Search_Options.Search_Case_Insensitive);
  155. }
  156. }
  157. /// <summary>
  158. /// 高亮搜索结果
  159. /// </summary>
  160. private void HighLightSelectResult(BindSearchResult result)
  161. {
  162. if (result == null)
  163. {
  164. return;
  165. }
  166. List<TextSearchItem> selectList = new List<TextSearchItem>();
  167. selectList.Add(new TextSearchItem()
  168. {
  169. PageIndex = result.PageIndex,
  170. TextRect = result.TextRect,
  171. TextContent = result.TextContent,
  172. PageRotate = result.PageRotate,
  173. });
  174. pdfView.SetPageSelectText(selectList, highLightBrush);
  175. }
  176. }
  177. }