ImportExerciseService.cs 9.8 KB

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