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 + ""; //File.WriteAllText(folder + "/" + "index.html", htmlString); foreach (var kp in Globals.replaceKP) { htmlString = htmlString.Replace(kp.Key, kp.Value); } return htmlString; }; } } } }