فهرست منبع

处理EMF文件错误信息

CrazyIter_Bin 4 سال پیش
والد
کامیت
2d723e3a47

+ 71 - 18
HTEXLib/DOCX/OpenXmlTool/WmlToHtmlConverter.cs

@@ -18,6 +18,7 @@ using DocumentFormat.OpenXml.Drawing;
 using DocumentFormat.OpenXml.Drawing.Charts;
 using DocumentFormat.OpenXml.Drawing.Charts;
 using DocumentFormat.OpenXml.Office2010.Word.DrawingShape;
 using DocumentFormat.OpenXml.Office2010.Word.DrawingShape;
 using DocumentFormat.OpenXml.Packaging;
 using DocumentFormat.OpenXml.Packaging;
+using HTEXLib.COMM.Helpers;
 using HTEXLib.DOCX.OpenXmlTool;
 using HTEXLib.DOCX.OpenXmlTool;
 using HTEXLib.Helpers;
 using HTEXLib.Helpers;
 using HTEXLib.Helpers.ShapeHelpers;
 using HTEXLib.Helpers.ShapeHelpers;
@@ -3761,14 +3762,16 @@ namespace OpenXmlPowerTools
             var contentType = imagePart.ContentType;
             var contentType = imagePart.ContentType;
             if (!ImageContentTypes.Contains(contentType))
             if (!ImageContentTypes.Contains(contentType))
                 return null;
                 return null;
