프로젝트

일반

사용자정보

통계
| 브랜치(Branch): | 개정판:

markus / KCOM / Controls / SearchPanel.xaml.cs @ 95c73392

이력 | 보기 | 이력해설 | 다운로드 (16.9 KB)

1
using KCOM.Common;
2
using MarkupToPDF.Common;
3
using System;
4
using System.Collections.Generic;
5
using System.ComponentModel;
6
using System.Diagnostics;
7
using System.Linq;
8
using System.Text;
9
using System.Threading;
10
using System.Threading.Tasks;
11
using System.Windows;
12
using System.Windows.Controls;
13
using System.Windows.Data;
14
using System.Windows.Documents;
15
using System.Windows.Input;
16
using System.Windows.Media;
17
using System.Windows.Media.Imaging;
18
using System.Windows.Navigation;
19
using System.Windows.Shapes;
20
using Telerik.Windows.Controls;
21

    
22
namespace KCOM.Controls
23
{
24
    public class SearchText
25
    {
26
        public Bytescout.PDFExtractor.ISearchResult searchResult { get; set; }
27
        public int PageNo { get; set; }
28
    }
29
    /// <summary>
30
    /// Interaction logic for SearchPanel.xaml
31
    /// </summary>
32
    public partial class SearchPanel : UserControl
33
    {
34
        //List<HoneyheadTEXT> txtSet = new List<HoneyheadTEXT>();
35
        public System.Collections.ObjectModel.ObservableCollection<SearchText> SearchSet { get; set; }
36
        string RegistrationKey = "193B-FD48-42F4-68E6-2D35-4C94-D07";
37
        string RegistrationName = "license@doftech.co.kr";
38
        Bytescout.PDFExtractor.TextExtractor extractor;
39
        //Bytescout.PDFExtractor.OCRAnalyzer ocrAnalyzer;
40
        private BackgroundWorker worker = new BackgroundWorker();
41
        private bool IsCancelWork = false;
42

    
43
        public SearchPanel()
44
        {
45
            App.splashString(ISplashMessage.SEARCHPANEL);
46
            InitializeComponent();
47
            LibInit();
48
            //this.Loaded += SearchPanel_Loaded;
49
            btnSearch.Click += BtnSearch_Click;
50
            btnSearchPDFDownload.Click += BtnSearchPDFDownload_Click;
51
            SearchSet = new System.Collections.ObjectModel.ObservableCollection<SearchText>();
52

    
53
            tbSearch.KeyDown += tbSearch_KeyDown;
54

    
55
            worker.DoWork += Worker_DoWork;
56
            worker.RunWorkerCompleted += Worker_RunWorkerCompleted;
57

    
58
            this.DataContext = this;
59
            /*
60
            if (Common.ViewerDataModel.Instance.searchPDF ==null)
61
            {
62

    
63
            }
64
            else
65
            {
66
                border_Overlap.Visibility = Visibility.Collapsed;
67
                tbSearch.Focus();
68
                
69
            }
70
            */
71

    
72
            if (ViewerDataModel.Instance.IsDownloadOriginal)
73
            {
74
                SetSerachPDFFile(ViewerDataModel.Instance.OriginalTempFile);
75
            }
76
        }
77

    
78
        private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
79
        {
80
            Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(delegate
81
            {
82
                btnSearch.Content = "Search";
83
                IsCancelWork = false;
84

    
85
                this.searchIndicator.IsIndeterminate = false;
86
                this.DataContext = this;
87
                //tbSearch.Text = "";
88
                tbSearch.Focus();
89

    
90
                txtSearchMsg.Text = "search has completed.";
91
            }));
92
        }
93
        //private System.Collections.ObjectModel.ObservableCollection<SearchText> searchTexts = null;
94
        private void Worker_DoWork(object sender, DoWorkEventArgs e)
95
        {
96
            string searchString = string.Empty;
97
            bool pageoption = false;
98

    
99
            Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(delegate
100
            {
101
                SearchSet.Clear();
102
                searchString = tbSearch.Text;
103
                pageoption = chkCurrentPageOnly.IsChecked.Value;
104
            }));
105

    
106
            extractor.LoadDocumentFromFile(Common.ViewerDataModel.Instance.searchPDF.FullName);
107
            extractor.RegexSearch = true;
108

    
109
            //ocrAnalyzer.LoadDocumentFromFile(Common.ViewerDataModel.Instance.searchPDF.FullName);
110

    
111
            if (pageoption)
112
            {
113
                var currentPage = Common.ViewerDataModel.Instance.SystemMain.dzMainMenu.pageNavigator.CurrentPage.PageNumber - 1;
114

    
115
                //Bytescout.PDFExtractor.OCRAnalysisResults analysisResults = ocrAnalyzer.AnalyzeByOCRConfidence(currentPage);
116
                //ocrAnalyzer.ApplyResults(analysisResults, extractor);
117

    
118
                if (extractor.Find(currentPage, searchString, false))
119
                    do
120
                    {
121
                        Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(delegate
122
                        {
123
                            SearchSet.Add(new SearchText { PageNo = currentPage + 1, searchResult = extractor.FoundText });
124
                        }));
125
                    }
126
                    while (extractor.FindNext());
127
            }
