DOXC2HTMLTranslator.cs 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. using DocumentFormat.OpenXml.Packaging;
  2. using HTEXLib.COMM.Helpers;
  3. using HTEXLib.Helpers.ShapeHelpers;
  4. using HTEXLib.Models.Inner;
  5. using OpenXmlPowerTools;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Drawing.Imaging;
  9. using System.IO;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Xml.Linq;
  13. namespace HTEXLib.Translator
  14. {
  15. public class DOXC2HTMLTranslator
  16. {
  17. public string Translate(Stream fileStream)
  18. {
  19. byte[] byteArray = new byte[fileStream.Length];
  20. fileStream.Read(byteArray, 0, byteArray.Length);
  21. //byte[] bytes = new byte[stream.Length];
  22. using (MemoryStream memoryStream = new MemoryStream())
  23. {
  24. memoryStream.Write(byteArray, 0, byteArray.Length);
  25. using (WordprocessingDocument doc = WordprocessingDocument.Open(memoryStream, true))
  26. {
  27. int imageCounter = 0;
  28. WmlToHtmlConverterSettings settings = new WmlToHtmlConverterSettings()
  29. {
  30. PageTitle = "",
  31. AdditionalCss = "body { margin: 1cm auto; max-width: 20cm; padding: 0; }",
  32. FabricateCssClasses = true,
  33. CssClassPrefix = "pt-",
  34. RestrictToSupportedLanguages = false,
  35. RestrictToSupportedNumberingFormats = false,
  36. ImageHandler = imageInfo =>
  37. {
  38. ++imageCounter;
  39. string extension = imageInfo.ContentType.Split('/')[1].ToLower();
  40. ImageFormat imageFormat = null;
  41. if (extension.Equals("png")) imageFormat = ImageFormat.Png;
  42. else if (extension.Equals("gif")) imageFormat = ImageFormat.Gif;
  43. else if (extension.Equals("bmp")) imageFormat = ImageFormat.Bmp;
  44. else if (extension.Equals("jpeg")) imageFormat = ImageFormat.Jpeg;
  45. else if (extension.Equals("tiff"))
  46. {
  47. extension = "gif";
  48. imageFormat = ImageFormat.Gif;
  49. }
  50. else if (extension.Equals("x-wmf"))
  51. {
  52. extension = "wmf";
  53. imageFormat = ImageFormat.Wmf;
  54. }
  55. else if (extension.Equals("x-emf"))
  56. {
  57. extension = "emf";
  58. imageFormat = ImageFormat.Emf;
  59. }
  60. if (imageFormat == null) return null;
  61. string base64 = null;
  62. string mimeType = null;
  63. // string shaCode = null;
  64. try
  65. {
  66. if (extension.Equals("wmf"))
  67. {
  68. if (!string.IsNullOrWhiteSpace(imageInfo.Mathxml))
  69. {
  70. var buffer = Encoding.Default.GetBytes(imageInfo.Mathxml);
  71. base64 = System.Convert.ToBase64String(buffer);
  72. mimeType = "image/svg+xml";
  73. // shaCode = ShaHashHelper.GetSHA1(new MemoryStream(buffer));
  74. }
  75. else {
  76. ImageFormat format = imageInfo.Bitmap.RawFormat;
  77. mimeType = "image/png";
  78. imageFormat = ImageFormat.Png;
  79. using (MemoryStream ms = new MemoryStream())
  80. {
  81. imageInfo.Bitmap.Save(ms, imageFormat);
  82. var ba = ms.ToArray();
  83. base64 = System.Convert.ToBase64String(ba);
  84. // shaCode = ShaHashHelper.GetSHA1(ms);
  85. }
  86. }
  87. }
  88. else if (extension.Equals("emf"))
  89. {
  90. if (!string.IsNullOrWhiteSpace(imageInfo.Mathxml)) {
  91. base64 = imageInfo.Mathxml;
  92. mimeType = "image/png";
  93. }
  94. }
  95. else
  96. {
  97. ImageFormat format = imageInfo.Bitmap.RawFormat;
  98. ImageCodecInfo codec = ImageCodecInfo.GetImageDecoders()
  99. .First(c => c.FormatID == format.Guid);
  100. mimeType = codec.MimeType;
  101. using (MemoryStream ms = new MemoryStream())
  102. {
  103. imageInfo.Bitmap.Save(ms, imageFormat);
  104. var ba = ms.ToArray();
  105. base64 = System.Convert.ToBase64String(ba);
  106. // shaCode = ShaHashHelper.GetSHA1(ms);
  107. }
  108. }
  109. }
  110. catch (System.Runtime.InteropServices.ExternalException)
  111. { return null; }
  112. string imageSource =
  113. string.Format("data:{0};base64,{1}", mimeType, base64);
  114. #region 处理图片存到Bolb
  115. string[] strs = imageSource.Split(',');
  116. string fileExt = StringHelper.SubMidString(strs[0], ":", ";");
  117. if (ContentTypeDict.extdict.TryGetValue(fileExt, out string ext))
  118. {
  119. fileExt = ext;
  120. }
  121. else
  122. {
  123. //解决多种扩展名不能获取的
  124. string[] sp = StringHelper.SubMidString(strs[0], "/", ";").Split('-');
  125. fileExt = sp[sp.Length - 1];
  126. sp = fileExt.Split('+');
  127. fileExt = "." + sp[sp.Length - 1];
  128. }
  129. string url = "data:" + mimeType + ";base64," + strs[1];
  130. url = url.Replace("\r\n", "");
  131. //Stream stream = new MemoryStream(Convert.FromBase64String(strs[1]));
  132. // string filename = shaCode + fileExt;
  133. // AzureBlobModel model = azureBlobDBRepository.UploadFileByFolderNAsyn(stream, FolderName, filename, "exercise", false);
  134. #endregion
  135. XElement img = new XElement(Xhtml.img,
  136. new XAttribute(NoNamespace.src, url),
  137. // new XAttribute(NoNamespace.src, model.BlobUrl),
  138. imageInfo.ImgStyleAttribute,
  139. imageInfo.AltText != null ?
  140. new XAttribute(NoNamespace.alt, imageInfo.AltText) : null);
  141. //stream.Close();
  142. return img;
  143. }
  144. };
  145. // XElement html = HtmlConverter.ConvertToHtml(doc, settings);
  146. // File.WriteAllText(@"E:\document\kk.html", html.ToStringNewLineOnAttributes());
  147. XElement htmlElement = WmlToHtmlConverter.ConvertToHtml(doc, settings);
  148. var htmls = new XDocument(new XDocumentType("html", null, null, null), htmlElement);
  149. var htmlString = htmls.ToString(SaveOptions.DisableFormatting);
  150. //引入MathJax插件
  151. htmlString = htmlString + "<script type=\"text/javascript\" src=\"https://lib.baomitu.com/mathjax/2.7.9/MathJax.js?config=TeX-AMS-MML_HTMLorMML\"></script>";
  152. //File.WriteAllText(folder + "/" + "index.html", htmlString);
  153. foreach (var kp in Globals.replaceKP) {
  154. htmlString = htmlString.Replace(kp.Key, kp.Value);
  155. }
  156. return htmlString;
  157. };
  158. }
  159. }
  160. }
  161. }