Browse Source

解决emf转图片,图片高度被压缩形变。

CrazyIter_Bin 4 years ago
parent
commit
d8b3a008c0

+ 131 - 106
HTEXLib/DOCX/OpenXmlTool/WmlToHtmlConverter.cs

@@ -3762,7 +3762,7 @@ namespace OpenXmlPowerTools
             if (!ImageContentTypes.Contains(contentType))
                 return null;
             try {
-            if (contentType == "image/x-wmf")
+            if (contentType == "image/x-wmf"|| contentType == "image/x-emf")
             {
                 return    ProcessWmf(imagePart.GetStream(), contentType, element, hyperlinkUri, imageHandler);
             }
@@ -3777,9 +3777,12 @@ namespace OpenXmlPowerTools
                             Bitmap = bitmap,
                             ImgStyleAttribute = new XAttribute("style",
                                 string.Format(NumberFormatInfo.InvariantInfo,
-                                    "width: {0}in; height: {1}in",
-                                    (float)extentCx / (float)ImageInfo.EmusPerInch,
-                                    (float)extentCy / (float)ImageInfo.EmusPerInch)),
+                                    "width: {0}px; " ,
+                                   // "height: {1}in",
+                                    (float)extentCx *96.0 / (float)ImageInfo.EmusPerInch
+                                   // ,
+                                    //(float)extentCy*96.0 / (float)ImageInfo.EmusPerInch
+                                    )),
                             ContentType = contentType,
                             DrawingElement = element,
                             AltText = altText,
