CPDFSearchControl.xaml.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  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.ClearEvent += SearchInput_ClearEvent;
  51. textSearch.SearchCompletedHandler += TextSearch_SearchCompletedHandler;
  52. SearchResult.SelectionChanged += SearchResult_SelectionChanged;
  53. }
  54. /// <summary>
  55. /// 清除搜索
  56. /// </summary>
  57. private void SearchInput_ClearEvent(object sender, EventArgs e)
  58. {
  59. SearchResult?.SetSearchResult(null);
  60. }
  61. /// <summary>
  62. ///高亮上一个搜索结果
  63. /// </summary>
  64. private void SearchInput_FindPreviousEvent(object sender, EventArgs e)
  65. {
  66. if (currentHighLightIndex > 0)
  67. {
  68. currentHighLightIndex--;
  69. BindSearchResult result = SearchResult.GetItem(currentHighLightIndex);
  70. HighLightSelectResult(result);
  71. }
  72. }
  73. /// <summary>
  74. /// 高亮下一个搜索结果
  75. /// </summary>
  76. private void SearchInput_FindNextEvent(object sender, EventArgs e)
  77. {
  78. currentHighLightIndex++;
  79. if (currentHighLightIndex >= 0)
  80. {
  81. BindSearchResult result = SearchResult.GetItem(currentHighLightIndex);
  82. HighLightSelectResult(result);
  83. }
  84. }
  85. /// <summary>
  86. /// 高亮选中搜索结果
  87. /// </summary>
  88. private void SearchResult_SelectionChanged(object sender, int e)
  89. {
  90. currentHighLightIndex = e;
  91. BindSearchResult result = SearchResult.GetSelectItem();
  92. HighLightSelectResult(result);
  93. }
  94. /// <summary>
  95. /// 搜索完成绑定数据
  96. /// </summary>
  97. private void TextSearch_SearchCompletedHandler(object sender, TextSearchResult e)
  98. {
  99. Dispatcher.Invoke(() =>
  100. {
  101. List<BindSearchResult> resultList = new List<BindSearchResult>();
  102. foreach (int pageIndex in e.Items.Keys)
  103. {
  104. List<TextSearchItem> textSearchItems = e.Items[pageIndex];
  105. foreach (TextSearchItem item in textSearchItems)
  106. {
  107. resultList.Add(new BindSearchResult()
  108. {
  109. PageIndex = item.PageIndex,
  110. TextContent = item.TextContent,
  111. TextRect = item.TextRect,
  112. SearchWord = keyWord,
  113. HighLightColor = Color.FromArgb(0x99, 0xFF, 0xF7, 0x00),
  114. PageRotate = item.PageRotate
  115. });
  116. }
  117. }
  118. SearchResult.SetSearchResult(resultList);
  119. });
  120. }
  121. /// <summary>
  122. /// 搜索执行事件
  123. /// </summary>
  124. private void SearchInput_SearchEvent(object sender, string e)
  125. {
  126. if (string.IsNullOrEmpty(e))
  127. {
  128. return;
  129. }
  130. if (pdfView == null || pdfView.Document == null)
  131. {
  132. return;
  133. }
  134. if (textSearch != null && textSearch.CanDoSearch)
  135. {
  136. keyWord = e;
  137. textSearch.TextSearchDocument = pdfView.Document;
  138. textSearch.SearchText(e, C_Search_Options.Search_Case_Insensitive);
  139. }
  140. }
  141. /// <summary>
  142. /// 高亮搜索结果
  143. /// </summary>
  144. private void HighLightSelectResult(BindSearchResult result)
  145. {
  146. if (result == null)
  147. {
  148. return;
  149. }
  150. List<TextSearchItem> selectList = new List<TextSearchItem>();
  151. selectList.Add(new TextSearchItem()
  152. {
  153. PageIndex = result.PageIndex,
  154. TextRect = result.TextRect,
  155. TextContent = result.TextContent,
  156. PageRotate = result.PageRotate,
  157. });
  158. pdfView.SetPageSelectText(selectList, highLightBrush);
  159. }
  160. }
  161. }