123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- using DocumentFormat.OpenXml.Packaging;
- using HTEXLib.COMM.Helpers;
- using HTEXLib.Helpers.ShapeHelpers;
- using HTEXLib.Models.Inner;
- using OpenXmlPowerTools;
- using System;
- using System.Collections.Generic;
- using System.Drawing.Imaging;
- using System.IO;
- using System.Linq;
- using System.Text;
- using System.Xml.Linq;
- namespace HTEXLib.Translator
- {
- public class DOXC2HTMLTranslator
- {
- public string Translate(Stream fileStream)
- {
-
- byte[] byteArray = new byte[fileStream.Length];
- fileStream.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;
- }
- else if (extension.Equals("x-emf"))
- {
- extension = "emf";
- imageFormat = ImageFormat.Emf;
- }
- if (imageFormat == null) return null;
- string base64 = null;
- string mimeType = null;
- // string shaCode = null;
- try
- {
- if (extension.Equals("wmf"))
- {
- if (!string.IsNullOrWhiteSpace(imageInfo.Mathxml))
- {
- 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;
- mimeType = "image/png";
- imageFormat = ImageFormat.Png;
- using (MemoryStream ms = new MemoryStream())
- {
- imageInfo.Bitmap.Save(ms, imageFormat);
- var ba = ms.ToArray();
- base64 = System.Convert.ToBase64String(ba);
- // shaCode = ShaHashHelper.GetSHA1(ms);
- }
- }
-
- }
- else if (extension.Equals("emf"))
- {
- if (!string.IsNullOrWhiteSpace(imageInfo.Mathxml)) {
- base64 = imageInfo.Mathxml;
- mimeType = "image/png";
- }
- }
- 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];
- }
- string url = "data:" + mimeType + ";base64," + strs[1];
- url = url.Replace("\r\n", "");
- //Stream stream = new MemoryStream(Convert.FromBase64String(strs[1]));
- // string filename = shaCode + fileExt;
- // AzureBlobModel model = azureBlobDBRepository.UploadFileByFolderNAsyn(stream, FolderName, filename, "exercise", false);
- #endregion
- XElement img = new XElement(Xhtml.img,
- new XAttribute(NoNamespace.src, url),
- // 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=\"https://lib.baomitu.com/mathjax/2.7.9/MathJax.js?config=TeX-AMS-MML_HTMLorMML\"></script>";
- //File.WriteAllText(folder + "/" + "index.html", htmlString);
-
- foreach (var kp in Globals.replaceKP) {
- htmlString = htmlString.Replace(kp.Key, kp.Value);
- }
- return htmlString;
- };
- }
- }
- }
- }
|