128
            else
129
            {
130
                int pageCount = extractor.GetPageCount();
131

    
132
                for (int i = 0; i < pageCount; i++)
133
                {
134
                    txtSearchMsg.Dispatcher.Invoke(()=> txtSearchMsg.Text = $"Search Pages {i + 1}/{pageCount}");
135

    
136
                    //Bytescout.PDFExtractor.OCRAnalysisResults analysisResults = ocrAnalyzer.AnalyzeByOCRConfidence(i);
137
                    //ocrAnalyzer.ApplyResults(analysisResults, extractor);
138
                    if (extractor.Find(i, searchString, false))
139
                        do
140
                        {
141
                            Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(delegate
142
                            {
143
                                SearchSet.Add(new SearchText { PageNo = i + 1, searchResult = extractor.FoundText });
144
                            }));
145

    
146
                            if(IsCancelWork)
147
                            {
148
                                break;
149
                            }
150
                        }
151
                        while (extractor.FindNext());
152

    
153
                    if (IsCancelWork)
154
                    {
155
                        break;
156
                    }
157
                }
158
            }
159
        }
160

    
161
        private void tbSearch_KeyDown(object sender, KeyEventArgs e)
162
        {
163
            if (e.Key == Key.Enter)
164
            {
165
                SearchMethod();
166
            }
167
        }
168
        private void LibInit()
169
        {
170
            try
171
            {
172
                extractor = new Bytescout.PDFExtractor.TextExtractor(RegistrationName, RegistrationKey);
173
                //ocrAnalyzer = new Bytescout.PDFExtractor.OCRAnalyzer(RegistrationName, RegistrationKey);
174
                extractor.OCRMode = Bytescout.PDFExtractor.OCRMode.Off;
175
                //extractor.OCRLanguage = "eng";
176
                //extractor.OCRLanguageDataFolder = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "tessdata");
177

    
178
                extractor.OCRResolution = 300;
179

    
180
                //ocrAnalyzer.OCRLanguage = "eng";
181
                //ocrAnalyzer.OCRLanguageDataFolder = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "tessdata");
182

    
183
            }
184
            catch (Exception ex)
185
            {
186
                //Logger.sendResLog("LibInit", ex.Message, 0);
187
            }
188

    
189
        }
190

    
191
        private void SearchPanel_Loaded(object sender, RoutedEventArgs e)
192
        {
193
            ////
194
            /// 이벤트 안 들어옴
195

    
196

    
197
            //측정
198
            //Stopwatch sw = new Stopwatch();
199
            //sw.Start();
200
            InitializeComponent();
201
            //System.Diagnostics.Debug.WriteLine("SearchPanel() : " + sw.ElapsedMilliseconds.ToString() + "ms");
202

    
203
            btnSearch.Click += BtnSearch_Click;
204
            btnSearchPDFDownload.Click += BtnSearchPDFDownload_Click;
205
            SearchSet = new System.Collections.ObjectModel.ObservableCollection<SearchText>();
206
            extractor = new Bytescout.PDFExtractor.TextExtractor(RegistrationName, RegistrationKey);
207
            tbSearch.KeyDown += tbSearch_KeyDown;
208

    
209
            this.DataContext = this;
210

    
211
        }
212

    
213
        private void BtnSearchPDFDownload_Click(object sender, RoutedEventArgs e)
214
        {
215
            try
216
            {
217
                Common.ViewerDataModel.Instance.IsDownloadCancel = true;
218

    
219

    
220
                using (System.Net.WebClient client = new System.Net.WebClient())
221
                {
222
                    string instnaceFile = System.IO.Path.GetTempFileName().Replace(".pdf", ".tmp");
223
                    client.DownloadFileCompleted += Client_DownloadFileCompleted;
224
                    client.DownloadProgressChanged += Client_DownloadProgressChanged;
225
                    string downloadurl = Common.ViewerDataModel.Instance.SystemMain.dzMainMenu.GetOriginalPDFURL();
226

    
227
                    client.DownloadFileAsync(new Uri(downloadurl), instnaceFile);
228
                }
229
            }
230
            catch (Exception ex)
231
            {
232
                //Logger.sendResLog("DownloadOriginalFileAsync", ex.Message, 0);
233
            }
234
        }