@@ -3833,42 +3836,147 @@ namespace OpenXmlPowerTools
         {
 
             XElement img = null;
-            bool compatible = false;
-            bool replaceSymbolFont = false;
-            WMFConverter.Wmf.WmfParser parser = new WMFConverter.Wmf.WmfParser();
-            WMFConverter.Svg.SvgGdi gdi = new WMFConverter.Svg.SvgGdi(compatible);
-            gdi.ReplaceSymbolFont = replaceSymbolFont;
-            parser.Parse(stream, gdi);
-            string mathxml = gdi.Document.InnerXml;
-            using (var partStream = stream)
+            string mathxml = "";
+            if (contentType.Equals("image/x-wmf"))
             {
+                bool compatible = false;
+                bool replaceSymbolFont = false;
+                WMFConverter.Wmf.WmfParser parser = new WMFConverter.Wmf.WmfParser();
+                WMFConverter.Svg.SvgGdi gdi = new WMFConverter.Svg.SvgGdi(compatible);
+                gdi.ReplaceSymbolFont = replaceSymbolFont;
+                parser.Parse(stream, gdi);
+                mathxml = gdi.Document.InnerXml;
+            }
+            else if (contentType.Equals("image/x-emf"))
+            {
+                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);
+            }
+            try
+            {
+                var imageInfo = new ImageInfo()
+                {
+                    ContentType = contentType,
+                    DrawingElement = element,
+                    AltText = "",
+                    Mathxml = mathxml
+                };
+                var style = (string)element.Elements(VML.shape).Attributes("style").FirstOrDefault();
+                img =imageHandler(imageInfo);
+                var tokens = style.Split(';');
+                var widthInPoints = WidthInPoints(tokens);
+                var heightInPoints = HeightInPoints(tokens);
+                //var imgElement2 = imageHandler(imageInfo);
+                if (widthInPoints != null && heightInPoints != null)
+                {
+                    //imageInfo.ImgStyleAttribute = new XAttribute("style",
+                    //    string.Format(NumberFormatInfo.InvariantInfo,
+                    //        "width: {0}pt; height: {1}pt ; vertical-align: bottom;", widthInPoints, heightInPoints));
+                    img.SetAttributeValue("style", string.Format(NumberFormatInfo.InvariantInfo,
+                            "width: {0}pt; height: {1}pt ; vertical-align: bottom;", widthInPoints, heightInPoints));
+                }
+                else
+                {
+                    //imageInfo.ImgStyleAttribute = new XAttribute("style",
+                    //    string.Format(NumberFormatInfo.InvariantInfo,
+                    //        "vertical-align: middle;"));
+                    img.SetAttributeValue("style", string.Format(NumberFormatInfo.InvariantInfo,
+                            "vertical-align: middle;"));
+                }
+                if (hyperlinkUri != null)
+                {
+                    return new XElement(XhtmlNoNamespace.a,
+                        new XAttribute(XhtmlNoNamespace.href, hyperlinkUri),
+                        img);
+                }
+                return img;
+            }
+            catch (OutOfMemoryException)
+            {
+                // the Bitmap class can throw OutOfMemoryException, which means the bitmap is messed up, so punt.
+                return null;
+            }
+            catch (ArgumentException e)
+            {
+                throw new Exception(e.StackTrace);
+            }
+            
+        }
+        private static XElement ProcessPictureOrObject(WordprocessingDocument wordDoc,
+           XElement element, Func<ImageInfo, XElement> imageHandler)
+        {
+            var imageRid = (string)element.Elements(VML.shape).Elements(VML.imagedata).Attributes(R.id).FirstOrDefault();
+            if (imageRid == null) return null;
+
+            try
+            {
+                var pp = wordDoc.MainDocumentPart.Parts.FirstOrDefault(pp2 => pp2.RelationshipId == imageRid);
+                if (pp == null) return null;
+                if (!pp.OpenXmlPart.ContentType.Equals("image/x-wmf")&& !pp.OpenXmlPart.ContentType.Equals("image/x-emf")) {
+                    return ProcessObject(wordDoc, element, imageHandler);
+                }
+                string mathxml="";
+                if (pp.OpenXmlPart.ContentType.Equals("image/x-wmf")) {
+                    Stream stream = pp.OpenXmlPart.GetStream();
+                    bool compatible = false;
+                    bool replaceSymbolFont = false;
+                    WMFConverter.Wmf.WmfParser parser = new WMFConverter.Wmf.WmfParser();
+                    WMFConverter.Svg.SvgGdi gdi = new WMFConverter.Svg.SvgGdi(compatible);
+                    gdi.ReplaceSymbolFont = replaceSymbolFont;
+                    parser.Parse(stream, gdi);
+                    mathxml = gdi.Document.InnerXml;
+                } else if (pp.OpenXmlPart.ContentType.Equals("image/x-emf")) {
+                    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);
+                    
+                }
+                string hyperlinkUri = null;
+                var contentType = pp.OpenXmlPart.ContentType;
+                if (!ImageContentTypes.Contains(contentType))
+                    return null;
                 try
                 {
+                    XElement img = null;
                     var imageInfo = new ImageInfo()
                     {
                         ContentType = contentType,
                         DrawingElement = element,
                         AltText = "",
-                        Mathxml = mathxml
-                    };
+                        Mathxml = mathxml,
 
+                    };
                     var style = (string)element.Elements(VML.shape).Attributes("style").FirstOrDefault();
-                    if (style == null) return imageHandler(imageInfo);
+                   // if (style == null) {
+                       // return imageHandler(imageInfo);
+                       img = imageHandler(imageInfo);
+                   // }  
 
                     var tokens = style.Split(';');
                     var widthInPoints = WidthInPoints(tokens);
                     var heightInPoints = HeightInPoints(tokens);
-                    var imgElement2 = imageHandler(imageInfo);
+                   // var imgElement2 = imageHandler(imageInfo);
                     if (widthInPoints != null && heightInPoints != null)
                     {
-                        imageInfo.ImgStyleAttribute = new XAttribute("style",
-                            string.Format(NumberFormatInfo.InvariantInfo,
+                        //imageInfo.ImgStyleAttribute = new XAttribute("style",
+                        //    string.Format(NumberFormatInfo.InvariantInfo,
+                        //        "width: {0}pt; height: {1}pt ; vertical-align: bottom;", widthInPoints, heightInPoints));
+                        img.SetAttributeValue("style", string.Format(NumberFormatInfo.InvariantInfo,
                                 "width: {0}pt; height: {1}pt ; vertical-align: bottom;", widthInPoints, heightInPoints));
                     }
                     else
                     {
-                        imageInfo.ImgStyleAttribute = new XAttribute("style",
-                            string.Format(NumberFormatInfo.InvariantInfo,
+                        //imageInfo.ImgStyleAttribute = new XAttribute("style",
+                        //    string.Format(NumberFormatInfo.InvariantInfo,
+                        //        "vertical-align: middle;"));
+                        img.SetAttributeValue("style", string.Format(NumberFormatInfo.InvariantInfo,
                                 "vertical-align: middle;"));
                     }
 
@@ -3876,9 +3984,9 @@ namespace OpenXmlPowerTools
                     {
                         return new XElement(XhtmlNoNamespace.a,
                             new XAttribute(XhtmlNoNamespace.href, hyperlinkUri),
-                            imgElement2);
+                            img);
                     }
-                    return imgElement2;
+                    return img;
                 }
                 catch (OutOfMemoryException)
                 {
@@ -3889,90 +3997,7 @@ namespace OpenXmlPowerTools
                 {
                     throw new Exception(e.StackTrace);
                 }
-            }
-        }
-        private static XElement ProcessPictureOrObject(WordprocessingDocument wordDoc,
-           XElement element, Func<ImageInfo, XElement> imageHandler)
-        {
-            var imageRid = (string)element.Elements(VML.shape).Elements(VML.imagedata).Attributes(R.id).FirstOrDefault();
-            if (imageRid == null) return null;
-
-            try
-            {
-                var pp = wordDoc.MainDocumentPart.Parts.FirstOrDefault(pp2 => pp2.RelationshipId == imageRid);
-                if (pp == null) return null;
-                if (!pp.OpenXmlPart.ContentType.Equals("image/x-wmf")) {
-                    return ProcessObject(wordDoc, element, imageHandler);
-                }
-                Stream stream = pp.OpenXmlPart.GetStream();
-                bool compatible = false;
-                bool replaceSymbolFont = false;
-                WMFConverter.Wmf.WmfParser parser = new WMFConverter.Wmf.WmfParser();
-                WMFConverter.Svg.SvgGdi gdi = new WMFConverter.Svg.SvgGdi(compatible);
-                gdi.ReplaceSymbolFont = replaceSymbolFont;
-                parser.Parse(stream, gdi);
-                string mathxml = gdi.Document.InnerXml;
-
-                //byte[] buffer = new byte[stream.Length];
-                //stream.Read(buffer, 0, buffer.Length);
-                //stream.Close();
-                //string  base64 = System.Convert.ToBase64String(buffer);
-                // var imagePart = (ImagePart)pp.OpenXmlPart;
-                // if (imagePart == null) return null;
-                string hyperlinkUri = null;
-                var contentType = pp.OpenXmlPart.ContentType;
-                if (!ImageContentTypes.Contains(contentType))
-                    return null;
-
-                using (var partStream = stream)
-                {
-                    try
-                    {
-                        var imageInfo = new ImageInfo()
-                        {
-                            ContentType = contentType,
-                            DrawingElement = element,
-                            AltText = "",
-                            Mathxml= mathxml
-                        };
-
-                        var style = (string)element.Elements(VML.shape).Attributes("style").FirstOrDefault();
-                        if (style == null) return imageHandler(imageInfo);
-
-                        var tokens = style.Split(';');
-                        var widthInPoints = WidthInPoints(tokens);
-                        var heightInPoints = HeightInPoints(tokens);
-                        var imgElement2 = imageHandler(imageInfo);
-                        if (widthInPoints != null && heightInPoints != null)
-                        {
-                            imageInfo.ImgStyleAttribute = new XAttribute("style",
-                                string.Format(NumberFormatInfo.InvariantInfo,
-                                    "width: {0}pt; height: {1}pt ; vertical-align: bottom;", widthInPoints, heightInPoints)); 
-                        }
-                        else {
-                            imageInfo.ImgStyleAttribute = new XAttribute("style",
-                                string.Format(NumberFormatInfo.InvariantInfo,
-                                    "vertical-align: middle;"));
-                        }
-
-                        if (hyperlinkUri != null)
-                        {
-                            return new XElement(XhtmlNoNamespace.a,
-                                new XAttribute(XhtmlNoNamespace.href, hyperlinkUri),
-                                imgElement2);
-                        }
-                        return imgElement2;
-                    }
-                    catch (OutOfMemoryException)
-                    {
-                        // the Bitmap class can throw OutOfMemoryException, which means the bitmap is messed up, so punt.
-                        return null;
-                    }
-                    catch (ArgumentException e)
-                    {
-                        throw new Exception(e.StackTrace);
-                    }
-                }
+               
             }
             catch (ArgumentOutOfRangeException)
             {

+ 3 - 3
HTEXLib/HTEXLib.csproj

@@ -4,9 +4,9 @@
     <Description>修复图片节点WMF</Description>
     <PackageReleaseNotes>模板解析类型</PackageReleaseNotes>
     <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
-    <Version>2.3.6</Version>
-    <AssemblyVersion>2.3.6.6</AssemblyVersion>
-    <FileVersion>2.3.6.6</FileVersion>
+    <Version>2.3.8</Version>
+    <AssemblyVersion>2.3.8.8</AssemblyVersion>
+    <FileVersion>2.3.8.8</FileVersion>
   </PropertyGroup>
   <ItemGroup>
     <PackageReference Include="DocumentFormat.OpenXml" Version="2.11.3" />

+ 9 - 5
HTEXLib/Translator/DOXC2HTMLTranslator.cs

@@ -63,7 +63,7 @@ namespace HTEXLib.Translator
                             if (imageFormat == null) return null;
                             string base64 = null;
                             string mimeType = null;
-                            string shaCode = null;
+                           // string shaCode = null;
                             try
                             {
                                 if (extension.Equals("wmf"))
@@ -73,7 +73,7 @@ namespace HTEXLib.Translator
                                         var buffer = Encoding.Default.GetBytes(imageInfo.Mathxml);
                                         base64 = System.Convert.ToBase64String(buffer);
                                         mimeType = "image/svg+xml";
-                                        shaCode = ShaHashHelper.GetSHA1(new MemoryStream(buffer));
+                                     //   shaCode = ShaHashHelper.GetSHA1(new MemoryStream(buffer));
                                     }
                                     else {
                                         ImageFormat format = imageInfo.Bitmap.RawFormat;
@@ -85,13 +85,17 @@ namespace HTEXLib.Translator
                                             imageInfo.Bitmap.Save(ms, imageFormat);
                                             var ba = ms.ToArray();
                                             base64 = System.Convert.ToBase64String(ba);
-                                            shaCode = ShaHashHelper.GetSHA1(ms);
+                                          //  shaCode = ShaHashHelper.GetSHA1(ms);
                                         }
                                     }
                                    
                                 }
                                else if (extension.Equals("emf"))
                                 {
+                                    if (!string.IsNullOrWhiteSpace(imageInfo.Mathxml)) {
+                                        base64 = imageInfo.Mathxml;
+                                        mimeType = "image/png";
+                                    }
                                 }
                                 else
                                 {
@@ -105,7 +109,7 @@ namespace HTEXLib.Translator
                                         imageInfo.Bitmap.Save(ms, imageFormat);
                                         var ba = ms.ToArray();
                                         base64 = System.Convert.ToBase64String(ba);
-                                        shaCode = ShaHashHelper.GetSHA1(ms);
+                                       // shaCode = ShaHashHelper.GetSHA1(ms);
                                     }
                                 }
                             }
