ImportExerciseService.cs 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. using DocumentFormat.OpenXml.Packaging;
  2. using HtmlAgilityPack;
  3. using Microsoft.AspNetCore.Http;
  4. using OpenXmlPowerTools;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Drawing.Imaging;
  8. using System.IO;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Text.RegularExpressions;
  12. using System.Threading.Tasks;
  13. using System.Xml.Linq;
  14. using TEAMModelOS.SDK.Context.Constant;
  15. using TEAMModelOS.SDK.Extension.SnowFlake;
  16. using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
  17. using TEAMModelOS.SDK.Helper.Common.FileHelper;
  18. using TEAMModelOS.SDK.Helper.Common.StringHelper;
  19. using TEAMModelOS.SDK.Helper.Security.ShaHash;
  20. using TEAMModelOS.SDK.Module.AzureBlob.Container;
  21. using TEAMModelOS.SDK.Module.AzureBlob.Interfaces;
  22. using TEAMModelOS.SDK.Module.AzureTable.Interfaces;
  23. using TEAMModelOS.Service.Models.Core;
  24. using TEAMModelOS.Service.Models.Evaluation.Dtos.Own;
  25. using TEAMModelOS.Service.Services.Evaluation.Interfaces;
  26. namespace TEAMModelOS.Service.Services.Evaluation.Implements
  27. {
  28. public class ImportExerciseService : IImportExerciseService
  29. {
  30. private readonly IAzureBlobDBRepository azureBlobDBRepository;
  31. private readonly IAzureTableDBRepository azureTableDBRepository;
  32. public ImportExerciseService(IAzureBlobDBRepository _azureBlobDBRepository, IAzureTableDBRepository _azureTableDBRepository)
  33. {
  34. azureBlobDBRepository = _azureBlobDBRepository;
  35. azureTableDBRepository = _azureTableDBRepository;
  36. }
  37. public async Task<Dictionary<string, object>> UploadWord(IFormFile file)
  38. {
  39. Dictionary<string, object> resdict = new Dictionary<string, object>();
  40. string shaCode = ShaHashHelper.GetSHA1(file.OpenReadStream());
  41. long length = file.Length;
  42. Dictionary<string, object> dict = new Dictionary<string, object> { { "Sha1Code", shaCode } };
  43. List<AzureBlobModel> models = await azureTableDBRepository.FindListByDict<AzureBlobModel>(dict);
  44. //if (models.IsNotEmpty())
  45. //{
  46. // resdict.Add("HtmlString", HttpHelper.HttpGet(models[0].BlobUrl));
  47. // resdict.Add("Sha1Code", models[0].Sha1Code);
  48. // return resdict;
  49. //}
  50. string folder = shaCode + "";
  51. //System.IO.Directory.CreateDirectory(folder);
  52. // var filePath = folder + "\\" + file.FileName;
  53. //using (var stream = new FileStream(filePath, FileMode.Create))
  54. //{
  55. // await file.CopyToAsync(stream);
  56. //}
  57. var htmlInfo = ConvertDocxToHtml(file, folder);
  58. AzureBlobModel model = await azureBlobDBRepository.UploadTextByFolder(htmlInfo.htmlString, "",htmlInfo.blobPath, "exercise",false);
  59. model.Sha1Code = shaCode;
  60. await azureTableDBRepository.Save<AzureBlobModel>(model);
  61. // FileHelper.DeleteDirAndFiles(BaseConfigModel.ContentRootPath + "/Upload");
  62. resdict.Add("HtmlString", htmlInfo.htmlString);
  63. resdict.Add("Sha1Code", shaCode);
  64. return resdict;
  65. }
  66. public dynamic ConvertDocxToHtml(IFormFile file, string folder)
  67. {
  68. string FolderName = DateTime.Now.ToString("yyyyMMdd")+"/"+ folder;
  69. byte[] byteArray = new byte[file.OpenReadStream().Length];
  70. file.OpenReadStream().Read(byteArray, 0, byteArray.Length);
  71. //byte[] bytes = new byte[stream.Length];
  72. using (MemoryStream memoryStream = new MemoryStream())
  73. {
  74. memoryStream.Write(byteArray, 0, byteArray.Length);
  75. using (WordprocessingDocument doc = WordprocessingDocument.Open(memoryStream, true))
  76. {
  77. int imageCounter = 0;
  78. WmlToHtmlConverterSettings settings = new WmlToHtmlConverterSettings()
  79. {
  80. PageTitle = "",
  81. AdditionalCss = "body { margin: 1cm auto; max-width: 20cm; padding: 0; }",
  82. FabricateCssClasses = true,
  83. CssClassPrefix = "pt-",
  84. RestrictToSupportedLanguages = false,
  85. RestrictToSupportedNumberingFormats = false,
  86. ImageHandler = imageInfo =>
  87. {
  88. ++imageCounter;
  89. string extension = imageInfo.ContentType.Split('/')[1].ToLower();
  90. ImageFormat imageFormat = null;
  91. if (extension.Equals("png")) imageFormat = ImageFormat.Png;
  92. else if (extension.Equals("gif")) imageFormat = ImageFormat.Gif;
  93. else if (extension.Equals("bmp")) imageFormat = ImageFormat.Bmp;
  94. else if (extension.Equals("jpeg")) imageFormat = ImageFormat.Jpeg;
  95. else if (extension.Equals("tiff"))
  96. {
  97. extension = "gif";
  98. imageFormat = ImageFormat.Gif;
  99. }
  100. else if (extension.Equals("x-wmf"))
  101. {
  102. extension = "wmf";
  103. imageFormat = ImageFormat.Wmf;
  104. }
  105. if (imageFormat == null) return null;
  106. string base64 = null;
  107. string mimeType = null;
  108. string shaCode = null;
  109. try
  110. {
  111. if (extension.Equals("wmf"))
  112. {
  113. var buffer = Encoding.Default.GetBytes(imageInfo.Mathxml);
  114. base64 = System.Convert.ToBase64String(buffer);
  115. mimeType = "image/svg+xml";
  116. shaCode = ShaHashHelper.GetSHA1(new MemoryStream(buffer));
  117. }
  118. else
  119. {
  120. ImageFormat format = imageInfo.Bitmap.RawFormat;
  121. ImageCodecInfo codec = ImageCodecInfo.GetImageDecoders()
  122. .First(c => c.FormatID == format.Guid);
  123. mimeType = codec.MimeType;
  124. using (MemoryStream ms = new MemoryStream())
  125. {
  126. imageInfo.Bitmap.Save(ms, imageFormat);
  127. var ba = ms.ToArray();
  128. base64 = System.Convert.ToBase64String(ba);
  129. shaCode = ShaHashHelper.GetSHA1(ms);
  130. }
  131. }
  132. }
  133. catch (System.Runtime.InteropServices.ExternalException)
  134. { return null; }
  135. string imageSource =
  136. string.Format("data:{0};base64,{1}", mimeType, base64);
  137. #region 处理图片存到Bolb
  138. string[] strs = imageSource.Split(',');
  139. string fileExt = StringHelper.SubMidString(strs[0], ":", ";");
  140. if (ContentTypeDict.extdict.TryGetValue(fileExt, out string ext))
  141. {
  142. fileExt = ext;
  143. }
  144. else
  145. {
  146. //解决多种扩展名不能获取的
  147. string[] sp = StringHelper.SubMidString(strs[0], "/", ";").Split("-");
  148. fileExt = sp[sp.Length - 1];
  149. sp = fileExt.Split("+");
  150. fileExt = "." + sp[sp.Length - 1];
  151. }
  152. Stream stream = new MemoryStream(Convert.FromBase64String(strs[1]));
  153. // long bizno = IdWorker.getInstance().NextId();
  154. string filename = shaCode + fileExt;
  155. AzureBlobModel model = azureBlobDBRepository.UploadFileByFolderNAsyn(stream, FolderName, filename, "exercise", false);
  156. #endregion
  157. XElement img = new XElement(Xhtml.img,
  158. new XAttribute(NoNamespace.src, model.BlobUrl),
  159. imageInfo.ImgStyleAttribute,
  160. imageInfo.AltText != null ?
  161. new XAttribute(NoNamespace.alt, imageInfo.AltText) : null);
  162. stream.Close();
  163. return img;
  164. }
  165. };
  166. // XElement html = HtmlConverter.ConvertToHtml(doc, settings);
  167. // File.WriteAllText(@"E:\document\kk.html", html.ToStringNewLineOnAttributes());
  168. XElement htmlElement = WmlToHtmlConverter.ConvertToHtml(doc, settings);
  169. var htmls = new XDocument(new XDocumentType("html", null, null, null), htmlElement);
  170. var htmlString = htmls.ToString(SaveOptions.DisableFormatting);
  171. //引入MathJax插件
  172. htmlString = htmlString + "<script type=\"text/javascript\" src=\"http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML\"></script>";
  173. //File.WriteAllText(folder + "/" + "index.html", htmlString);
  174. return new { htmlString, blobPath = FolderName + "/" + "index.html" };
  175. };
  176. }
  177. }
  178. }
  179. }