+            var Stream = imagePart.GetStream();
             try {
             try {
+            
             if (contentType == "image/x-wmf"|| contentType == "image/x-emf")
             if (contentType == "image/x-wmf"|| contentType == "image/x-emf")
             {
             {
-                return    ProcessWmf(imagePart.GetStream(), contentType, element, hyperlinkUri, imageHandler);
+                return    ProcessWmf(Stream, contentType, element, hyperlinkUri, imageHandler);
             }
             }
             else {
             else {
-                using (var partStream = imagePart.GetStream())
-                using (var bitmap = new Bitmap(partStream))
+               
+                using (var bitmap = new Bitmap(Stream))
                 {
                 {
                     if (extentCx != null && extentCy != null)
                     if (extentCx != null && extentCy != null)
                     {
                     {
@@ -3817,12 +3820,12 @@ namespace OpenXmlPowerTools
             }
             }
             catch
             catch
             {
             {
-                Stream stream = imagePart.GetStream();
+               
                 XElement img = null;
                 XElement img = null;
-                byte[] bytes = new byte[stream.Length];
-                stream.Read(bytes, 0, bytes.Length);
+                byte[] bytes = new byte[Stream.Length];
+                Stream.Read(bytes, 0, bytes.Length);
                 // 设置当前流的位置为流的开始
                 // 设置当前流的位置为流的开始
-                stream.Seek(0, SeekOrigin.Begin);
+                Stream.Seek(0, SeekOrigin.Begin);
                 string url = System.Convert.ToBase64String(bytes);
                 string url = System.Convert.ToBase64String(bytes);
                 img = new XElement(Xhtml.img,
                 img = new XElement(Xhtml.img,
                                  new XAttribute(NoNamespace.src, "data:" + contentType + ";base64," + url),
                                  new XAttribute(NoNamespace.src, "data:" + contentType + ";base64," + url),
@@ -3850,11 +3853,24 @@ namespace OpenXmlPowerTools
             else if (contentType.Equals("image/x-emf"))
             else if (contentType.Equals("image/x-emf"))
             {
             {
                 MemoryStream memoryStream = new MemoryStream();
                 MemoryStream memoryStream = new MemoryStream();
-                Metafile inFile = new Metafile(stream);
-                //Metafile outFile = new Metafile(memoryStream, Graphics.FromHwnd(IntPtr.Zero).GetHdc(), EmfType.EmfOnly);
-                inFile.Save(memoryStream, ImageFormat.Png);
-                var ba = memoryStream.ToArray();
-                mathxml = System.Convert.ToBase64String(ba);
+                //Metafile inFile = new Metafile(stream);
+                ////Metafile outFile = new Metafile(memoryStream, Graphics.FromHwnd(IntPtr.Zero).GetHdc(), EmfType.EmfOnly);
+                //inFile.Save(memoryStream, ImageFormat.Png);
+                //var ba = memoryStream.ToArray();
+                //mathxml = System.Convert.ToBase64String(ba);
+
+                //System.Drawing.Bitmap inFile = new System.Drawing.Bitmap(stream);
+                //Graphics graphics = Graphics.FromImage(inFile);
+                //graphics.Save();
+                //graphics.Dispose();
+                //inFile.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Png);
+                //byte[] arr = new byte[memoryStream.Length];
+                //memoryStream.Position = 0;
+                //memoryStream.Read(arr, 0, (int)memoryStream.Length);
+                //memoryStream.Close();
+                //memoryStream.Dispose();
+                //mathxml =  Convert.ToBase64String(arr);
+                mathxml = "EmfBase64ConvertError";
             }
             }
             try
             try
             {
             {
@@ -3930,13 +3946,50 @@ namespace OpenXmlPowerTools
                     parser.Parse(stream, gdi);
                     parser.Parse(stream, gdi);
                     mathxml = gdi.Document.InnerXml;
                     mathxml = gdi.Document.InnerXml;
                 } else if (pp.OpenXmlPart.ContentType.Equals("image/x-emf")) {
                 } else if (pp.OpenXmlPart.ContentType.Equals("image/x-emf")) {
+                    ////var image=  SixLabors.ImageSharp.Image.Load(pp.OpenXmlPart.GetStream());
+                    ////image.Save(memoryStream, new SixLabors.ImageSharp.Formats.Png.PngEncoder());
+
+                    //var  stm= pp.OpenXmlPart.GetStream();
+                    //var parser = new EMF2StringParser();
+                    //parser.LineBreakCandidates = new[] { EmfPlusRecordType.EmfSelectObject, EmfPlusRecordType.EmfDeleteObject };
+                    //parser.SpaceCandidates = new[] { EmfPlusRecordType.EmfIntersectClipRect };
+                    //Metafile inFile = new Metafile(stm);
+                    //parser.LoadMetaFile(inFile);
+                    //parser.IsParseFailedLoggingEnabled = true;
+                    //var expected = parser.GetCombinedStringFromLoadedMetaFile();
+
+                    ////MemoryStream memoryStream = new MemoryStream();
+                    ////byte[] bytes = new byte[stm.Length];
+                    ////stm.Read(bytes, 0, bytes.Length);
+                    ////stm.Seek(0, SeekOrigin.Begin);
+                    //// 
+
+                    ////Metafile outFile = new Metafile(memoryStream, Graphics.FromHwnd(IntPtr.Zero).GetHdc(), EmfType.EmfOnly);
+                    //// inFile.Save(memoryStream, ImageFormat.Png);
+                    ////var ba = memoryStream.ToArray();
+                    //application.EnablePartialTrustCode = true;
+                    //mathxml = expected;
+
                     MemoryStream memoryStream = new MemoryStream();
                     MemoryStream memoryStream = new MemoryStream();
-                    Metafile inFile = new Metafile(pp.OpenXmlPart.GetStream());
-                    //Metafile outFile = new Metafile(memoryStream, Graphics.FromHwnd(IntPtr.Zero).GetHdc(), EmfType.EmfOnly);
-                    inFile.Save(memoryStream, ImageFormat.Png);
-                    var ba = memoryStream.ToArray();
-                    mathxml = System.Convert.ToBase64String(ba);
-                    
+                    //Metafile inFile = new Metafile(pp.OpenXmlPart.GetStream());
+                    ////Metafile outFile = new Metafile(memoryStream, Graphics.FromHwnd(IntPtr.Zero).GetHdc(), EmfType.EmfOnly);
+                    //inFile.Save(memoryStream, ImageFormat.Png);
+                    //var ba = memoryStream.ToArray();
+                    //mathxml = System.Convert.ToBase64String(ba);
+
+                    //System.Drawing.Bitmap inFile = new System.Drawing.Bitmap(pp.OpenXmlPart.GetStream());
+                    //Graphics graphics = Graphics.FromImage(inFile);
+                    //graphics.Save();
+                    //graphics.Dispose();
+                    //inFile.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Png);
+                    //byte[] arr = new byte[memoryStream.Length];
+                    //memoryStream.Position = 0;
+                    //memoryStream.Read(arr, 0, (int)memoryStream.Length);
+                    //memoryStream.Close();
+                    //memoryStream.Dispose();
+                    // mathxml = Convert.ToBase64String(arr);
+                    mathxml = "EmfBase64ConvertError";
+
                 }
                 }
                 string hyperlinkUri = null;
                 string hyperlinkUri = null;
                 var contentType = pp.OpenXmlPart.ContentType;
                 var contentType = pp.OpenXmlPart.ContentType;

+ 5 - 5
HTEXLib/HTEXLib.csproj

@@ -1,12 +1,12 @@
 <Project Sdk="Microsoft.NET.Sdk">
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
   <PropertyGroup>
     <TargetFramework>netstandard2.0</TargetFramework>
     <TargetFramework>netstandard2.0</TargetFramework>
-    <Description>修复图片节点WMF</Description>
+    <Description>解决emf转图片,图片高度被压缩形变。</Description>
     <PackageReleaseNotes>模板解析类型</PackageReleaseNotes>
     <PackageReleaseNotes>模板解析类型</PackageReleaseNotes>
     <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
     <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
-    <Version>2.3.8</Version>
-    <AssemblyVersion>2.3.8.8</AssemblyVersion>
-    <FileVersion>2.3.8.8</FileVersion>
+    <Version>2.4.1</Version>
+    <AssemblyVersion>2.4.1.1</AssemblyVersion>
+    <FileVersion>2.4.1.1</FileVersion>
   </PropertyGroup>
   </PropertyGroup>
   <ItemGroup>
   <ItemGroup>
     <PackageReference Include="DocumentFormat.OpenXml" Version="2.11.3" />
     <PackageReference Include="DocumentFormat.OpenXml" Version="2.11.3" />
@@ -15,7 +15,7 @@
     <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.8" />
     <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.8" />
     <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
     <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
     <PackageReference Include="System.ComponentModel.Annotations" Version="4.7.0" />
     <PackageReference Include="System.ComponentModel.Annotations" Version="4.7.0" />
-    <PackageReference Include="System.Drawing.Common" Version="4.7.0" />
+    <PackageReference Include="System.Drawing.Common" Version="5.0.0" />
     <PackageReference Include="System.Text.Json" Version="4.7.2" />
     <PackageReference Include="System.Text.Json" Version="4.7.2" />
   </ItemGroup>
   </ItemGroup>
   <ItemGroup>
   <ItemGroup>

+ 22 - 6
HTEXLib/Translator/HTML2ITEMV3Translator.cs

@@ -126,8 +126,9 @@ namespace HTEXLib.Translator
             }
             }
             return html;
             return html;
         }
         }
-        public List<DOCX.Models.ItemInfo> Translate(string html )
+        public (List<DOCX.Models.ItemInfo> tests, List<string> error) Translate(string html )
         {
         {
+            List<string> emferror = new List<string>();
             string mathjax = "<script type=\"text/javascript\" src=\"http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML\"></script>"; 
             string mathjax = "<script type=\"text/javascript\" src=\"http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML\"></script>"; 
             html = html.Replace(mathjax, "");
             html = html.Replace(mathjax, "");
             //去除class 以及span标签"
             //去除class 以及span标签"
@@ -198,7 +199,11 @@ namespace HTEXLib.Translator
             }
             }
             List<KeyValuePair<int[], List<ItemInfo>>> composeList = new List<KeyValuePair<int[], List<ItemInfo>>>();
             List<KeyValuePair<int[], List<ItemInfo>>> composeList = new List<KeyValuePair<int[], List<ItemInfo>>>();
             foreach(var conskey in composeKeys) {
             foreach(var conskey in composeKeys) {
-                List<DOCX.Models.ItemInfo> consInner = ConvertTest(conskey.Value.ToArray(), null);
+                (List<DOCX.Models.ItemInfo> consInner, List<string> eferror)= ConvertTest(conskey.Value.ToArray(), null);
+                if (eferror.IsNotEmpty())
+                {
+                    emferror.AddRange(eferror);
+                }
                 int stIndex = conskey.Key[0]+1;
                 int stIndex = conskey.Key[0]+1;
                 if (consInner.IsNotEmpty())
                 if (consInner.IsNotEmpty())
                 {
                 {
@@ -207,8 +212,11 @@ namespace HTEXLib.Translator
                 KeyValuePair<int[], List<ItemInfo>> innerComposeItem = new KeyValuePair<int[], List<ItemInfo>>(new int[] { conskey.Key[0], conskey.Key[1], stIndex }, consInner);
                 KeyValuePair<int[], List<ItemInfo>> innerComposeItem = new KeyValuePair<int[], List<ItemInfo>>(new int[] { conskey.Key[0], conskey.Key[1], stIndex }, consInner);
                 composeList.Add(innerComposeItem);
                 composeList.Add(innerComposeItem);
             }
             }
-            List<DOCX.Models.ItemInfo> tests= ConvertTest(array, composeList);
-            return tests;
+            (List < DOCX.Models.ItemInfo > tests,List<string> error) = ConvertTest(array, composeList);
+            if (error.IsNotEmpty()) {
+                emferror.AddRange(error);
+            }
+            return (tests, emferror);
         }
         }
 
 
         private  string BlankTag(string tagHtml) {
         private  string BlankTag(string tagHtml) {
@@ -222,8 +230,9 @@ namespace HTEXLib.Translator
             tagValue = Regex.Replace(tagValue, @"\s", "");
             tagValue = Regex.Replace(tagValue, @"\s", "");
             return tagValue;
             return tagValue;
         }
         }
-        public List<DOCX.Models.ItemInfo> ConvertTest(string[] array, List<KeyValuePair<int[], List<ItemInfo>>> composeList) {
+        public (List<DOCX.Models.ItemInfo> ItemInfo, List<string> error) ConvertTest(string[] array, List<KeyValuePair<int[], List<ItemInfo>>> composeList) {
             List<DOCX.Models.ItemInfo> tests = new List<DOCX.Models.ItemInfo>();
             List<DOCX.Models.ItemInfo> tests = new List<DOCX.Models.ItemInfo>();
+            List<string> error = new List<string>();
             //内容零时变量,追加完成后重新实例化  new StringBuilder()
             //内容零时变量,追加完成后重新实例化  new StringBuilder()
             StringBuilder content = new StringBuilder();
             StringBuilder content = new StringBuilder();
             //告知遇到新标签,内容需要重新初始化实例
             //告知遇到新标签,内容需要重新初始化实例
@@ -368,11 +377,18 @@ namespace HTEXLib.Translator
                     //如果不是标签内的则累加到内容上
                     //如果不是标签内的则累加到内容上
                     else {
                     else {
                         content.Append(array[index]);
                         content.Append(array[index]);
+                        if (array[index].Contains("EmfBase64ConvertError"))
+                        {
+                            error.Add(array[index]);
+                        }
                     }
                     }
                 }
                 }
                 else {
                 else {
                     //偶数序列为内容
                     //偶数序列为内容
                     content.Append(array[index]);
                     content.Append(array[index]);
+                    if (array[index].Contains("EmfBase64ConvertError")) {
+                        error.Add(array[index]);
+                    }
                 }
                 }
             }
             }
             if (test != null)
             if (test != null)
@@ -380,7 +396,7 @@ namespace HTEXLib.Translator
                 DoOpenTag(openTag, openTagVal, openFlag, openTagLang, content, test);
                 DoOpenTag(openTag, openTagVal, openFlag, openTagLang, content, test);
                 tests.Add(test);
                 tests.Add(test);
             }
             }
-            return tests;
+            return (tests,error);
         }
         }
         public (List<CodeValue> options,string question) OptionProcess(string question) {
         public (List<CodeValue> options,string question) OptionProcess(string question) {
             List<CodeValue> options = new List<CodeValue>();
             List<CodeValue> options = new List<CodeValue>();

+ 23 - 2
HTEXWeb/Controllers/HtexController.cs

@@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Mvc;
  
  
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
+using System.Drawing.Imaging;
 using System.IO;
 using System.IO;
 using System.Linq;
 using System.Linq;
 using System.Text;
 using System.Text;
@@ -63,8 +64,8 @@ namespace HTEXWeb.Controllers
         public IActionResult AnalyzeHtml(JsonElement request)
         public IActionResult AnalyzeHtml(JsonElement request)
         {
         {
             if (!request.TryGetProperty("htmlString", out JsonElement htmlString)) { return BadRequest(); }
             if (!request.TryGetProperty("htmlString", out JsonElement htmlString)) { return BadRequest(); }
-            var exercises = _HTML2ITEMV3Translator.Translate(htmlString.GetString());
-            return Ok(exercises);
+            (List<HTEXLib.DOCX.Models.ItemInfo> tests, List<string> error) = _HTML2ITEMV3Translator.Translate(htmlString.GetString());
+            return Ok(new { tests, error });
         }
         }
         /// <summary>
         /// <summary>
         /// htmlString AnalyzeHtml
         /// htmlString AnalyzeHtml
@@ -78,5 +79,25 @@ namespace HTEXWeb.Controllers
         //    var base64 = "data:image/png;base64,"+ _HTML2IMGSTranslator.PageScreenshotAll($"{htmlUrl}");
         //    var base64 = "data:image/png;base64,"+ _HTML2IMGSTranslator.PageScreenshotAll($"{htmlUrl}");
         //    return Ok(new { base64 });
         //    return Ok(new { base64 });
         //}
         //}
+
+        /// <summary>
+        /// htmlString AnalyzeHtml
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("parse-emf")]
+        public IActionResult EmfToPng(JsonElement request)
+        {
+            if (!request.TryGetProperty("htmlString", out JsonElement htmlString)) { return BadRequest(); }
+
+            MemoryStream memoryStream = new MemoryStream();
+            Metafile inFile = new Metafile(memoryStream);
+            //Metafile outFile = new Metafile(memoryStream, Graphics.FromHwnd(IntPtr.Zero).GetHdc(), EmfType.EmfOnly);
+            inFile.Save(memoryStream, ImageFormat.Png);
+            var ba = memoryStream.ToArray();
+            var base64 = System.Convert.ToBase64String(ba);
+           // var exercises = _HTML2ITEMV3Translator.Translate(htmlString.GetString());
+            return Ok(base64);
+        }
     }
     }
 }
 }

+ 1 - 0
HTEXWeb/HTEXWeb.csproj

@@ -9,6 +9,7 @@
     <PackageReference Include="Selenium.Support" Version="3.141.0" />
     <PackageReference Include="Selenium.Support" Version="3.141.0" />
     <PackageReference Include="Selenium.WebDriver" Version="3.141.0" />
     <PackageReference Include="Selenium.WebDriver" Version="3.141.0" />
     <PackageReference Include="Selenium.WebDriver.ChromeDriver" Version="87.0.4280.8800" />
     <PackageReference Include="Selenium.WebDriver.ChromeDriver" Version="87.0.4280.8800" />
+    <PackageReference Include="System.Drawing.Common" Version="5.0.0" />
   </ItemGroup>
   </ItemGroup>
 
 
   <ItemGroup>
   <ItemGroup>