frmMain.cs 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using System.Threading;
  11. using System.IO;
  12. using Saraff.Tiff;
  13. using Saraff.Tiff.Core;
  14. using Saraff.Twain;
  15. using HXX.Scanner.Client.Base;
  16. using HXX.Scanner.Client.Properties;
  17. using HXX.Scanner.Biz;
  18. using HXX.Scanner.Common;
  19. namespace HXX.Scanner.Client
  20. {
  21. public partial class frmMain : BaseForm
  22. {
  23. public frmMain()
  24. {
  25. //Font = new Font(Font.Name, 8.25f * 96f / CreateGraphics().DpiX, Font.Style, Font.Unit, Font.GdiCharSet, Font.GdiVerticalFont);
  26. CheckForIllegalCrossThreadCalls = false;
  27. InitializeComponent();
  28. }
  29. private void frmMain_Load(object sender, EventArgs e)
  30. {
  31. showDataDir();
  32. this.lblInstallPath.Text = Application.StartupPath;
  33. st = new ScanTool();
  34. if (!biz_socketServer.Start(Settings.Default.webSocket_url))
  35. {
  36. MsgManager.Error("服务开启失败,请检查");
  37. }
  38. }
  39. ScanTool st = null;
  40. StringBuilder uploadFailMsgs = new StringBuilder();
  41. private void lblRefreshDevice_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
  42. {
  43. if (!config_environment.loading)
  44. {
  45. config_environment.loading = true;
  46. loadScannerByTwain();
  47. config_environment.loading = false;
  48. }
  49. }
  50. private async void loadScannerByTwain()
  51. {
  52. updateUIOLoadingState(true);
  53. await loadScannerByTwainAsync();
  54. updateUIOLoadingState(false);
  55. }
  56. private void updateUIOLoadingState(Boolean loading)
  57. {
  58. if (loading)
  59. {
  60. this.loadSB.Visible = true;
  61. }
  62. else
  63. {
  64. this.loadSB.Visible = false;
  65. if (this.cmbDeviceList.Items.Count == 0)
  66. {
  67. MessageBox.Show(this, "没有加载到扫描仪", "提示");
  68. }
  69. }
  70. }
  71. private Task loadScannerByTwainAsync()
  72. {
  73. return Task.Run(() =>
  74. {
  75. if (st != null)
  76. {
  77. try
  78. {
  79. var result_scan = this._twain32.OpenDSM();
  80. scanner_manager.Clear();
  81. for (int i = 0; i < this._twain32.SourcesCount; i++)
  82. {
  83. //TODO 判断设备类型,有可能把摄像头给加载进来了// 支持2.0及以上的,才加载进来
  84. if (this._twain32.GetIsSourceTwain2Compatible(i))
  85. {
  86. var sc = new Device_Scanner(this._twain32.GetSourceProductName(i))
  87. {
  88. dsIndex = i
  89. };
  90. scanner_manager.Add(sc);
  91. }
  92. }
  93. InitScannerCombobox();
  94. }
  95. catch (Exception ex)
  96. {
  97. Console.WriteLine(DateTime.Now.ToString() + " loadScannerByTwainAsync got exception" + ex);
  98. }
  99. }
  100. });
  101. }
  102. private static void loadScannerProperty(Device_Scanner scanner)
  103. {
  104. try
  105. {
  106. String manufacturer = scanner.manufacturer;
  107. String config = "";
  108. if (manufacturer.Contains("CANON"))
  109. {
  110. config = Properties.Settings.Default.CannonConfig;
  111. //TODO
  112. }
  113. else if (manufacturer.Contains("Panasonic"))
  114. {
  115. config = Properties.Settings.Default.PanasonicConfig;
  116. }
  117. else if (manufacturer.Contains("Kodak"))//Eastman Kodak
  118. {
  119. config = Properties.Settings.Default.KodakConfig;
  120. }
  121. else if (manufacturer.Contains("Epson"))
  122. {
  123. config = Properties.Settings.Default.PanasonicConfig;
  124. }
  125. else if (manufacturer.Contains("HP"))
  126. {
  127. config = Properties.Settings.Default.PanasonicConfig;
  128. }
  129. else if (manufacturer.Contains("HUAGO"))
  130. {
  131. config = Properties.Settings.Default.PanasonicConfig;
  132. }
  133. if (config != null && config.Length > 0)
  134. {
  135. string[] configItems = config.Split(';');
  136. foreach (string configItem in configItems)
  137. {
  138. string[] configItemArr = configItem.Split('=');
  139. if (configItemArr.Length == 2)
  140. {
  141. if (configItemArr[0].Equals("ld"))
  142. {
  143. int ld = Int32.Parse(configItemArr[1]);
  144. scanner.ld = ld;
  145. }
  146. if (configItemArr[0].Equals("dbd"))
  147. {
  148. scanner.dbd = Int32.Parse(configItemArr[1]);
  149. }
  150. if (configItemArr[0].Equals("zz"))
  151. {
  152. //scanner.setPaperSize(biz_property_engine_to_scanner.get_paper_byIndex(Int32.Parse(configItemArr[1])));
  153. }
  154. }
  155. };
  156. }
  157. }
  158. catch (Exception ee)
  159. {
  160. LogManager.WriteLog(ee);
  161. }
  162. }
  163. private void InitScannerCombobox()
  164. {
  165. this.cmbDeviceList.SelectedIndexChanged -= new System.EventHandler(this.cmbDeviceList_SelectedIndexChanged);
  166. this.cmbDeviceList.DataSource = scanner_manager.Scanner_List;
  167. this.cmbDeviceList.DisplayMember = "deviceName";
  168. this.cmbDeviceList.ValueMember = "dsIndex";
  169. this.cmbDeviceList.SelectedIndexChanged += new System.EventHandler(this.cmbDeviceList_SelectedIndexChanged);
  170. if (this.cmbDeviceList.Items.Count > 0)
  171. {
  172. this.cmbDeviceList.SelectedIndex = 0;
  173. }
  174. }
  175. private void lblTestA_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
  176. {
  177. try
  178. {
  179. config_environment.scan_type = ScanType.Test_Panel_1_Side;
  180. config_environment.scan_ab = false;
  181. config_environment.paper_size = PaperSize.A4;
  182. Scan();
  183. }
  184. catch (Exception ee)
  185. {
  186. LogManager.WriteLog(ee);
  187. MsgManager.Error("扫描出错。");
  188. }
  189. }
  190. private void lblTestAB_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
  191. {
  192. try
  193. {
  194. config_environment.scan_type = ScanType.Test_Panel_2_Sides;
  195. config_environment.scan_ab = true;
  196. config_environment.paper_size = PaperSize.A4;
  197. Scan();
  198. }
  199. catch (Exception ee)
  200. {
  201. LogManager.WriteLog(ee);
  202. MsgManager.Error("扫描出错。");
  203. }
  204. }
  205. private void Scan()
  206. {
  207. if (st != null)
  208. {
  209. if (this.cmbDeviceList.SelectedItem != null)
  210. {
  211. if (!string.IsNullOrEmpty(Settings.Default.dataDir))
  212. {
  213. Device_Scanner scanner = (Device_Scanner)this.cmbDeviceList.SelectedItem;
  214. if (scanner.openSourceReady)
  215. {
  216. if (scanner.isTwain)
  217. {
  218. config_environment.scan_state = true;
  219. //biz_property_scanner_to_engine.Scan(this._twain32, scanner);
  220. }
  221. else
  222. {
  223. //if (config_environment.testScanOn)
  224. {
  225. st.test(Properties.Settings.Default.dataDir, scanner, "5");
  226. }
  227. }
  228. }
  229. else
  230. {
  231. MsgManager.Warn("未正常连接扫描仪");
  232. }
  233. }
  234. else
  235. {
  236. MsgManager.Warn("请先设置数据存放位置");
  237. }
  238. }
  239. else
  240. {
  241. MsgManager.Warn("请选择扫描设备");
  242. }
  243. }
  244. }
  245. private void lblChangeDir_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
  246. {
  247. changeDataDir();
  248. }
  249. private void changeDataDir()
  250. {
  251. FolderBrowserDialog dialog = new FolderBrowserDialog();
  252. dialog.Description = "请选择扫描数据存放位置";
  253. if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  254. {
  255. if (string.IsNullOrEmpty(dialog.SelectedPath))
  256. {
  257. MessageBox.Show(this, "存放位置不能为空", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
  258. }
  259. else
  260. {
  261. Settings.Default.dataDir = dialog.SelectedPath;
  262. Settings.Default.Save();
  263. showDataDir();
  264. }
  265. }
  266. }
  267. private void showDataDir()
  268. {
  269. lblDataPath.Text = Settings.Default.dataDir;
  270. lblDiskLeft.Text = biz_disk.getDataDirLeftSpace(Settings.Default.dataDir);
  271. }
  272. #region twain events
  273. private void _twain32_AcquireCompleted(object sender, EventArgs e)
  274. {
  275. Console.WriteLine(DateTime.Now.ToString() + " 4 扫描完成" + e.ToString());
  276. config_environment.scan_state = false;
  277. }
  278. private void _twain32_AcquireError(object sender, Saraff.Twain.Twain32.AcquireErrorEventArgs e)
  279. {
  280. //扫描出错It worked
  281. String msg = biz_twainException.get_TwainException_msg(e.Exception);
  282. LogManager.WriteLog(msg);
  283. if (msg.Contains("It worked"))
  284. {
  285. Console.WriteLine("_twain32_AcquireError 扫描结束");
  286. }
  287. else
  288. {
  289. Console.WriteLine(DateTime.Now.ToString() + " _twain32_AcquireError 扫描出错" + msg);
  290. }
  291. config_environment.scan_state = false;
  292. }
  293. private void _twain32_DeviceEvent(object sender, Saraff.Twain.Twain32.DeviceEventEventArgs e)
  294. {
  295. Console.WriteLine(DateTime.Now.ToString() + " 这个方法没有调用过 设备事件" + e.ToString());
  296. }
  297. private void _twain32_EndXfer(object sender, Saraff.Twain.Twain32.EndXferEventArgs e)
  298. {
  299. Console.WriteLine(DateTime.Now.ToString() + " _twain32_EndXfer 这个方法实际没有调用,因为保持扫描文件方式不是那个啥 进度完成" + e.ToString());
  300. }
  301. IDictionary<String, String> filePageMarkerDict;
  302. int batchFileCount = 0;
  303. string uniquePageMarker = ""; //每一个批次上传的临时标记,uniquePageMarker使用
  304. private string getDataDir()
  305. {
  306. String baseDir = Properties.Settings.Default.dataDir + "/";
  307. if (false == System.IO.Directory.Exists(baseDir))
  308. {
  309. System.IO.Directory.CreateDirectory(baseDir);
  310. }
  311. //String dataDir = baseDir + "/" + examId + "-" + examPaperId + "-" + zipId;
  312. String dataDir = baseDir + "/";
  313. if (false == System.IO.Directory.Exists(dataDir))
  314. {
  315. System.IO.Directory.CreateDirectory(dataDir);
  316. }
  317. return dataDir;
  318. }
  319. private void _twain32_SetupFileXferEvent(object sender, Saraff.Twain.Twain32.SetupFileXferEventArgs e)
  320. {
  321. e.FileName = @"d:\1\" + DateTime.Now.ToString("MMddHHmmssfff") + ".tif";
  322. Console.WriteLine(DateTime.Now.ToString() + " 1 设置文件进度事件" + e.ToString());
  323. if (checkCancel(e))
  324. {
  325. try
  326. {
  327. //if (config_environment.testScanOn)
  328. //{
  329. // e.FileName = Settings.Default.dataDir + "\\" + string.Format(@"测试{0}.{1}", DateTime.Now.ToString("MMddHHmmssfff"), this._twain32.Capabilities.ImageFileFormat.GetCurrent().ToString().ToLower());
  330. //}
  331. //else
  332. {
  333. //正式扫描,要新建examId,examPaperId,zipId文件夹
  334. String dir = this.getDataDir();
  335. e.FileName = dir + "\\" +
  336. string.Format(@"{0}.{1}", DateTime.Now.ToString("MMddHHmmssfff"),
  337. this._twain32.Capabilities.ImageFileFormat.GetCurrent().ToString().ToLower());
  338. //通过接口上传文件
  339. //整一个map,保存上传记录,上传状态
  340. if (filePageMarkerDict == null)
  341. {
  342. filePageMarkerDict = new Dictionary<String, String>();
  343. }
  344. string fnameTemp = Path.GetFileName(e.FileName);
  345. fnameTemp = fnameTemp.Substring(0, fnameTemp.Length - 1);
  346. batchFileCount++;
  347. if (config_environment.scan_ab)
  348. {
  349. //双面
  350. if (batchFileCount % 2 == 0)
  351. {
  352. //反面
  353. filePageMarkerDict.Add(fnameTemp, this.uniquePageMarker + "-" + (batchFileCount - 1));
  354. }
  355. else
  356. {
  357. //正面
  358. filePageMarkerDict.Add(fnameTemp, this.uniquePageMarker + "-" + batchFileCount);
  359. }
  360. }
  361. else
  362. {
  363. //单面
  364. filePageMarkerDict.Add(fnameTemp, this.uniquePageMarker + "-" + batchFileCount);
  365. }
  366. }
  367. }
  368. catch (Exception ex)
  369. {
  370. LogManager.WriteLog(ex);
  371. }
  372. }
  373. else
  374. {
  375. Console.WriteLine("has cancel");
  376. }
  377. }
  378. private Boolean checkCancel(Twain32.SerializableCancelEventArgs e)
  379. {
  380. if (!config_environment.scan_state)
  381. {
  382. try
  383. {
  384. e.Cancel = true;
  385. }
  386. catch (Exception ex)
  387. {
  388. Console.WriteLine(DateTime.Now.ToString() + " checkCancel Exception:" + ex.Message);
  389. }
  390. }
  391. return config_environment.scan_state;
  392. }
  393. private void _twain32_XferDone(object sender, Saraff.Twain.Twain32.XferDoneEventArgs e)
  394. {
  395. //ImageInfo imageInfo = e.GetImageInfo();
  396. Console.WriteLine(DateTime.Now.ToString() + " 2 图像传输完成" + e.ToString());
  397. }
  398. private void _twain32_FileXferEvent(object sender, Saraff.Twain.Twain32.FileXferEventArgs e)
  399. {
  400. Console.WriteLine(DateTime.Now.ToString() + " 3 文件传输完成" + e.ToString());
  401. //测试扫描一张 || 取消扫描
  402. if (config_environment.scan_type != ScanType.Formal && !config_environment.scan_ab)
  403. {
  404. //测试只扫描一张(一面)
  405. try
  406. {
  407. e.Cancel = true;
  408. }
  409. catch (Exception ex)
  410. {
  411. Console.WriteLine(DateTime.Now.ToString() + " cancel Exception:" + ex.Message);
  412. }
  413. }
  414. else
  415. {
  416. Console.WriteLine("not cancle scan");
  417. }
  418. string fileName = e.ImageFileXfer.FileName;
  419. String dstFileName = fileName;
  420. //TODO 压缩与上传,做成异步方式
  421. if (true)
  422. {
  423. if (fileName.EndsWith(".tiff"))
  424. {
  425. dstFileName = fileName.Substring(0, fileName.Length - 1);
  426. //压缩图片
  427. Device_Scanner.zipImage(fileName, dstFileName, true);
  428. }
  429. else if (fileName.EndsWith(".bmp"))
  430. {
  431. dstFileName = fileName.Substring(0, fileName.Length - 3) + "tif";
  432. //压缩图片
  433. Device_Scanner.zipImage(fileName, dstFileName, true);
  434. }
  435. //if (config_environment.testScanOn)
  436. //{
  437. // System.Diagnostics.Process.Start("explorer.exe", Properties.Settings.Default.dataDir);
  438. //}
  439. //else
  440. {
  441. this.uploadFile(dstFileName);
  442. }
  443. }
  444. }
  445. #endregion
  446. IDictionary<String, Boolean> uploadHistoryDict;
  447. private void uploadFile(string dstFileName)
  448. {
  449. Console.WriteLine(DateTime.Now.ToString() + " uploadFile:" + dstFileName);
  450. //通过接口上传文件
  451. //整一个map,保存上传记录,上传状态
  452. if (uploadHistoryDict == null)
  453. {
  454. uploadHistoryDict = new Dictionary<String, Boolean>();
  455. }
  456. uploadHistoryDict.Add(Path.GetFileName(dstFileName), false);
  457. //开始上传
  458. goUpload(dstFileName);
  459. }
  460. private void goUpload(String filePath)
  461. {
  462. //int tryTimes = 1;
  463. //Boolean uploadSuccess = false;
  464. //while (tryTimes <= 2)
  465. //{
  466. // Console.WriteLine(DateTime.Now.ToString() + tryTimes + " > " + filePath);
  467. // try
  468. // {
  469. // String url = Settings.Default.apiUrlBase + Settings.Default.uploadFileUrl;
  470. // //MultipartFormDataContent multiContent = new MultipartFormDataContent();
  471. // Dictionary<String, String> data = new Dictionary<string, string>();
  472. // data.Add("token", Properties.Settings.Default.token);
  473. // data.Add("examId", examId + "");
  474. // data.Add("examPaperId", examPaperId + "");
  475. // data.Add("zipId", zipId + "");
  476. // data.Add("schoolId", schoolId + "");
  477. // String uniquePageMarker = "";
  478. // Console.WriteLine(DateTime.Now.ToString() + "filePath:" + filePath);
  479. // String fileName = Path.GetFileName(filePath);
  480. // if (filePageMarkerDict.ContainsKey(fileName))
  481. // {
  482. // uniquePageMarker = filePageMarkerDict[fileName];
  483. // }
  484. // Console.WriteLine("uniquePageMarker:" + uniquePageMarker + " " + fileName);
  485. // data.Add("uniquePageMarker", uniquePageMarker + "");
  486. // data.Add("TifBase64", FileToBase64String(filePath));
  487. // data.Add("fileName", fileName);
  488. // String result = "";
  489. // if (false)
  490. // {
  491. // //HttpClient httpClient = new HttpClient();
  492. // //httpClient.Timeout = TimeSpan.FromSeconds(4);
  493. // //FormUrlEncodedContent multiContent = new FormUrlEncodedContent(data);
  494. // ////接口需要判断2张图是一张答题卡的
  495. // //Console.WriteLine(DateTime.Now.ToString() + "fileName:" + fileName);
  496. // //HttpResponseMessage response = await httpClient.PostAsync(url, multiContent);
  497. // //response.EnsureSuccessStatusCode();
  498. // //result = await response.Content.ReadAsStringAsync();
  499. // }
  500. // else
  501. // {
  502. // result = sendPost(url, data);
  503. // }
  504. // Console.WriteLine(DateTime.Now.ToString() + "goUpload result:" + result);
  505. // JObject jsonData = (JObject)JsonConvert.DeserializeObject(result);
  506. // int code = Int32.Parse(jsonData["code"].ToString());
  507. // if (code == 200)
  508. // {
  509. // //上传完成后,更新为true
  510. // uploadHistoryDict[Path.GetFileName(filePath)] = true;
  511. // uploadSuccess = true;
  512. // }
  513. // else
  514. // {
  515. // Console.WriteLine(DateTime.Now.ToString() + "goUpload fail : " + jsonData["msg"].ToString());
  516. // //MessageBox.Show(this, jsonData["msg"].ToString(), "提示");
  517. // uploadFailMsgs.Append(jsonData["msg"].ToString());
  518. // }
  519. // }
  520. // catch (Exception e)
  521. // {
  522. // Console.WriteLine(DateTime.Now.ToString() + "goUpload exception :" + e.Message);
  523. // }
  524. // if (uploadSuccess)
  525. // {
  526. // break;
  527. // }
  528. // else
  529. // {
  530. // tryTimes++;
  531. // }
  532. //}
  533. //if (!uploadSuccess)
  534. //{
  535. // Console.WriteLine(DateTime.Now.ToString() + "fail this.scanState:" + this.scanState + " uploadFailTimes:" + uploadFailTimes + " fileName:" + filePath);
  536. // this.scanState = false;
  537. // uploadFailTimes++;
  538. // //stop scan
  539. // //MessageBox.Show(this, "上传扫描图片失败,请检查网络是否通畅。建议删除该批次,然后重试", "错误提示");
  540. //}
  541. }
  542. private void cmbDeviceList_SelectedIndexChanged(object sender, EventArgs e)
  543. {
  544. var scanner = (Device_Scanner)this.cmbDeviceList.SelectedItem;
  545. scanner.openSourceReady = false;
  546. try
  547. {
  548. this._twain32.CloseDataSource();
  549. this._twain32.SourceIndex = scanner.dsIndex;
  550. if (this._twain32.OpenDataSource())
  551. {
  552. scanner.openSourceReady = true;
  553. scanner.Brightness = this._twain32.Capabilities.Brightness.Get();
  554. scanner.BrightnessBaseIndex = (scanner.Brightness.Count - 1) / 2;
  555. scanner.Contrasts = this._twain32.Capabilities.Contrast.Get();
  556. scanner.ContrastsBaseIndex = (scanner.Contrasts.Count - 1) / 2;
  557. loadScannerProperty(scanner);
  558. }
  559. }
  560. catch (TwainException te)
  561. {
  562. LogManager.WriteLog(te);
  563. MsgManager.Error(biz_twainException.get_TwainException_msg(te));
  564. }
  565. catch (Exception ee)
  566. {
  567. LogManager.WriteLog(ee);
  568. }
  569. }
  570. }
  571. }