CPDFSearchControl.xaml.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. using ComPDFKit.PDFPage;
  2. using Compdfkit_Tools.PDFControlUI;
  3. using ComPDFKitViewer.PdfViewer;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Windows;
  7. using System.Windows.Controls;
  8. using System.Windows.Media;
  9. namespace Compdfkit_Tools.PDFControl
  10. {
  11. public partial class CPDFSearchControl : UserControl
  12. {
  13. /// <summary>
  14. /// PDFViewer
  15. /// </summary>
  16. private CPDFViewer pdfView;
  17. private int currentHighLightIndex { get; set; } = -1;
  18. private PDFTextSearch textSearch;
  19. private string keyWord;
  20. private SolidColorBrush highLightBrush = new SolidColorBrush(Color.FromArgb(0x99, 0xFF, 0xF7, 0x00));
  21. private int ResultCount = 0;
  22. public CPDFSearchControl()
  23. {
  24. InitializeComponent();
  25. Loaded += PDFSearch_Loaded;
  26. }
  27. public void InitWithPDFViewer(CPDFViewer newPDFView)
  28. {
  29. if(pdfView!=newPDFView)
  30. {
  31. ClearSearchResult();
  32. pdfView = newPDFView;
  33. }
  34. }
  35. private void PDFSearch_Loaded(object sender, RoutedEventArgs e)
  36. {
  37. textSearch = new PDFTextSearch();
  38. SearchInput.SearchEvent += SearchInput_SearchEvent;
  39. SearchInput.ClearEvent += SearchInput_ClearEvent;
  40. textSearch.SearchCompletedHandler += TextSearch_SearchCompletedHandler;
  41. SearchResult.SelectionChanged += SearchResult_SelectionChanged;
  42. }
  43. private void SearchInput_ClearEvent(object sender, EventArgs e)
  44. {
  45. ClearSearchResult();
  46. }
  47. private void SearchInput_FindPreviousEvent(object sender, EventArgs e)
  48. {
  49. if (currentHighLightIndex > 0)
  50. {
  51. currentHighLightIndex--;
  52. BindSearchResult result = SearchResult.GetItem(currentHighLightIndex);
  53. HighLightSelectResult(result);
  54. }
  55. }
  56. private void SearchInput_FindNextEvent(object sender, EventArgs e)
  57. {
  58. currentHighLightIndex++;
  59. if (currentHighLightIndex >= 0)
  60. {
  61. BindSearchResult result = SearchResult.GetItem(currentHighLightIndex);
  62. HighLightSelectResult(result);
  63. }
  64. }
  65. private void SearchResult_SelectionChanged(object sender, int e)
  66. {
  67. currentHighLightIndex = e;
  68. BindSearchResult result = SearchResult.GetSelectItem();
  69. HighLightSelectResult(result);
  70. ResultText.Text = string.Format("Results:{0}/{1}", e+1,ResultCount);
  71. }
  72. private void TextSearch_SearchCompletedHandler(object sender, TextSearchResult e)
  73. {
  74. Dispatcher.Invoke(() =>
  75. {
  76. List<BindSearchResult> resultList = new List<BindSearchResult>();
  77. foreach (int pageIndex in e.Items.Keys)
  78. {
  79. List<TextSearchItem> textSearchItems = e.Items[pageIndex];
  80. foreach (TextSearchItem item in textSearchItems)
  81. {
  82. resultList.Add(new BindSearchResult()
  83. {
  84. PageIndex = item.PageIndex,
  85. TextContent = item.TextContent,
  86. TextRect = item.TextRect,
  87. SearchWord = keyWord,
  88. HighLightColor = Color.FromArgb(0x99, 0xFF, 0xF7, 0x00),
  89. PageRotate = item.PageRotate
  90. });
  91. }
  92. }
  93. SearchResult.SetSearchResult(resultList);
  94. ResultCount=resultList.Count;
  95. if (resultList==null || resultList.Count==0)
  96. {
  97. ResultText.Text= string.Empty;
  98. }
  99. else
  100. {
  101. ResultText.Text = string.Format("{0} results found", ResultCount);
  102. }
  103. });
  104. }
  105. private void SearchInput_SearchEvent(object sender, string e)
  106. {
  107. if (string.IsNullOrEmpty(e))
  108. {
  109. return;
  110. }
  111. if (pdfView == null || pdfView.Document == null)
  112. {
  113. return;
  114. }
  115. if (textSearch != null && textSearch.CanDoSearch)
  116. {
  117. keyWord = e;
  118. textSearch.TextSearchDocument = pdfView.Document;
  119. textSearch.SearchText(e, C_Search_Options.Search_Case_Insensitive);
  120. }
  121. }
  122. private void HighLightSelectResult(BindSearchResult result)
  123. {
  124. if (result == null)
  125. {
  126. return;
  127. }
  128. List<TextSearchItem> selectList = new List<TextSearchItem>();
  129. selectList.Add(new TextSearchItem()
  130. {
  131. PageIndex = result.PageIndex,
  132. TextRect = result.TextRect,
  133. TextContent = result.TextContent,
  134. PageRotate = result.PageRotate,
  135. });
  136. pdfView.SetPageSelectText(selectList, highLightBrush);
  137. }
  138. private void ClearSearchResult()
  139. {
  140. SearchResult?.SetSearchResult(null);
  141. ResultText.Text = string.Empty;
  142. SearchInput.SearchKeyWord=string.Empty;
  143. }
  144. }
  145. }