123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- using DocumentFormat.OpenXml.Packaging;
- using HtmlAgilityPack;
- using Microsoft.AspNetCore.Http;
- using OpenXmlPowerTools;
- using System;
- using System.Collections.Generic;
- using System.Drawing.Imaging;
- using System.IO;
- using System.Linq;
- using System.Text;
- using System.Text.RegularExpressions;
- using System.Threading.Tasks;
- using System.Xml.Linq;
- using TEAMModelOS.SDK.Context.Constant;
- using TEAMModelOS.SDK.Extension.SnowFlake;
- using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
- using TEAMModelOS.SDK.Helper.Common.FileHelper;
- using TEAMModelOS.SDK.Helper.Common.StringHelper;
- using TEAMModelOS.SDK.Helper.Security.ShaHash;
- using TEAMModelOS.SDK.Module.AzureBlob.Container;
- using TEAMModelOS.SDK.Module.AzureBlob.Interfaces;
- using TEAMModelOS.SDK.Module.AzureTable.Interfaces;
- using TEAMModelOS.Service.Models.Core;
- using TEAMModelOS.Service.Services.Exam.Interfaces;
- namespace TEAMModelOS.Service.Services.Exam.Implements
- {
- public class ImportExerciseService : IImportExerciseService
- {
-
-
- private readonly IAzureBlobDBRepository azureBlobDBRepository;
- private readonly IAzureTableDBRepository azureTableDBRepository;
- public ImportExerciseService(IAzureBlobDBRepository _azureBlobDBRepository, IAzureTableDBRepository _azureTableDBRepository)
- {
- azureBlobDBRepository = _azureBlobDBRepository;
- azureTableDBRepository = _azureTableDBRepository;
- }
- public async Task<Dictionary<string, object>> UploadWord(IFormFile file)
- {
- Dictionary<string, object> resdict = new Dictionary<string, object>();
- string shaCode = ShaHashHelper.GetSHA1(file.OpenReadStream());
- long length = file.Length;
- Dictionary<string, object> dict = new Dictionary<string, object> { { "Sha1Code", shaCode } };
- List<AzureBlobModel> models = await azureTableDBRepository.FindListByDict<AzureBlobModel>(dict);
- //if (models.IsNotEmpty())
- //{
- // resdict.Add("HtmlString", HttpHelper.HttpGet(models[0].BlobUrl));
- // resdict.Add("Sha1Code", models[0].Sha1Code);
- // return resdict;
- //}
- string folder = shaCode + "";
- //System.IO.Directory.CreateDirectory(folder);
- // var filePath = folder + "\\" + file.FileName;
- //using (var stream = new FileStream(filePath, FileMode.Create))
- //{
- // await file.CopyToAsync(stream);
- //}
- var htmlInfo = ConvertDocxToHtml(file, folder);
- AzureBlobModel model = await azureBlobDBRepository.UploadTextByFolder(htmlInfo.htmlString, "",htmlInfo.blobPath, "exercise",false);
- model.Sha1Code = shaCode;
- await azureTableDBRepository.Save<AzureBlobModel>(model);
- // FileHelper.DeleteDirAndFiles(BaseConfigModel.ContentRootPath + "/Upload");
- resdict.Add("HtmlString", htmlInfo.htmlString);
- resdict.Add("Sha1Code", shaCode);
- return resdict;
- }
- public dynamic ConvertDocxToHtml(IFormFile file, string folder)
- {
- string FolderName = DateTime.Now.ToString("yyyyMMdd")+"/"+ folder;
- byte[] byteArray = new byte[file.OpenReadStream().Length];
- file.OpenReadStream().Read(byteArray, 0, byteArray.Length);
- //byte[] bytes = new byte[stream.Length];
- using (MemoryStream memoryStream = new MemoryStream())
- {
- memoryStream.Write(byteArray, 0, byteArray.Length);
- using (WordprocessingDocument doc = WordprocessingDocument.Open(memoryStream, true))
- {
- int imageCounter = 0;
- WmlToHtmlConverterSettings settings = new WmlToHtmlConverterSettings()
- {
- PageTitle = "",
- AdditionalCss = "body { margin: 1cm auto; max-width: 20cm; padding: 0; }",
- FabricateCssClasses = true,
- CssClassPrefix = "pt-",
- RestrictToSupportedLanguages = false,
- RestrictToSupportedNumberingFormats = false,
- ImageHandler = imageInfo =>
- {
- ++imageCounter;
- string extension = imageInfo.ContentType.Split('/')[1].ToLower();
- ImageFormat imageFormat = null;
- if (extension.Equals("png")) imageFormat = ImageFormat.Png;
- else if (extension.Equals("gif")) imageFormat = ImageFormat.Gif;
- else if (extension.Equals("bmp")) imageFormat = ImageFormat.Bmp;
- else if (extension.Equals("jpeg")) imageFormat = ImageFormat.Jpeg;
- else if (extension.Equals("tiff"))
- {
- extension = "gif";
- imageFormat = ImageFormat.Gif;
- }
- else if (extension.Equals("x-wmf"))
- {
- extension = "wmf";
- imageFormat = ImageFormat.Wmf;
- }
- if (imageFormat == null) return null;
- string base64 = null;
- string mimeType = null;
- string shaCode = null;
- try
- {
- if (extension.Equals("wmf"))
- {
- var buffer = Encoding.Default.GetBytes(imageInfo.Mathxml);
- base64 = System.Convert.ToBase64String(buffer);
- mimeType = "image/svg+xml";
- shaCode = ShaHashHelper.GetSHA1(new MemoryStream(buffer));
- }
- else
- {
- ImageFormat format = imageInfo.Bitmap.RawFormat;
- ImageCodecInfo codec = ImageCodecInfo.GetImageDecoders()
- .First(c => c.FormatID == format.Guid);
- mimeType = codec.MimeType;
- using (MemoryStream ms = new MemoryStream())
- {
- imageInfo.Bitmap.Save(ms, imageFormat);
- var ba = ms.ToArray();
- base64 = System.Convert.ToBase64String(ba);
- shaCode = ShaHashHelper.GetSHA1(ms);
- }
- }
- }
- catch (System.Runtime.InteropServices.ExternalException)
- { return null; }
- string imageSource =
- string.Format("data:{0};base64,{1}", mimeType, base64);
- #region 处理图片存到Bolb
- string[] strs = imageSource.Split(',');
- string fileExt = StringHelper.SubMidString(strs[0], ":", ";");
- if (ContentTypeDict.extdict.TryGetValue(fileExt, out string ext))
- {
- fileExt = ext;
- }
- else
- {
- //解决多种扩展名不能获取的
- string[] sp = StringHelper.SubMidString(strs[0], "/", ";").Split("-");
- fileExt = sp[sp.Length - 1];
- sp = fileExt.Split("+");
- fileExt = "." + sp[sp.Length - 1];
- }
- Stream stream = new MemoryStream(Convert.FromBase64String(strs[1]));
- // long bizno = IdWorker.getInstance().NextId();
- string filename = shaCode + fileExt;
- AzureBlobModel model = azureBlobDBRepository.UploadFileByFolderNAsyn(stream, FolderName, filename, "exercise", false);
- #endregion
- XElement img = new XElement(Xhtml.img,
- new XAttribute(NoNamespace.src, model.BlobUrl),
- imageInfo.ImgStyleAttribute,
- imageInfo.AltText != null ?
- new XAttribute(NoNamespace.alt, imageInfo.AltText) : null);
- stream.Close();
- return img;
- }
- };
- // XElement html = HtmlConverter.ConvertToHtml(doc, settings);
- // File.WriteAllText(@"E:\document\kk.html", html.ToStringNewLineOnAttributes());
- XElement htmlElement = WmlToHtmlConverter.ConvertToHtml(doc, settings);
- var htmls = new XDocument(new XDocumentType("html", null, null, null), htmlElement);
- var htmlString = htmls.ToString(SaveOptions.DisableFormatting);
- //引入MathJax插件
- htmlString = htmlString + "<script type=\"text/javascript\" src=\"http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML\"></script>";
- //File.WriteAllText(folder + "/" + "index.html", htmlString);
- return new { htmlString, blobPath = FolderName + "/" + "index.html" };
- };
- }
- }
- }
- }
|