ScanViwerViewModel.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634
  1. using ComDocumentAIKit;
  2. using ComPDFKit.PDFDocument;
  3. using ComPDFKit.PDFPage;
  4. using ComPDFKitViewer;
  5. using ComPDFKitViewer.PdfViewer;
  6. using PDF_Office.EventAggregators;
  7. using PDF_Office.Helper;
  8. using PDF_Office.Model;
  9. using Prism.Commands;
  10. using Prism.Events;
  11. using Prism.Mvvm;
  12. using Prism.Regions;
  13. using System;
  14. using System.Collections.Generic;
  15. using System.IO;
  16. using System.Linq;
  17. using System.Text;
  18. using System.Threading.Tasks;
  19. using System.Windows;
  20. using System.Windows.Media;
  21. using System.Windows.Media.Imaging;
  22. using System.Windows.Threading;
  23. namespace PDF_Office.ViewModels.Scan
  24. {
  25. class ScanViwerViewModel : BindableBase, INavigationAware
  26. {
  27. private CPDFViewer PDFViewer;
  28. private ViewContentViewModel viewContentViewModel;
  29. private WriteableBitmap bgImage;
  30. public WriteableBitmap BgImage
  31. {
  32. get { return bgImage; }
  33. set
  34. {
  35. SetProperty(ref bgImage, value);
  36. }
  37. }
  38. private List<KeyValuePair<Rect, string>> textRectList;
  39. public List<KeyValuePair<Rect, string>> TextRectList
  40. {
  41. get { return textRectList; }
  42. set
  43. {
  44. SetProperty(ref textRectList, value);
  45. }
  46. }
  47. private bool isEnhanced;
  48. /// <summary>
  49. /// 当前是否为增强扫描状态
  50. /// </summary>
  51. public bool IsEnhanced
  52. {
  53. get { return isEnhanced; }
  54. set
  55. {
  56. SetProperty(ref isEnhanced, value);
  57. }
  58. }
  59. private bool isShowRect;
  60. public bool IsShowRect
  61. {
  62. get { return isShowRect; }
  63. set
  64. {
  65. SetProperty(ref isShowRect, value);
  66. }
  67. }
  68. private COCRLanguage language = COCRLanguage.English;
  69. /// <summary>
  70. /// 增强扫描结果路径
  71. /// </summary>
  72. public List<string> EnhancedFilePathList;
  73. /// <summary>
  74. /// OCR结果路径
  75. /// </summary>
  76. private Dictionary<int, List<KeyValuePair<Rect, string>>> cacahe;
  77. private Visibility showTooltip = Visibility.Collapsed;
  78. public Visibility ShowTooltip
  79. {
  80. get { return showTooltip; }
  81. set
  82. {
  83. SetProperty(ref showTooltip, value);
  84. }
  85. }
  86. public DelegateCommand CloseTooltipCommand { get; set; }
  87. public DelegateCommand CancelEnhancedCommand { get; set; }
  88. public bool IsNavigationTarget(NavigationContext navigationContext)
  89. {
  90. return true;
  91. }
  92. public void OnNavigatedFrom(NavigationContext navigationContext)
  93. {
  94. return;
  95. }
  96. public void OnNavigatedTo(NavigationContext navigationContext)
  97. {
  98. navigationContext.Parameters.TryGetValue<ViewContentViewModel>(ParameterNames.ViewContentViewModel, out viewContentViewModel);
  99. if (viewContentViewModel == null)
  100. {
  101. return;
  102. }
  103. navigationContext.Parameters.TryGetValue<CPDFViewer>(ParameterNames.PDFViewer, out PDFViewer);
  104. if (PDFViewer == null)
  105. {
  106. return;
  107. }
  108. else
  109. {
  110. PDFViewer.InfoChanged += PDFViewer_InfoChanged;
  111. PDFViewer.ChangeViewMode(ViewMode.Single);
  112. //第一次进入获取当前预览显示内容
  113. CPDFPage pdfPage = PDFViewer.Document.PageAtIndex(PDFViewer.CurrentIndex);
  114. float zoom = (float)(DpiHelpers.Dpi / 72D);
  115. int renderWidth = (int)(pdfPage.PageSize.Width * zoom);
  116. int renderHeight = (int)(pdfPage.PageSize.Height * zoom);
  117. byte[] renderData = new byte[renderWidth * renderHeight * 4];
  118. pdfPage.RenderPageBitmapWithMatrix(zoom, new Rect(0, 0, renderWidth, renderHeight), 0xFFFFFFFF, renderData, 0);
  119. BgImage = new WriteableBitmap(renderWidth, renderHeight, DpiHelpers.Dpi, DpiHelpers.Dpi, PixelFormats.Bgra32, null);
  120. BgImage.WritePixels(new Int32Rect(0, 0, renderWidth, renderHeight), renderData, BgImage.BackBufferStride, 0);
  121. }
  122. }
  123. private void PDFViewer_InfoChanged(object sender, KeyValuePair<string, object> e)
  124. {
  125. if (e.Key == "PageNum")
  126. {
  127. RenderData renderData = e.Value as RenderData;
  128. if (renderData != null)
  129. {
  130. if (IsEnhanced)
  131. {
  132. BitmapImage image = new BitmapImage(new Uri(EnhancedFilePathList[PDFViewer.CurrentIndex]));
  133. BgImage = new WriteableBitmap(image);
  134. }
  135. else
  136. {
  137. CPDFPage pdfPage = PDFViewer.Document.PageAtIndex(renderData.PageIndex - 1);
  138. float zoom = (float)(DpiHelpers.Dpi / 72D);
  139. int renderWidth = (int)(pdfPage.PageSize.Width * zoom);
  140. int renderHeight = (int)(pdfPage.PageSize.Height * zoom);
  141. byte[] Data = new byte[renderWidth * renderHeight * 4];
  142. pdfPage.RenderPageBitmapWithMatrix(zoom, new Rect(0, 0, renderWidth, renderHeight), 0xFFFFFFFF, Data, 0);
  143. BgImage = new WriteableBitmap(renderWidth, renderHeight, DpiHelpers.Dpi, DpiHelpers.Dpi, PixelFormats.Bgra32, null);
  144. BgImage.WritePixels(new Int32Rect(0, 0, renderWidth, renderHeight), Data, BgImage.BackBufferStride, 0);
  145. }
  146. if (cacahe.Count > 0)
  147. {
  148. if (cacahe.ContainsKey(renderData.PageIndex - 1))
  149. {
  150. TextRectList = cacahe[renderData.PageIndex - 1];
  151. }
  152. else
  153. {
  154. TextRectList = null;
  155. }
  156. }
  157. ClearDraw();
  158. }
  159. }
  160. }
  161. private void ClearDraw()
  162. {
  163. //笨办法,有好方案随时能换,目前是以触发属性改变事件的方式激活清空
  164. IsShowRect = !IsShowRect;
  165. IsShowRect = !IsShowRect;
  166. }
  167. public ScanViwerViewModel(IEventAggregator eventAggregator)
  168. {
  169. CloseTooltipCommand = new DelegateCommand(CloseTooltip);
  170. CancelEnhancedCommand = new DelegateCommand(CancelEnhanced);
  171. EnhancedFilePathList = new List<string>();
  172. eventAggregator.GetEvent<ScanEvent>().Subscribe(ChangeScanMode, e => e.Unicode == App.mainWindowViewModel.SelectedItem.Unicode);
  173. cacahe = new Dictionary<int, List<KeyValuePair<Rect, string>>>();
  174. }
  175. /// <summary>
  176. /// 区域识别
  177. /// </summary>
  178. public void AreaProcess(Rect AreaRect, Rect ImageRect)
  179. {
  180. COCREngine imEngine = new COCREngine(App.modelFolderPath);
  181. string path = App.CachePath.MergeFilePath;
  182. string name = Guid.NewGuid().ToString();
  183. path = Path.Combine(path, name);
  184. Directory.CreateDirectory(path);
  185. CPDFDocument CurrentDoc = PDFViewer.Document;
  186. CErrorCode error = imEngine.SetModel(language);
  187. cacahe.Remove(PDFViewer.CurrentIndex);
  188. string pageImagePath = Path.Combine(path, "Area");
  189. Directory.CreateDirectory(pageImagePath);
  190. pageImagePath = Path.Combine(pageImagePath, PDFViewer.CurrentIndex.ToString());
  191. if (IsEnhanced)
  192. {
  193. BitmapImage image = new BitmapImage(new Uri(EnhancedFilePathList[PDFViewer.CurrentIndex]));
  194. BgImage = new WriteableBitmap(image);
  195. double zoomWidth = AreaRect.Width / ImageRect.Width;
  196. double zoomHeight = AreaRect.Height / ImageRect.Height;
  197. double zoomX = (AreaRect.X - ImageRect.X) / ImageRect.Width;
  198. double zoomY = (AreaRect.Y - ImageRect.Y) / ImageRect.Height;
  199. Int32Rect rect = new Int32Rect((int)(BgImage.Width*zoomX), (int)(BgImage.Height*zoomY), (int)(BgImage.Width*zoomWidth), (int)(BgImage.Height*zoomHeight));
  200. byte[] renderData = new byte[(int)(BgImage.Width * BgImage.Height * 4)];
  201. BgImage.CopyPixels(rect, renderData, BgImage.BackBufferStride, 0);
  202. WriteableBitmap bitmap = new WriteableBitmap(rect.Width, rect.Height, DpiHelpers.Dpi, DpiHelpers.Dpi, PixelFormats.Bgra32, null);
  203. bitmap.WritePixels(new Int32Rect(0, 0, rect.Width, rect.Height), renderData, BgImage.BackBufferStride, 0);
  204. BitmapEncoder encoder = new PngBitmapEncoder();
  205. encoder.Frames.Add(BitmapFrame.Create(bitmap));
  206. using (FileStream imageStream = File.Create(pageImagePath))
  207. {
  208. encoder.Save(imageStream);
  209. imageStream.Flush();
  210. }
  211. error = imEngine.Process(pageImagePath);
  212. if (imEngine.OCRResultList == null)
  213. return;
  214. List<KeyValuePair<Rect, string>> RectList = new List<KeyValuePair<Rect, string>>();
  215. foreach (COCRResult ocrResult in imEngine.OCRResultList)
  216. {
  217. List<Point> rectPoints = new List<Point>();
  218. for (int j = 0; j < ocrResult.position.Length; j += 2)
  219. {
  220. rectPoints.Add(new Point(ocrResult.position[j], ocrResult.position[j + 1]));
  221. }
  222. int left = (int)rectPoints.AsEnumerable().Min(x => x.X);
  223. int right = (int)rectPoints.AsEnumerable().Max(x => x.X);
  224. int top = (int)rectPoints.AsEnumerable().Min(x => x.Y);
  225. int bottom = (int)rectPoints.AsEnumerable().Max(x => x.Y);
  226. RectList.Add(new KeyValuePair<Rect, string>(new Rect(left + BgImage.Width * zoomX, top + BgImage.Height * zoomY, right - left, bottom - top), ocrResult.text));
  227. }
  228. cacahe.Add(PDFViewer.CurrentIndex, RectList);
  229. if (cacahe.Count > 0)
  230. {
  231. if (cacahe.ContainsKey(PDFViewer.CurrentIndex))
  232. {
  233. TextRectList = cacahe[PDFViewer.CurrentIndex];
  234. }
  235. else
  236. {
  237. TextRectList = null;
  238. }
  239. }
  240. }
  241. else
  242. {
  243. CPDFPage pdfPage = CurrentDoc.PageAtIndex(PDFViewer.CurrentIndex);
  244. double zoomWidth = AreaRect.Width / ImageRect.Width;
  245. double zoomHeight = AreaRect.Height / ImageRect.Height;
  246. double zoomX = (AreaRect.X- ImageRect.X) / ImageRect.Width;
  247. double zoomY = (AreaRect.Y- ImageRect.Y) / ImageRect.Height;
  248. float zoom = (float)(DpiHelpers.Dpi / 72D);
  249. int renderWidth = (int)(pdfPage.PageSize.Width* zoomWidth * zoom);
  250. int renderHeight = (int)(pdfPage.PageSize.Height* zoomHeight * zoom);
  251. int renderX = (int)(pdfPage.PageSize.Width* zoomX * zoom);
  252. int renderY = (int)(pdfPage.PageSize.Height* zoomY * zoom);
  253. byte[] renderData = new byte[renderWidth * renderHeight * 4];
  254. pdfPage.RenderPageBitmapWithMatrix(zoom, new Rect(renderX, renderY, renderWidth, renderHeight), 0xFFFFFFFF, renderData, 0);
  255. WriteableBitmap bitmap = new WriteableBitmap(renderWidth, renderHeight, DpiHelpers.Dpi, DpiHelpers.Dpi, PixelFormats.Bgra32, null);
  256. bitmap.WritePixels(new Int32Rect(0, 0, renderWidth, renderHeight), renderData, bitmap.BackBufferStride, 0);
  257. BitmapEncoder encoder = new PngBitmapEncoder();
  258. encoder.Frames.Add(BitmapFrame.Create(bitmap));
  259. using (FileStream imageStream = File.Create(pageImagePath))
  260. {
  261. encoder.Save(imageStream);
  262. imageStream.Flush();
  263. }
  264. error = imEngine.Process(pageImagePath);
  265. if (imEngine.OCRResultList == null)
  266. return;
  267. List<KeyValuePair<Rect, string>> RectList = new List<KeyValuePair<Rect, string>>();
  268. foreach (COCRResult ocrResult in imEngine.OCRResultList)
  269. {
  270. List<Point> rectPoints = new List<Point>();
  271. for (int j = 0; j < ocrResult.position.Length; j += 2)
  272. {
  273. rectPoints.Add(new Point(ocrResult.position[j], ocrResult.position[j + 1]));
  274. }
  275. int left = (int)rectPoints.AsEnumerable().Min(x => x.X);
  276. int right = (int)rectPoints.AsEnumerable().Max(x => x.X);
  277. int top = (int)rectPoints.AsEnumerable().Min(x => x.Y);
  278. int bottom = (int)rectPoints.AsEnumerable().Max(x => x.Y);
  279. RectList.Add(new KeyValuePair<Rect, string>(new Rect(left+ renderX, top+ renderY, right - left, bottom - top), ocrResult.text));
  280. }
  281. cacahe.Add(PDFViewer.CurrentIndex, RectList);
  282. if (cacahe.Count > 0)
  283. {
  284. if (cacahe.ContainsKey(PDFViewer.CurrentIndex))
  285. {
  286. TextRectList = cacahe[PDFViewer.CurrentIndex];
  287. }
  288. else
  289. {
  290. TextRectList = null;
  291. }
  292. }
  293. }
  294. ClearDraw();
  295. }
  296. private void CancelEnhanced()
  297. {
  298. ShowTooltip = Visibility.Collapsed;
  299. IsEnhanced = false;
  300. CPDFPage pdfPage = PDFViewer.Document.PageAtIndex(PDFViewer.CurrentIndex);
  301. float zoom = (float)(DpiHelpers.Dpi / 72D);
  302. int renderWidth = (int)(pdfPage.PageSize.Width * zoom);
  303. int renderHeight = (int)(pdfPage.PageSize.Height * zoom);
  304. byte[] Data = new byte[renderWidth * renderHeight * 4];
  305. pdfPage.RenderPageBitmapWithMatrix(zoom, new Rect(0, 0, renderWidth, renderHeight), 0xFFFFFFFF, Data, 0);
  306. BgImage = new WriteableBitmap(renderWidth, renderHeight, DpiHelpers.Dpi, DpiHelpers.Dpi, PixelFormats.Bgra32, null);
  307. BgImage.WritePixels(new Int32Rect(0, 0, renderWidth, renderHeight), Data, BgImage.BackBufferStride, 0);
  308. if (cacahe.Count > 0)
  309. {
  310. if (cacahe.ContainsKey(PDFViewer.CurrentIndex))
  311. {
  312. TextRectList = cacahe[PDFViewer.CurrentIndex];
  313. }
  314. else
  315. {
  316. TextRectList = null;
  317. }
  318. }
  319. }
  320. private void CloseTooltip()
  321. {
  322. ShowTooltip = Visibility.Collapsed;
  323. }
  324. /// <summary>
  325. /// 根据Vm事件通知处理OCR与区域识别或者增强扫描事件
  326. /// </summary>
  327. /// <param name="e"></param>
  328. private void ChangeScanMode(ScanEventArgs e)
  329. {
  330. IsShowRect = false;
  331. switch (e.Mode)
  332. {
  333. case ScanMode.Unknown:
  334. break;
  335. case ScanMode.Enhanced:
  336. EnhancedProcess(e);
  337. IsEnhanced = true;
  338. break;
  339. case ScanMode.OCR:
  340. if (IsEnhanced)
  341. {
  342. EnhancedOCRProcess(e);
  343. }
  344. else
  345. {
  346. OCRProcess(e);
  347. }
  348. break;
  349. case ScanMode.Area:
  350. language = (COCRLanguage)e.ScanLanguage;
  351. IsShowRect = true;
  352. break;
  353. default:
  354. break;
  355. }
  356. }
  357. /// <summary>
  358. /// 增强扫描
  359. /// </summary>
  360. private void EnhancedProcess(ScanEventArgs args)
  361. {
  362. CPDFDocument CurrentDoc = PDFViewer.Document;
  363. string path = App.CachePath.MergeFilePath;
  364. string name = Guid.NewGuid().ToString();
  365. path = Path.Combine(path, name);
  366. string EnhancePath = Path.Combine(path, "Enhance");
  367. Directory.CreateDirectory(path);
  368. Directory.CreateDirectory(EnhancePath);
  369. Task.Run(() =>
  370. {
  371. CIMEngine imEngine = new CIMEngine(App.modelFolderPath);
  372. CErrorCode error = imEngine.SetModel();
  373. //显示进度条
  374. App.mainWindowViewModel.IsProcessVisible = Visibility.Visible;
  375. App.mainWindowViewModel.MaxValue = CurrentDoc.PageCount;
  376. for (int i = 0; i < CurrentDoc.PageCount; i++)
  377. {
  378. //刷新进度
  379. App.Current.Dispatcher.Invoke(async () =>
  380. {
  381. App.mainWindowViewModel.Value = i;
  382. await Task.Delay(5);
  383. });
  384. string pageImagePath = Path.Combine(path, i.ToString());
  385. string pageEnhancePath = Path.Combine(EnhancePath, i.ToString() + ".png");
  386. try
  387. {
  388. CPDFPage pdfPage = CurrentDoc.PageAtIndex(i);
  389. float zoom = (float)(DpiHelpers.Dpi / 72D);
  390. int renderWidth = (int)(pdfPage.PageSize.Width * zoom);
  391. int renderHeight = (int)(pdfPage.PageSize.Height * zoom);
  392. byte[] renderData = new byte[renderWidth * renderHeight * 4];
  393. pdfPage.RenderPageBitmapWithMatrix(zoom, new Rect(0, 0, renderWidth, renderHeight), 0xFFFFFFFF, renderData, 0);
  394. WriteableBitmap bitmap = new WriteableBitmap(renderWidth, renderHeight, DpiHelpers.Dpi, DpiHelpers.Dpi, PixelFormats.Bgra32, null);
  395. bitmap.WritePixels(new Int32Rect(0, 0, renderWidth, renderHeight), renderData, bitmap.BackBufferStride, 0);
  396. BitmapEncoder encoder = new PngBitmapEncoder();
  397. encoder.Frames.Add(BitmapFrame.Create(bitmap));
  398. using (FileStream imageStream = File.Create(pageImagePath))
  399. {
  400. encoder.Save(imageStream);
  401. imageStream.Flush();
  402. }
  403. //File.Create(pageEnhancePath);
  404. error = imEngine.Process(pageImagePath, pageEnhancePath);
  405. EnhancedFilePathList.Add(pageEnhancePath);
  406. }
  407. catch
  408. {
  409. }
  410. }
  411. Application.Current.Dispatcher.Invoke(() =>
  412. {
  413. BitmapImage image = new BitmapImage(new Uri(EnhancedFilePathList[PDFViewer.CurrentIndex]));
  414. BgImage = new WriteableBitmap(image);
  415. });
  416. imEngine.Release();
  417. ShowTooltip = Visibility.Visible;
  418. //隐藏进度条
  419. App.mainWindowViewModel.IsProcessVisible = Visibility.Collapsed;
  420. App.mainWindowViewModel.MaxValue = 0;
  421. App.mainWindowViewModel.Value = 0;
  422. });
  423. }
  424. /// <summary>
  425. /// 使用当前文档OCR
  426. /// </summary>
  427. /// <param name="args"></param>
  428. private void OCRProcess(ScanEventArgs args)
  429. {
  430. Task.Run(() =>
  431. {
  432. COCREngine imEngine = new COCREngine(App.modelFolderPath);
  433. string path = App.CachePath.MergeFilePath;
  434. string name = Guid.NewGuid().ToString();
  435. path = Path.Combine(path, name);
  436. Directory.CreateDirectory(path);
  437. CPDFDocument CurrentDoc = PDFViewer.Document;
  438. CErrorCode error = imEngine.SetModel((COCRLanguage)args.ScanLanguage);
  439. cacahe.Clear();
  440. //显示进度条
  441. App.mainWindowViewModel.IsProcessVisible = Visibility.Visible;
  442. App.mainWindowViewModel.MaxValue = args.PageRange.Count;
  443. for (int i = 0; i < args.PageRange.Count; i++)
  444. {
  445. //刷新进度
  446. App.Current.Dispatcher.Invoke(async () =>
  447. {
  448. App.mainWindowViewModel.Value = i;
  449. await Task.Delay(5);
  450. });
  451. string pageImagePath = Path.Combine(path, args.PageRange[i].ToString());
  452. CPDFPage pdfPage = CurrentDoc.PageAtIndex(args.PageRange[i]);
  453. float zoom = (float)(DpiHelpers.Dpi / 72D);
  454. int renderWidth = (int)(pdfPage.PageSize.Width * zoom);
  455. int renderHeight = (int)(pdfPage.PageSize.Height * zoom);
  456. byte[] renderData = new byte[renderWidth * renderHeight * 4];
  457. pdfPage.RenderPageBitmapWithMatrix(zoom, new Rect(0, 0, renderWidth, renderHeight), 0xFFFFFFFF, renderData, 0);
  458. WriteableBitmap bitmap = new WriteableBitmap(renderWidth, renderHeight, DpiHelpers.Dpi, DpiHelpers.Dpi, PixelFormats.Bgra32, null);
  459. bitmap.WritePixels(new Int32Rect(0, 0, renderWidth, renderHeight), renderData, bitmap.BackBufferStride, 0);
  460. BitmapEncoder encoder = new PngBitmapEncoder();
  461. encoder.Frames.Add(BitmapFrame.Create(bitmap));
  462. using (FileStream imageStream = File.Create(pageImagePath))
  463. {
  464. encoder.Save(imageStream);
  465. imageStream.Flush();
  466. }
  467. error = imEngine.Process(pageImagePath);
  468. if (imEngine.OCRResultList == null)
  469. {
  470. App.mainWindowViewModel.IsProcessVisible = Visibility.Collapsed;
  471. App.mainWindowViewModel.MaxValue = 0;
  472. App.mainWindowViewModel.Value = 0;
  473. return;
  474. }
  475. List<KeyValuePair<Rect, string>> RectList = new List<KeyValuePair<Rect, string>>();
  476. foreach (COCRResult ocrResult in imEngine.OCRResultList)
  477. {
  478. List<Point> rectPoints = new List<Point>();
  479. for (int j = 0; j < ocrResult.position.Length; j += 2)
  480. {
  481. rectPoints.Add(new Point(ocrResult.position[j], ocrResult.position[j + 1]));
  482. }
  483. int left = (int)rectPoints.AsEnumerable().Min(x => x.X);
  484. int right = (int)rectPoints.AsEnumerable().Max(x => x.X);
  485. int top = (int)rectPoints.AsEnumerable().Min(x => x.Y);
  486. int bottom = (int)rectPoints.AsEnumerable().Max(x => x.Y);
  487. RectList.Add(new KeyValuePair<Rect, string>(new Rect(left, top, right - left, bottom - top), ocrResult.text));
  488. }
  489. cacahe.Add(args.PageRange[i], RectList);
  490. }
  491. if (cacahe.Count > 0)
  492. {
  493. if (cacahe.ContainsKey(PDFViewer.CurrentIndex))
  494. {
  495. TextRectList = cacahe[PDFViewer.CurrentIndex];
  496. }
  497. else
  498. {
  499. TextRectList = null;
  500. }
  501. }
  502. imEngine.Release();
  503. //隐藏进度条
  504. App.mainWindowViewModel.IsProcessVisible = Visibility.Collapsed;
  505. App.mainWindowViewModel.MaxValue = 0;
  506. App.mainWindowViewModel.Value = 0;
  507. });
  508. }
  509. /// <summary>
  510. /// 使用增强扫描结果进行OCR
  511. /// </summary>
  512. /// <param name="args"></param>
  513. private void EnhancedOCRProcess(ScanEventArgs args)
  514. {
  515. Task.Run(() =>
  516. {
  517. COCREngine imEngine = new COCREngine(App.modelFolderPath);
  518. CErrorCode error = imEngine.SetModel((COCRLanguage)args.ScanLanguage);
  519. cacahe.Clear();
  520. for (int i = 0; i < args.PageRange.Count; i++)
  521. {
  522. error = imEngine.Process(EnhancedFilePathList[args.PageRange[i]]);
  523. if (imEngine.OCRResultList == null)
  524. return;
  525. List<KeyValuePair<Rect, string>> RectList = new List<KeyValuePair<Rect, string>>();
  526. foreach (COCRResult ocrResult in imEngine.OCRResultList)
  527. {
  528. List<Point> rectPoints = new List<Point>();
  529. for (int j = 0; j < ocrResult.position.Length; j += 2)
  530. {
  531. rectPoints.Add(new Point(ocrResult.position[j], ocrResult.position[j + 1]));
  532. }
  533. int left = (int)rectPoints.AsEnumerable().Min(x => x.X);
  534. int right = (int)rectPoints.AsEnumerable().Max(x => x.X);
  535. int top = (int)rectPoints.AsEnumerable().Min(x => x.Y);
  536. int bottom = (int)rectPoints.AsEnumerable().Max(x => x.Y);
  537. RectList.Add(new KeyValuePair<Rect, string>(new Rect(left, top, right - left, bottom - top), ocrResult.text));
  538. }
  539. cacahe.Add(args.PageRange[i], RectList);
  540. }
  541. if (cacahe.Count > 0)
  542. {
  543. if (cacahe.ContainsKey(PDFViewer.CurrentIndex))
  544. {
  545. TextRectList = cacahe[PDFViewer.CurrentIndex];
  546. }
  547. else
  548. {
  549. TextRectList = null;
  550. }
  551. }
  552. imEngine.Release();
  553. });
  554. }
  555. }
  556. }