TencentOCRController.cs 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701
  1. using Aspose.Cells;
  2. using Aspose.Words;
  3. using Microsoft.AspNetCore.Mvc.ViewEngines;
  4. using NPOI.HPSF;
  5. using OASystem.API.OAMethodLib.File;
  6. //using OASystem.API.OAMethodLib.NPOI;
  7. using OASystem.API.OAMethodLib.TencentCloudAPI;
  8. using OASystem.API.OAMethodLib.YouDaoAPI;
  9. using OASystem.Domain.Dtos.CRM;
  10. using OASystem.Domain.Dtos.QiYeWeChat;
  11. using OASystem.Domain.Dtos.Tencent;
  12. using OASystem.Domain.ViewModels.OCR;
  13. using OASystem.Domain.ViewModels.TencentOCR;
  14. using OASystem.Infrastructure.Repositories.CRM;
  15. using Org.BouncyCastle.Crypto;
  16. using Org.BouncyCastle.Utilities.Encoders;
  17. using StackExchange.Redis;
  18. using System.Collections.Generic;
  19. using System.Data;
  20. using System.Net.NetworkInformation;
  21. using TencentCloud.Ocr.V20181119.Models;
  22. using Ubiety.Dns.Core;
  23. namespace OASystem.API.Controllers
  24. {
  25. /// <summary>
  26. /// TencentOCR 识别
  27. /// </summary>
  28. [Route("api/[controller]/[action]")]
  29. //[ApiController]
  30. public class TencentOCRController : ControllerBase
  31. {
  32. private readonly VisaDeleClientRepository _visaDeleClientRepository;
  33. public TencentOCRController(VisaDeleClientRepository visaDeleClientRepository)
  34. {
  35. this._visaDeleClientRepository = visaDeleClientRepository;
  36. }
  37. #region web
  38. /// <summary>
  39. /// 通用印刷体
  40. /// 文档下载
  41. /// </summary>
  42. /// <param name="dto"></param>
  43. /// <returns></returns>
  44. [HttpPost]
  45. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  46. public async Task<IActionResult> GetGeneralBasic(GeneralBasicOCRDto dto)
  47. {
  48. string[] picBase64Array = dto.picBase64.Split(';');
  49. string picFormat = picBase64Array[0].Split('/')[1];
  50. if (!TencentOCRTools.ImageType(picFormat))
  51. {
  52. return Ok(JsonView("图片格式不正确!只支持 PNG、JPG、JPEG、BMP 格式!"));
  53. }
  54. double strSize = 1024 * 1024 * 7;
  55. if (dto.picBase64.Length > strSize)
  56. {
  57. return Ok(JsonView("图片不能大于7M!"));
  58. }
  59. var gbData = await TencentOCRTools.GetOCR((int)TencentOCREnum.GeneralBasic, dto);
  60. if (gbData.Code != 0)
  61. {
  62. return Ok(JsonView(gbData.Msg));
  63. }
  64. if (gbData.Data == null)
  65. {
  66. return Ok(JsonView(gbData.Msg));
  67. }
  68. #region word下载
  69. GeneralBasicOCRResponse res = gbData.Data as GeneralBasicOCRResponse;
  70. Document doc = new Document();
  71. DocumentBuilder builder = new DocumentBuilder(doc);
  72. string fileName = "通用印刷体";
  73. string content = $"{fileName}\r\n\r\n";
  74. foreach (var view in res.TextDetections)
  75. {
  76. content += $"Content:{view.DetectedText}\r\n\r\n";
  77. }
  78. builder.Write(content);
  79. string outputDir = $"{AppSettingsHelper.Get("WordBasePath")}/TencentOCR";
  80. string outputFile = $"{fileName}{DateTime.Now.ToString("yyyyMMddHHmmss")}.docx";
  81. string outputPath = Path.Combine(outputDir, outputFile);
  82. if (!Directory.Exists(outputDir))
  83. {
  84. Directory.CreateDirectory(outputDir);
  85. }
  86. doc.Save(outputPath);
  87. string url = $"{AppSettingsHelper.Get("WordBaseUrl")}Office/Word/TencentOCR/{outputFile}";
  88. #endregion
  89. return Ok(JsonView(true, "操作成功", new { dataSource = res, url = url }));
  90. }
  91. /// <summary>
  92. /// 身份证识别(国徽面/反面)
  93. /// 文档下载
  94. /// </summary>
  95. /// <param name="dto"></param>
  96. /// <returns></returns>
  97. [HttpPost]
  98. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  99. public async Task<IActionResult> GetIDCard(IDCardOCRDto dto)
  100. {
  101. string[] picBase64Array = dto.picBase64.Split(';');
  102. string picFormat = picBase64Array[0].Split('/')[1];
  103. if (!TencentOCRTools.ImageType(picFormat))
  104. {
  105. return Ok(JsonView("图片格式不正确!只支持 PNG、JPG、JPEG、BMP 格式!"));
  106. }
  107. double strSize = 1024 * 1024 * 7;
  108. if (dto.picBase64.Length > strSize)
  109. {
  110. return Ok(JsonView("图片不能大于7M!"));
  111. }
  112. var idCardData =await TencentOCRTools.GetOCR((int)TencentOCREnum.IDCard, dto);
  113. if (idCardData.Code != 0)
  114. {
  115. return Ok(JsonView(idCardData.Msg));
  116. }
  117. if (idCardData.Data == null)
  118. {
  119. return Ok(JsonView(idCardData.Msg));
  120. }
  121. IDCardOCRAndDownUrlView iDCardOCRView = new IDCardOCRAndDownUrlView() { };
  122. if (dto.Language.ToLower() == "ch")
  123. {
  124. bool cerdStatus = await _visaDeleClientRepository.SetCrmUpdPassIdCardOCR(
  125. new SetCrmUpdPassIdCardOCRDto
  126. {
  127. UserId = dto.UserId,
  128. ClientName = idCardData.Data.Name,
  129. Sex = idCardData.Data.Sex == "男" ? 0 : 1,
  130. CerdNo = idCardData.Data.IdNum,
  131. CerdAddress = idCardData.Data.Address,
  132. });
  133. iDCardOCRView.Status = cerdStatus;
  134. iDCardOCRView.Name = idCardData.Data.Name;
  135. iDCardOCRView.Sex = idCardData.Data.Sex;
  136. iDCardOCRView.Nation = idCardData.Data.Nation;
  137. iDCardOCRView.Birth = idCardData.Data.Birth;
  138. iDCardOCRView.Address = idCardData.Data.Address;
  139. iDCardOCRView.IdNum = idCardData.Data.IdNum;
  140. iDCardOCRView.Authority = idCardData.Data.Authority;
  141. iDCardOCRView.ValidDate = idCardData.Data.ValidDate;
  142. }
  143. else if (dto.Language.ToLower() == "en")
  144. {
  145. iDCardOCRView.Name = await YouDaoApiTools.GetOCR_ReTrans(idCardData.Data.Name);
  146. iDCardOCRView.Sex = await YouDaoApiTools.GetOCR_ReTrans(idCardData.Data.Sex);
  147. iDCardOCRView.Nation = await YouDaoApiTools.GetOCR_ReTrans(idCardData.Data.Nation);
  148. iDCardOCRView.Birth = await YouDaoApiTools.GetOCR_ReTrans(idCardData.Data.Birth);
  149. iDCardOCRView.Address = await YouDaoApiTools.GetOCR_ReTrans(idCardData.Data.Address);
  150. iDCardOCRView.IdNum = idCardData.Data.IdNum;
  151. iDCardOCRView.Authority = await YouDaoApiTools.GetOCR_ReTrans(idCardData.Data.Authority);
  152. iDCardOCRView.ValidDate = await YouDaoApiTools.GetOCR_ReTrans(idCardData.Data.ValidDate);
  153. }
  154. #region word生成 返回地址
  155. Dictionary<string, object> dic = new Dictionary<string, object>();
  156. dic.Add("Name", iDCardOCRView.Name);
  157. dic.Add("Sex", iDCardOCRView.Sex);
  158. dic.Add("Nation", iDCardOCRView.Nation);
  159. dic.Add("Birth", iDCardOCRView.Birth);
  160. dic.Add("Address", iDCardOCRView.Address);
  161. dic.Add("IdNum", iDCardOCRView.IdNum);
  162. dic.Add("Authority", iDCardOCRView.Authority);
  163. dic.Add("ValidDate", iDCardOCRView.ValidDate);
  164. string serverPath = "";
  165. if (dto.Language.ToLower() == "ch")
  166. {
  167. string fileNameCh = string.Format("{0}.doc", dic["Name"].ToString() + "身份证(人像面)[CH]" + DateTime.Now.ToString("yyyyMMddHHmmss"));
  168. serverPath = AsposeHelper.ExpertWordToModel("ocr_身份证(人像面).doc", "TencentOCR", fileNameCh, dic, null);
  169. }
  170. else if (dto.Language.ToLower() == "en")
  171. {
  172. string fileNameEn = string.Format("{0}.doc", dic["Name"].ToString() + "身份证(人像面)[EN]" + DateTime.Now.ToString("yyyyMMddHHmmss"));
  173. serverPath = AsposeHelper.ExpertWordToModel("(EN)ocr_身份证(人像面).doc", "TencentOCR", fileNameEn, dic, null);
  174. }
  175. iDCardOCRView.DownUrl = serverPath;
  176. #endregion
  177. return Ok(JsonView(iDCardOCRView));
  178. }
  179. /// <summary>
  180. /// 户口簿识别
  181. /// 文档下载
  182. /// </summary>
  183. /// <param name="dto"></param>
  184. /// <returns></returns>
  185. [HttpPost]
  186. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  187. public async Task<IActionResult> GetResidenceBookletOCR(ResidenceBookletOCRDto dto)
  188. {
  189. double strSize = 1024 * 1024 * 7;
  190. if (dto.picBase64.Length > strSize)
  191. {
  192. return Ok(JsonView("图片不能大于7M!"));
  193. }
  194. var residenceBookData = await TencentOCRTools.GetOCR((int)TencentOCREnum.ResidenceBooklet, dto);
  195. if (residenceBookData.Code != 0)
  196. {
  197. return Ok(JsonView(residenceBookData.Msg));
  198. }
  199. if (residenceBookData.Data == null)
  200. {
  201. return Ok(JsonView(residenceBookData.Msg));
  202. }
  203. #region Feil Down
  204. BizLicenseOCRResponse res = residenceBookData.Data as BizLicenseOCRResponse;
  205. Document doc = new Document();
  206. DocumentBuilder builder = new DocumentBuilder(doc);
  207. string fileName = "户口簿识别";
  208. string content = $"{fileName}\r\n\r\n";
  209. if (res != null)
  210. {
  211. content += $"公司名称:{res.Name}\r\n\r\n";
  212. content += $"统一社会信用代码(三合一之前为注册号):{res.RegNum}\r\n\r\n";
  213. content += $"注册资本:{res.Capital}\r\n\r\n";
  214. content += $"法人代表:{res.Person}\r\n\r\n";
  215. content += $"地址:{res.Address}\r\n\r\n";
  216. content += $"经营范围:{res.Business}\r\n\r\n";
  217. content += $"主题类型:{res.Type}\r\n\r\n";
  218. content += $"营业期限:{res.Period}\r\n\r\n";
  219. content += $"组成形式:{res.ComposingForm}\r\n\r\n";
  220. content += $"成立日期:{res.SetDate}\r\n\r\n";
  221. }
  222. builder.Write(content);
  223. string outputDir = $"{AppSettingsHelper.Get("WordBasePath")}/TencentOCR";
  224. string outputFile = $"{fileName}{DateTime.Now.ToString("yyyyMMddHHmmss")}.docx";
  225. string outputPath = Path.Combine(outputDir, outputFile);
  226. if (!Directory.Exists(outputDir))
  227. {
  228. Directory.CreateDirectory(outputDir);
  229. }
  230. doc.Save(outputPath);
  231. //return $"{AppSettingsHelper.Get("WordBaseUrl")}Office/Word/TencentOCR/{outputFile}";
  232. #endregion
  233. return Ok(JsonView(residenceBookData.Data));
  234. }
  235. /// <summary>
  236. /// 营业执照识别
  237. /// 获取营业执照返回数据
  238. /// </summary>
  239. /// <param name="dto"></param>
  240. /// <returns></returns>
  241. [HttpPost]
  242. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  243. public async Task<IActionResult> GetBizLicenseOCR(BizLicenseOCRDto dto)
  244. {
  245. double strSize = 1024 * 1024 * 7;
  246. if (dto.picBase64.Length > strSize)
  247. {
  248. return Ok(JsonView("图片不能大于7M!"));
  249. }
  250. var residenceBookData = await TencentOCRTools.GetOCR((int)TencentOCREnum.BizLicense, dto);
  251. if (residenceBookData.Code != 0)
  252. {
  253. return Ok(JsonView(residenceBookData.Msg));
  254. }
  255. if (residenceBookData.Data == null)
  256. {
  257. return Ok(JsonView(residenceBookData.Msg));
  258. }
  259. return Ok(JsonView(residenceBookData.Data));
  260. }
  261. /// <summary>
  262. /// 组织结构识别
  263. /// 获取组织结构返回数据
  264. /// </summary>
  265. /// <param name="dto"></param>
  266. /// <returns></returns>
  267. [HttpPost]
  268. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  269. public async Task<IActionResult> GetOrgCodeCertOCR(OrgCodeCertOCRDto dto)
  270. {
  271. double strSize = 1024 * 1024 * 7;
  272. if (dto.picBase64.Length > strSize)
  273. {
  274. return Ok(JsonView("图片不能大于7M!"));
  275. }
  276. var occData = await TencentOCRTools.GetOCR((int)TencentOCREnum.OrgCodeCert, dto);
  277. if (occData.Code != 0)
  278. {
  279. return Ok(JsonView(occData.Msg));
  280. }
  281. if (occData.Data == null)
  282. {
  283. return Ok(JsonView(occData.Msg));
  284. }
  285. return Ok(JsonView(occData.Data));
  286. }
  287. /// <summary>
  288. /// 行驶证识别
  289. /// 获取行驶证返回数据
  290. /// CardSide=0 主页正面(有红色印章的一面),CardSide=1 行驶证副页正面(有号码号牌的一面),CardSide=2 行驶证主页正面和副页正面。
  291. /// </summary>
  292. /// <param name="dto"></param>
  293. /// <returns></returns>
  294. [HttpPost]
  295. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  296. public async Task<IActionResult> GetVehicleLicense(VehicleLicenseOCRDto dto)
  297. {
  298. double strSize = 1024 * 1024 * 7;
  299. if (dto.picBase64.Length > strSize)
  300. {
  301. return Ok(JsonView("图片不能大于7M!"));
  302. }
  303. var vehicleLicenseData = await TencentOCRTools.GetOCR((int)TencentOCREnum.VehicleLicense, dto);
  304. if (vehicleLicenseData.Code != 0)
  305. {
  306. return Ok(JsonView(vehicleLicenseData.Msg));
  307. }
  308. if (vehicleLicenseData.Data == null)
  309. {
  310. return Ok(JsonView(vehicleLicenseData.Msg));
  311. }
  312. return Ok(JsonView(vehicleLicenseData.Data));
  313. }
  314. /// <summary>
  315. /// 房产证识别
  316. /// 获取房产证返回数据
  317. /// </summary>
  318. /// <param name="dto"></param>
  319. /// <returns></returns>
  320. [HttpPost]
  321. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  322. public async Task<IActionResult> GetPropOwnerCert(PropOwnerCertOCRDto dto)
  323. {
  324. double strSize = 1024 * 1024 * 7;
  325. if (dto.picBase64.Length > strSize)
  326. {
  327. return Ok(JsonView("图片不能大于7M!"));
  328. }
  329. var pcData = await TencentOCRTools.GetOCR((int)TencentOCREnum.PropOwnerCert, dto);
  330. if (pcData.Code != 0)
  331. {
  332. return Ok(JsonView(pcData.Msg));
  333. }
  334. if (pcData.Data == null)
  335. {
  336. return Ok(JsonView(pcData.Msg));
  337. }
  338. return Ok(JsonView(pcData.Data));
  339. }
  340. /// <summary>
  341. /// 结婚证识别
  342. /// 获取结婚证返回数据
  343. /// </summary>
  344. /// <param name="dto"></param>
  345. /// <returns></returns>
  346. [HttpPost]
  347. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  348. public async Task<IActionResult> GetMarriageLicense(MarriageLicenseOCRDto dto)
  349. {
  350. double strSize = 1024 * 1024 * 7;
  351. if (dto.picBase64.Length > strSize)
  352. {
  353. return Ok(JsonView("图片不能大于7M!"));
  354. }
  355. var mlData = await TencentOCRTools.GetOCR((int)TencentOCREnum.GeneralBasic, dto);
  356. if (mlData.Code != 0)
  357. {
  358. return Ok(JsonView(mlData.Msg));
  359. }
  360. if (mlData.Data == null)
  361. {
  362. return Ok(JsonView(mlData.Msg));
  363. }
  364. return Ok(JsonView(mlData.Data));
  365. }
  366. /// <summary>
  367. /// 统一信用代码识别
  368. /// 获取统一信用代码返回数据
  369. /// </summary>
  370. /// <param name="dto"></param>
  371. /// <returns></returns>
  372. [HttpPost]
  373. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  374. public async Task<IActionResult> GetUniformCreditCode(UniformCreditCodeOCRDto dto)
  375. {
  376. double strSize = 1024 * 1024 * 7;
  377. if (dto.picBase64.Length > strSize)
  378. {
  379. return Ok(JsonView("图片不能大于7M!"));
  380. }
  381. var gbData = await TencentOCRTools.GetOCR((int)TencentOCREnum.GeneralBasic, dto);
  382. if (gbData.Code != 0)
  383. {
  384. return Ok(JsonView(gbData.Msg));
  385. }
  386. if (gbData.Data == null)
  387. {
  388. return Ok(JsonView(gbData.Msg));
  389. }
  390. return Ok(JsonView(gbData.Data));
  391. }
  392. /// <summary>
  393. /// 护照识别(中国大陆地区护照)
  394. /// 获取护照识别(中国大陆地区护照)返回数据
  395. /// </summary>
  396. /// <param name="dto"></param>
  397. /// <returns></returns>
  398. [HttpPost]
  399. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  400. public async Task<IActionResult> GetPassport(PassportOCRDto dto)
  401. {
  402. double strSize = 1024 * 1024 * 7;
  403. if (dto.picBase64.Length > strSize)
  404. {
  405. return Ok(JsonView("图片不能大于7M!"));
  406. }
  407. var pData = await TencentOCRTools.GetOCR((int)TencentOCREnum.Passport, dto);
  408. if (pData.Code != 0)
  409. {
  410. return Ok(JsonView(pData.Msg));
  411. }
  412. if (pData.Data == null)
  413. {
  414. return Ok(JsonView(pData.Msg));
  415. }
  416. return Ok(JsonView(pData.Data));
  417. }
  418. /// <summary>
  419. /// 护照识别(港澳台地区及境外护照)
  420. /// 获取护照识别(港澳台地区及境外护照)返回数据
  421. /// </summary>
  422. /// <param name="dto"></param>
  423. /// <returns></returns>
  424. [HttpPost]
  425. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  426. public async Task<IActionResult> GetMLIDPassport(PassportOCRDto dto)
  427. {
  428. double strSize = 1024 * 1024 * 7;
  429. if (dto.picBase64.Length > strSize)
  430. {
  431. return Ok(JsonView("图片不能大于7M!"));
  432. }
  433. var mlidpData = await TencentOCRTools.GetOCR((int)TencentOCREnum.MLIDPassport, dto);
  434. if (mlidpData.Code != 0)
  435. {
  436. return Ok(JsonView(mlidpData.Msg));
  437. }
  438. if (mlidpData.Data == null)
  439. {
  440. return Ok(JsonView(mlidpData.Msg));
  441. }
  442. return Ok(JsonView(mlidpData.Data));
  443. }
  444. /// <summary>
  445. /// 名片识别
  446. /// 获取名片 返回数据
  447. /// </summary>
  448. /// <param name="dto"></param>
  449. /// <returns></returns>
  450. [HttpPost]
  451. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  452. public async Task<IActionResult> GetBusinessCard(BusinessCardOCRDto dto)
  453. {
  454. double strSize = 1024 * 1024 * 7;
  455. if (dto.picBase64.Length > strSize)
  456. {
  457. return Ok(JsonView("图片不能大于7M!"));
  458. }
  459. try
  460. {
  461. var mlidpData = await TencentOCRTools.GetOCR((int)TencentOCREnum.BusinessCard, dto);
  462. if (mlidpData.Code != 0)
  463. {
  464. return Ok(JsonView(mlidpData.Msg));
  465. }
  466. if (mlidpData.Data == null)
  467. {
  468. return Ok(JsonView(mlidpData.Msg));
  469. }
  470. return Ok(JsonView(mlidpData.Data));
  471. }
  472. catch (Exception ex)
  473. {
  474. return Ok(JsonView(false, ex.Message));
  475. }
  476. }
  477. /// <summary>
  478. /// 智能结构化识别V2
  479. /// 获取名片 返回数据
  480. /// </summary>
  481. /// <param name="dto"></param>
  482. /// <returns></returns>
  483. [HttpPost]
  484. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  485. public async Task<IActionResult> GetSmartStructuralOCRV2(BusinessCardOCRDto dto)
  486. {
  487. string[] picBase64Array = dto.picBase64.Split(';');
  488. string picFormat = picBase64Array[0].Split('/')[1];
  489. if (!TencentOCRTools.ImageType(picFormat))
  490. {
  491. return Ok(JsonView("图片格式不正确!只支持 PNG、JPG、JPEG、BMP 格式!"));
  492. }
  493. double strSize = 1024 * 1024 * 7;
  494. if (dto.picBase64.Length > strSize)
  495. {
  496. return Ok(JsonView("图片不能大于7M!"));
  497. }
  498. var ssData = await TencentOCRTools.GetOCR((int)TencentOCREnum.SmartStructuralOCRV2, dto);
  499. if (ssData.Code != 0)
  500. {
  501. return Ok(JsonView(false, ssData.Msg));
  502. }
  503. if (ssData.Data == null)
  504. {
  505. return Ok(JsonView(false, ssData.Msg));
  506. }
  507. //var wordRes = GenerateWord(ssData.Data as List<ocrGeneralView>, "智能结构化识别V2");
  508. List<ocrGeneralView>? datas = ssData.Data as List<ocrGeneralView>;
  509. var data = new {
  510. dataSource = ssData.Data,
  511. url = GenerateWord(datas, "智能结构化识别V2")
  512. };
  513. return Ok(JsonView(true, ssData.Msg, data));
  514. }
  515. /// <summary>
  516. /// 生成 ocr word
  517. /// </summary>
  518. /// <param name="views"></param>
  519. /// <param name="fileName"></param>
  520. /// <returns></returns>
  521. private string GenerateWord(List<ocrGeneralView> views, string fileName)
  522. {
  523. Document doc = new Document();
  524. DocumentBuilder builder = new DocumentBuilder(doc);
  525. string content = $"{fileName}\r\n\r\n";
  526. foreach (var view in views)
  527. {
  528. content += $"TypeName:{view.name}\t\r\nContent:{view.value}\r\n\r\n";
  529. }
  530. builder.Write(content);
  531. string outputDir = $"{AppSettingsHelper.Get("WordBasePath")}/TencentOCR";
  532. string outputFile = $"{fileName}{DateTime.Now.ToString("yyyyMMddHHmmss")}.docx";
  533. string outputPath = Path.Combine(outputDir, outputFile);
  534. if (!Directory.Exists(outputDir))
  535. {
  536. Directory.CreateDirectory(outputDir);
  537. }
  538. doc.Save(outputPath);
  539. return $"{AppSettingsHelper.Get("WordBaseUrl")}Office/Word/TencentOCR/{outputFile}";
  540. }
  541. #endregion
  542. #region android ios
  543. /// <summary>
  544. /// 名片识别
  545. /// 获取名片 移动端 返回数据
  546. /// </summary>
  547. /// <param name="dto"></param>
  548. /// <returns></returns>
  549. [HttpPost]
  550. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  551. public async Task<IActionResult> PostBusinessCardApp(BusinessCardOCRDto dto)
  552. {
  553. double strSize = 1024 * 1024 * 7;
  554. if (dto.picBase64.Length > strSize)
  555. {
  556. return Ok(JsonView("图片不能大于7M!"));
  557. }
  558. Logs(dto.picBase64);
  559. Logs("名片识别开始时间:" + DateTime.Now);
  560. try
  561. {
  562. var mlidpData = TencentOCRTools.PostOCRApp((int)TencentOCREnum.BusinessCard, dto);
  563. if (mlidpData.Code != 0)
  564. {
  565. return Ok(JsonView(mlidpData.Msg));
  566. }
  567. if (mlidpData.Data == null)
  568. {
  569. return Ok(JsonView(mlidpData.Msg));
  570. }
  571. Logs("名片识别结束时间:" + DateTime.Now);
  572. return Ok(JsonView(mlidpData.Data));
  573. }
  574. catch (Exception ex)
  575. {
  576. return Ok(JsonView(false, ex.Message));
  577. }
  578. }
  579. #endregion
  580. }
  581. }