235

    
236

    
237
        private void Client_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
238
        {
239
            SetSerachPDFFile(e.UserState.ToString());
240
        }
241

    
242
        public void SetSerachPDFFile(string FileFullPath)
243
        {
244
            border_Overlap.Visibility = Visibility.Collapsed;
245
            Common.ViewerDataModel.Instance.searchPDF = new System.IO.FileInfo(FileFullPath);
246
            //OcrAnalyzer();
247

    
248
            tbSearch.Focus();
249
        }
250

    
251
        //private void OcrAnalyzer()
252
        //{
253
        //    System.Drawing.RectangleF rectangle = System.Drawing.RectangleF.Empty;
254

    
255
        //    // Display analysis progress
256
        //    ocrAnalyzer.ProgressChanged += (object sender, string message, double progress, ref bool cancel)=>
257
        //    {
258
        //        System.Diagnostics.Debug.WriteLine(message);
259
        //    };
260

    
261
        //    // Load document to OCRAnalyzer
262
        //    ocrAnalyzer.LoadDocumentFromFile(Common.ViewerDataModel.Instance.searchPDF.FullName);
263

    
264
        //    // Set page area for analysis (optional)
265
        //    ocrAnalyzer.SetExtractionArea(rectangle);
266

    
267
        //    // Perform analysis and get results
268
        //    Bytescout.PDFExtractor.OCRAnalysisResults analysisResults = ocrAnalyzer.AnalyzeByOCRConfidence(0);
269

    
270
        //    // Now extract the text using detected OCR parameters
271

    
272
        //    string outputDocument = @".\result.txt";
273

    
274
        //    // Create TextExtractor instance
275

    
276
        //    // Load document to TextExtractor
277
        //    extractor.LoadDocumentFromFile(Common.ViewerDataModel.Instance.searchPDF.FullName);
278

    
279
        //    // Setup TextExtractor
280
        //    extractor.OCRMode = Bytescout.PDFExtractor.OCRMode.TextFromImagesAndVectorsAndFonts;
281
        //    extractor.OCRLanguageDataFolder = ocrAnalyzer.OCRLanguageDataFolder;
282
        //    extractor.OCRLanguage = ocrAnalyzer.OCRLanguage;
283

    
284
        //        // Apply analysys results to TextExtractor instance
285
        //    ocrAnalyzer.ApplyResults(analysisResults, extractor);
286

    
287
        //    // Set extraction area (optional)
288
        //    extractor.SetExtractionArea(rectangle);
289

    
290
        //    // Save extracted text to file
291
        //    extractor.SaveTextToFile(outputDocument);
292

    
293
        //}
294

    
295
        private void Client_DownloadProgressChanged(object sender, System.Net.DownloadProgressChangedEventArgs e)
296
        {
297
            tlDonwloadState.Text = "문서를 다운로드 중입니다 : " + e.ProgressPercentage;
298

    
299
        }
300

    
301
        private void BtnSearch_Click(object sender, RoutedEventArgs e)
302
        {
303
            SearchMethod();
304
        }
305

    
306
        private void SearchMethod()
307
        {
308
            string _strCancel = "Cancel";  // 나중에 정리 
309

    
310
            try
311
            {
312
                if (btnSearch.Content.ToString() == _strCancel)
313
                {
314
                    IsCancelWork = true;
315
                    worker.CancelAsync();
316
                }
317

    
318
                if (!worker.IsBusy)
319
                {
320
                    SearchSet.Clear();
321

    
322
                    this.searchIndicator.IsIndeterminate = true;
323
                    btnSearch.Content = _strCancel;
324

    
325
                    worker.RunWorkerAsync();
326
                }
327
            }
328
            catch (Exception ex)
329
            {
330
                //Logger.sendResLog("SearchMethod", ex.Message, 0);
331
            }
332

    
333
        }
334
        private void DialogMessage_Alert(string Msg)
335
        {
336
            RadWindow CheckPop = new RadWindow();
337
            Alert check = new Alert(Msg);
338

    
339
            CheckPop = new RadWindow
340
            {
341
                Owner = Application.Current.MainWindow,
342
                MinWidth = 400,
343
                MinHeight = 100,
344
                //Closed = (obj, args) => this.MarkupNamePromptClose(MarkupData, args),
345
                Header = "Alert",
346
                Content = check,
347
                ResizeMode = System.Windows.ResizeMode.NoResize,
348
                WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen,
349
                IsTopmost = true,
350
            };
351
            StyleManager.SetTheme(CheckPop, new Office2013Theme());
352
            CheckPop.ShowDialog();
353
        }