@@ -133,7 +137,7 @@ namespace HTEXLib.Translator
                             url = url.Replace("\r\n", "");
 
                             //Stream stream = new MemoryStream(Convert.FromBase64String(strs[1]));
-                            string filename = shaCode + fileExt;
+                          //  string filename = shaCode + fileExt;
                             //  AzureBlobModel model = azureBlobDBRepository.UploadFileByFolderNAsyn(stream, FolderName, filename, "exercise", false);
                             #endregion
                             XElement img = new XElement(Xhtml.img,

File diff suppressed because it is too large
+ 6 - 0
HTEXTest/Program.cs


+ 3 - 3
HTEXWeb/Config/LangConfigV3.json

@@ -21,7 +21,7 @@
         "Analysis": "解析",
         "Score": "配分",
         "Point": "知识点",
-        "Filed": "知识|理解|应用|分析|综合|评鉴",
+        "Filed": "记忆|理解|应用|分析|创造|评价",
         "Judge": "对|错",
         "Ended": "结束",
         "Level": "难度"
@@ -45,7 +45,7 @@
         "Analysis": "解析",
         "Score": "配分",
         "Point": "知識點",
-        "Filed": "知識|理解|應用|分析|綜合|評鑒",
+        "Filed": "記憶|理解|應用|分析|創造|評鑒",
         "Judge": "對|錯",
         "Ended": "結束",
         "Level": "難度"
@@ -69,7 +69,7 @@
         "Analysis": "Explain",
         "Score": "Score",
         "Point": "Point",
-        "Filed": "Knowledge|Understand|Using|Analyse|Synthesize|Discern",
+        "Filed": "Remember|Understand|Apply|Analyze|Create|Evaluate",
         "Judge": "True|False",
         "Ended": "Ended",
         "Level": "Level"