ScanViwerViewModel.cs 28 KB

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