354
        private void chkSelectionChangeEvent(object sender, RoutedEventArgs e)
355
        {
356
            try
357
            {
358
                if (Common.ViewerDataModel.Instance.searchPDF != null)
359
                {
360
                    if (sender is RadioButton)
361
                    {
362
                        switch ((sender as RadioButton).Tag.ToString())
363
                        {
364
                            case "0":
365
                                extractor.WordMatchingMode = Bytescout.PDFExtractor.WordMatchingMode.None;
366
                                break;
367
                            case "1":
368
                                extractor.WordMatchingMode = Bytescout.PDFExtractor.WordMatchingMode.ExactMatch;
369
                                break;
370
                            case "2":
371
                                extractor.WordMatchingMode = Bytescout.PDFExtractor.WordMatchingMode.SmartMatch;
372
                                break;
373
                            default:
374
                                break;
375
                        }
376
                    }
377
                }
378
            }
379
            catch (Exception ex)
380
            {
381
                //Logger.sendResLog("chkSelectionChangeEvent", ex.Message, 0);
382
            }
383

    
384
        }
385

    
386
        private void lstSearchWord_SelectionChanged(object sender, SelectionChangedEventArgs e)
387
        {
388
            try
389
            {
390
                if (e.AddedItems.Count > 0)
391
                {
392
                    SearchText item = (e.AddedItems[0] as SearchText);
393

    
394
                    if (Common.ViewerDataModel.Instance.SystemMain.dzMainMenu.pageNavigator.CurrentPage.PageNumber == item.PageNo)
395
                    {
396
                        GotoPosition(item);
397
                    }
398
                    else
399
                    {
400
                        var pageNavigator = Common.ViewerDataModel.Instance.SystemMain.dzMainMenu.pageNavigator;
401

    
402
                        EventHandler<EventArgs> handler = null;
403

    
404
                        handler = (snd, evt) =>
405
                        {
406
                            GotoPosition(item);
407
                            ViewerDataModel.Instance.PageLoaded -= handler;
408
                        };
409

    
410
                        ViewerDataModel.Instance.PageLoaded += handler;
411
                        pageNavigator.GotoPage(item.PageNo);
412

    
413
                    }
414
                }
415
            }
416
            catch (Exception ex)
417
            {
418
                //Logger.sendResLog("lstSearchWord_SelectionChanged", ex.Message, 0);
419
            }
420

    
421
        }
422

    
423
        private void GotoPosition(SearchText item)
424
        {
425
            Common.ViewerDataModel.Instance.SystemMain.dzMainMenu.Dispatcher.Invoke(() => {
426

    
427
                for (int i = 0; i < (Common.ViewerDataModel.Instance.MarkupAngle / 90); i++)
428
                {
429
                    Common.ViewerDataModel.Instance.SystemMain.dzTopMenu.drawingPannelRotate(true);
430
                }
431

    
432
                var width = Convert.ToDouble(Common.ViewerDataModel.Instance.Document_Info[item.PageNo - 1].PAGE_WIDTH);
433
                var height = Convert.ToDouble(Common.ViewerDataModel.Instance.Document_Info[item.PageNo - 1].PAGE_HEIGHT);
434
                var widthScale = width / Convert.ToDouble(extractor.GetPageRect_Width(item.PageNo - 1));
435
                var heightScale = height / Convert.ToDouble(extractor.GetPageRect_Height(item.PageNo - 1));
436

    
437
                var searchFocus = Common.ViewerDataModel.Instance.SystemMain.dzMainMenu.SearchFocusBorder;
438
                searchFocus.Visibility = Visibility;
439

    
440
                Canvas.SetLeft(searchFocus, item.searchResult.Left * widthScale);
441
                Canvas.SetTop(searchFocus, item.searchResult.Top * heightScale);
442
                searchFocus.Width = item.searchResult.Width * widthScale;
443
                searchFocus.Height = item.searchResult.Height * widthScale;
444

    
445
                Common.ViewerDataModel.Instance.SystemMain.dzMainMenu.zoomAndPanControl.ZoomTo(new Rect
446
                {
447
                    X =item.searchResult.Left * widthScale,
448
                    Y = item.searchResult.Top * heightScale,
449
                    Width = ( item.searchResult.Width * widthScale *7),
450
                    Height = (item.searchResult.Height * heightScale *7)
451
                });
452
            });
453
        }
454
    }
455
}
클립보드 이미지 추가 (최대 크기: 500 MB)