Explorar o código

转换抛出异常。

CrazyIter_Bin %!s(int64=3) %!d(string=hai) anos
pai
achega
4128efdb87

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
HTEXLib/COMM/Globals.cs


+ 23 - 0
HTEXLib/COMM/TransException.cs

@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml.Linq;
+
+namespace HTEXLib.COMM
+{
+    public class TransException : Exception
+    {
+        public XElement node { get; set; }
+        public TransException(XElement node) : base()
+        {
+           this. node = node;
+        }
+        public TransException(XElement node,string message):base(message) {
+            this.node = node;
+        }
+        public TransException(XElement node,string message, Exception innerException) : base(message, innerException)
+        {
+            this.node = node;
+        }
+    }
+}

+ 299 - 109
HTEXLib/DOCX/OpenXmlTool/WmlToHtmlConverter.cs

@@ -18,6 +18,7 @@ using DocumentFormat.OpenXml.Drawing;
 using DocumentFormat.OpenXml.Drawing.Charts;
 using DocumentFormat.OpenXml.Office2010.Word.DrawingShape;
 using DocumentFormat.OpenXml.Packaging;
+using HTEXLib.COMM;
 using HTEXLib.COMM.Helpers;
 using HTEXLib.DOCX.OpenXmlTool;
 using HTEXLib.Helpers;
@@ -351,7 +352,7 @@ namespace OpenXmlPowerTools
 
                 foreach (var d in xhtml.DescendantsAndSelf())
                 {
-                    
+
                     var style = d.Annotation<Dictionary<string, string>>();
                     if (style == null)
                         continue;
@@ -368,11 +369,13 @@ namespace OpenXmlPowerTools
                         d.Add(st);
                 }
             }
-            if (htmlConverterSettings.TableInnerCss) {
+            if (htmlConverterSettings.TableInnerCss)
+            {
                 SetStyleElementValue(xhtml, htmlConverterSettings.GeneralCss + htmlConverterSettings.AdditionalCss);
                 foreach (var d in xhtml.DescendantsAndSelf())
                 {
-                    if (d.Name.LocalName.ToString().Equals("table") || d.Name.LocalName.ToString().Equals("tr") ||d.Name.LocalName.ToString().Equals("td")) {
+                    if (d.Name.LocalName.ToString().Equals("table") || d.Name.LocalName.ToString().Equals("tr") || d.Name.LocalName.ToString().Equals("td"))
+                    {
                         var style = d.Annotation<Dictionary<string, string>>();
                         if (style == null)
                             continue;
@@ -415,7 +418,7 @@ namespace OpenXmlPowerTools
         {
             var element = node as XElement;
             if (element == null) return null;
-
+          
             // Transform the w:document element to the XHTML h:html element.
             // The h:head element is laid out based on the W3C's recommended layout, i.e.,
             // the charset (using the HTML5-compliant form), the title (which is always
@@ -535,49 +538,104 @@ namespace OpenXmlPowerTools
             // Transform w:tr to h:tr.
             if (element.Name == W.tr)
             {
-                return ProcessTableRow(wordDoc, settings, element, currentMarginLeft);
+                try
+                {
+                    return ProcessTableRow(wordDoc, settings, element, currentMarginLeft);
+                }
+                catch (Exception ex)
+                {
+                    throw new TransException(element, $"{element.Name}{ex.Message}", ex);
+                }
             }
 
             // Transform w:tc to h:td.
             if (element.Name == W.tc)
             {
-                return ProcessTableCell(wordDoc, settings, element);
+                try
+                {
+                    return ProcessTableCell(wordDoc, settings, element);
+                }
+                catch (Exception ex)
+                {
+                    throw new TransException(element, $"{element.Name}{ex.Message}", ex);
+                }
             }
 
             // Transform images
             if (element.Name == W.drawing || element.Name == W.pict || element.Name == W._object)
             {
-                XElement xElement = ProcessImage(wordDoc, element, settings.ImageHandler);
-                return xElement;
+                try
+                {
+                    XElement xElement = ProcessImage(wordDoc, element, settings.ImageHandler);
+                    return xElement;
+                }
+                catch (Exception ex)
+                {
+                    throw new TransException(element, $"{element.Name}{ex.Message}", ex);
+                }
             }
 
             // Transform content controls.
             if (element.Name == W.sdt)
             {
-                return ProcessContentControl(wordDoc, settings, element, currentMarginLeft);
+                try
+                {
+                    return ProcessContentControl(wordDoc, settings, element, currentMarginLeft);
+                }
+                catch (Exception ex)
+                {
+                    throw new TransException(element, $"{element.Name}{ex.Message}", ex);
+                }
             }
 
             // Transform smart tags and simple fields.
             if (element.Name == W.smartTag || element.Name == W.fldSimple)
             {
-                return CreateBorderDivs(wordDoc, settings, element.Elements());
+                try
+                {
+                    return CreateBorderDivs(wordDoc, settings, element.Elements());
+                }
+                catch (Exception ex)
+                {
+                    throw new TransException(element, $"{element.Name}{ex.Message}", ex);
+                }
             }
             //处理 数学公式
             if (element.Name == M.oMath)
             {
+                try
+                {
 
-                return ProcessOMath(element);
+                    return ProcessOMath(element);
+                }
+                catch (Exception ex)
+                {
+                    throw new TransException(element, $"{element.Name}{ex.Message}", ex);
+                }
             }
             if (element.Name == M.oMathPara)
             {
-
-                return element.Elements().Select(e => ConvertToHtmlTransform(wordDoc, settings, e, false, currentMarginLeft));
+                try
+                {
+                    return element.Elements().Select(e => ConvertToHtmlTransform(wordDoc, settings, e, false, currentMarginLeft));
+                }
+                catch (Exception ex)
+                {
+                    throw new TransException(element, $"{element.Name}{ex.Message}", ex);
+                }
             }
             //处理形状
             if (element.Name == MC.AlternateContent)
             {
+                try
+                {
 
-                return ProcessAlternateContent(wordDoc, element,settings.ImageHandler);
+                    return ProcessAlternateContent(wordDoc, element, settings.ImageHandler);
+                }
+                catch (Exception ex)
+                {
+                    throw new TransException(element, $"{element.Name}{ex.Message}", ex);
+                }
             }
             //if (element.Name == MC.Choice)
             //{
@@ -594,21 +652,52 @@ namespace OpenXmlPowerTools
             // Ignore element.
             return null;
         }
-        public static XElement ProcessAlternateContent(WordprocessingDocument wordDoc, XElement element, Func<ImageInfo, XElement> imageHandler) {
+        public static XElement ProcessAlternateContent(WordprocessingDocument wordDoc, XElement element, Func<ImageInfo, XElement> imageHandler)
+        {
             var drawing = element.Element(MC.Choice).Element(W.drawing).Element(WP.inline);
-            if (drawing == null) {
+            if (drawing == null)
+            {
                 drawing = element.Element(MC.Choice).Element(W.drawing).Element(WP.anchor);
             }
-            var graphicData = drawing.Element(A.graphic).Element(A.graphicData).Elements() ;
-         
-            foreach (var elm in graphicData) {
-                if (elm.Name==WPS.wsp)
+            var graphicData = drawing.Element(A.graphic).Element(A.graphicData).Elements();
+
+            foreach (var elm in graphicData)
+            {
+                if (elm.Name == WPS.wsp)
                 {
-                    var html = ProcessWps(wordDoc, elm, imageHandler);
+                    (string html, HTEXLib.Shape shape) = ProcessWps(wordDoc, elm, imageHandler);
+                    XElement img;
+                    string mathxml = Globals.UnsupportedImage;
+                    var imageInfo = new ImageInfo()
+                    {
+                        ContentType = "image/x-emf",
+                        DrawingElement = element,
+                        AltText = "UnsupportedImageError",
+                        Mathxml = mathxml
+                    };
+                    double? widthInPoints = shape.style.position.cx;
+                    double? heightInPoints = shape.style.position.cy;
+                    img = 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;"));
+                    }
                     XElement elmt = XElement.Parse(html);
-                    return elmt;
+                    return img;
                 }
-                else if (elm.Name==WPG.wgp)
+                else if (elm.Name == WPG.wgp)
                 {
                     return ProcessWgp(wordDoc, elm, imageHandler);
                 }
@@ -616,30 +705,60 @@ namespace OpenXmlPowerTools
             return null;
         }
 
-        public static XElement ProcessWgp(WordprocessingDocument wordDoc, XElement element, Func<ImageInfo, XElement> imageHandler) {
-            var extentCx = (int?)element.Elements(WP.extent)
-                .Attributes(NoNamespace.cx).FirstOrDefault();
-            var extentCy = (int?)element.Elements(WP.extent)
-                .Attributes(NoNamespace.cy).FirstOrDefault();
-            var elms=  element.Descendants(WPS.wsp);
-            StringBuilder stringBuilder = new StringBuilder();
-            foreach (var elm in elms) {
-               var emlt= ProcessWps(wordDoc, elm, imageHandler);
-                stringBuilder.Append(emlt);
-            }
-            string svg = stringBuilder.ToString();
-            svg = $"<div>{svg}</div>";
-            XElement elmt = XElement.Parse(svg);
-            return elmt;
+        public static XElement ProcessWgp(WordprocessingDocument wordDoc, XElement element, Func<ImageInfo, XElement> imageHandler)
+        {
+            var grpSpPr = element.Element(WPG.grpSpPr);
+            var ext = grpSpPr.GetWordNodeByPath("a:xfrm/a:ext");
+            var cx = ext.Attribute("cx").Value;
+            var cy = ext.Attribute("cy").Value;
+            //var elms=  element.Descendants(WPS.wsp);
+            //StringBuilder stringBuilder = new StringBuilder();
+            //foreach (var elm in elms) {
+            //   var emlt= ProcessWps(wordDoc, elm, imageHandler);
+            //    stringBuilder.Append(emlt);
+            //}
+            //string svg = stringBuilder.ToString();
+            //svg = $"<div>{svg}</div>";
+            //XElement elmt = XElement.Parse(svg);
+
+            XElement img;
+            string mathxml = Globals.UnsupportedImage;
+            var imageInfo = new ImageInfo()
+            {
+                ContentType = "image/x-emf",
+                DrawingElement = element,
+                AltText = "UnsupportedImageError",
+                Mathxml = mathxml
+            };
+            double? widthInPoints = int.Parse(cx) * 96.0 / 914400;
+            double? heightInPoints = int.Parse(cy) * 96.0 / 914400;
+            img = 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;"));
+            }
+            return img;
         }
 
-        
+
         public static XElement ProcessChart(WordprocessingDocument wordDoc, XElement containerElement, Func<ImageInfo, XElement> imageHandler,
             int? extentCx, int? extentCy, string altText, XElement element, string hyperlinkUri)
         {
-            var ird= element.Attribute(R.id);
-           var chartird= wordDoc.MainDocumentPart.Parts.FirstOrDefault(pp => pp.RelationshipId == ird.Value);
-            ChartPart chartPart= wordDoc.MainDocumentPart.ChartParts.Where(x => x.Uri.ToString() == chartird.OpenXmlPart.Uri.ToString()).FirstOrDefault<ChartPart>();
+            var ird = element.Attribute(R.id);
+            var chartird = wordDoc.MainDocumentPart.Parts.FirstOrDefault(pp => pp.RelationshipId == ird.Value);
+            ChartPart chartPart = wordDoc.MainDocumentPart.ChartParts.Where(x => x.Uri.ToString() == chartird.OpenXmlPart.Uri.ToString()).FirstOrDefault<ChartPart>();
             if (chartPart != null)
             {
                 ChartColorStylePart ChartColorStylePart = null;
@@ -664,7 +783,7 @@ namespace OpenXmlPowerTools
                         if (child is DocumentFormat.OpenXml.Office2013.Drawing.ChartStyle.StyleEntry StyleEntry)
                         {
 
-                         //   DoStyleEntry(StyleEntry);
+                            //   DoStyleEntry(StyleEntry);
                         }
                         ///OfficeArtExtensionList   cs: extLst
                         // MarkerLayoutProperties    cs: dataPointMarkerLayout
@@ -672,56 +791,85 @@ namespace OpenXmlPowerTools
                     }
                 }
 
-               HTEXLib. Chart charts = DrawChart(wordDoc,chartPart.ChartSpace,element,imageHandler,null);
-              //  charts.links = slide.hyperlinks;
-               // return new List<Item> { charts };
+                HTEXLib.Chart charts = DrawChart(wordDoc, chartPart.ChartSpace, element, imageHandler, null);
+                //  charts.links = slide.hyperlinks;
+                // return new List<Item> { charts };
+                XElement img = null;
+                string mathxml = Globals.UnsupportedImage;
+                var imageInfo = new ImageInfo()
+                {
+                    ContentType = "image/x-emf",
+                    DrawingElement = element,
+                    AltText = "UnsupportedImageError",
+                    Mathxml = mathxml
+                };
+                img = imageHandler(imageInfo);
+                double? widthInPoints = extentCx * 96.0 / 914400;
+                double? heightInPoints = extentCy * 96.0 / 914400;
+                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;"));
+                }
+                return img;
             }
             return null;
         }
-        
-        
-        public static HTEXLib.Chart DrawChart(WordprocessingDocument wordDoc, DocumentFormat.OpenXml.Drawing.Charts.ChartSpace chartSpace,XElement element, Func<ImageInfo, XElement> ImageHandler, HTEXLib.Position positionc)
+
+
+        public static HTEXLib.Chart DrawChart(WordprocessingDocument wordDoc, DocumentFormat.OpenXml.Drawing.Charts.ChartSpace chartSpace, XElement element, Func<ImageInfo, XElement> ImageHandler, HTEXLib.Position positionc)
         {
             var Chart = chartSpace.GetFirstChild<DocumentFormat.OpenXml.Drawing.Charts.Chart>();
             var ShapeProperties = chartSpace.GetFirstChild<DocumentFormat.OpenXml.Drawing.Charts.ShapeProperties>();
-            HTEXLib.Models.HTEX.ShapeStyle shapeStyleChart = WORDHelper.DoShapeProperties(wordDoc ,ShapeProperties, element, ImageHandler, positionc);
+            HTEXLib.Models.HTEX.ShapeStyle shapeStyleChart = WORDHelper.DoShapeProperties(wordDoc, ShapeProperties, element, ImageHandler, positionc);
             var TextProperties = chartSpace.GetFirstChild<TextProperties>();
             var style = chartSpace.GetFirstChild<DocumentFormat.OpenXml.Drawing.Charts.Style>();
             var ColorMapOverride = chartSpace.GetFirstChild<DocumentFormat.OpenXml.Drawing.Charts.ColorMapOverride>();
             var style2010 = chartSpace.GetFirstChild<DocumentFormat.OpenXml.Office2010.Drawing.Charts.Style>();
             var UserShapesReference = chartSpace.GetFirstChild<UserShapesReference>();
-            var charts = DoPlotArea(Chart.PlotArea,wordDoc,element, ImageHandler,positionc);
-            HTEXLib.Models.HTEX. ShapeStyle shapeStyle = null;
+            var charts = DoPlotArea(Chart.PlotArea, wordDoc, element, ImageHandler, positionc);
+            HTEXLib.Models.HTEX.ShapeStyle shapeStyle = null;
             if (Chart.Title != null)
             {
                 var ChartShapeProperties = Chart.Title.ChartShapeProperties;
-                shapeStyle = WORDHelper.DoShapeProperties(wordDoc, ChartShapeProperties,   element, ImageHandler, positionc);
+                shapeStyle = WORDHelper.DoShapeProperties(wordDoc, ChartShapeProperties, element, ImageHandler, positionc);
             }
-           // var (PPTParagraphs, tBody) = DoChartTitle(Chart.Title);
+            // var (PPTParagraphs, tBody) = DoChartTitle(Chart.Title);
             //TextBody textBody = DrawText(PPTParagraphs, tBody);
 
             //Shape shape= new Shape { type = "Sp",uid ="Sp-" +ShaHashHelper.GetSHA1(slide.slideIndex + "-" + (Chart.Title.GetType().Name + Chart.Title.OuterXml).Trim().ToLower()), shapeType = "rect", 
             //    textBody = textBody , sid = sid + "titel" };
-           HTEXLib. Shape shape = new HTEXLib.Shape
-           {
+            HTEXLib.Shape shape = new HTEXLib.Shape
+            {
                 type = "Sp",
                 uid = Guid.NewGuid().ToString(),
                 shapeType = "rect",
-               // textBody = textBody,
-               // sid = sid + "titel"
+                // textBody = textBody,
+                // sid = sid + "titel"
             };
             shape.style.fill = shapeStyle != null ? shapeStyle.fill : null;
             shape.style.border = shapeStyle != null ? shapeStyle.border : null;
             //var  chart= new Chart {sid=sid,charts =charts,title=shape,type=type,uid = type+"-"+ ShaHashHelper.GetSHA1(slide.slideIndex + "-" + (Chart.GetType().Name + Chart.OuterXml).Trim().ToLower()) };
             var chart = new HTEXLib.Chart
             {
-               // sid = sid,
+                // sid = sid,
                 charts = charts,
                 title = shape,
-              //  type = type,
+                //  type = type,
                 uid = Guid.NewGuid().ToString(),
             };
-            HTEXLib.Position position = new  HTEXLib.Position { /*cx = width, cy = height, x = left, y = top, rot = rot */};
+            HTEXLib.Position position = new HTEXLib.Position { /*cx = width, cy = height, x = left, y = top, rot = rot */};
             chart.style.position = position;
             chart.style.fill = shapeStyleChart != null ? shapeStyleChart.fill : null;
             chart.style.border = shapeStyleChart != null ? shapeStyleChart.border : null;
@@ -753,7 +901,7 @@ namespace OpenXmlPowerTools
             }
             return chart;
         }
-        public  static List<HTEXLib. CommonChart> DoPlotArea(PlotArea plotArea, WordprocessingDocument wordDoc,  XElement element, Func<ImageInfo, XElement> ImageHandler, HTEXLib.Position positionc)
+        public static List<HTEXLib.CommonChart> DoPlotArea(PlotArea plotArea, WordprocessingDocument wordDoc, XElement element, Func<ImageInfo, XElement> ImageHandler, HTEXLib.Position positionc)
         {
             List<HTEXLib.CommonChart> charts = new List<HTEXLib.CommonChart>();
             foreach (var child in plotArea.ChildElements)
@@ -782,8 +930,8 @@ namespace OpenXmlPowerTools
                                 pieChart.pieType += "-" + ofPieType.Attribute("val").Value;
                             }
                         }
-                        serNodes = HTEXLib.ShapeHelper.GetPPTXNodeListByPath(child, "c:ser") ;
-                        pieChart.datas = ExtractChartData(serNodes,wordDoc,element, ImageHandler, positionc);
+                        serNodes = HTEXLib.ShapeHelper.GetPPTXNodeListByPath(child, "c:ser");
+                        pieChart.datas = ExtractChartData(serNodes, wordDoc, element, ImageHandler, positionc);
                         charts.Add(pieChart);
                         break;
                     case "lineChart":
@@ -978,14 +1126,14 @@ namespace OpenXmlPowerTools
                         if (spPr != null)
                         {
                             var ChartShapeProperties = new ChartShapeProperties(spPr.ToString());
-                           HTEXLib.Models.HTEX. ShapeStyle shapeStyle = WORDHelper.DoShapeProperties(wordDoc,ChartShapeProperties,element, ImageHandler, positionc);
+                            HTEXLib.Models.HTEX.ShapeStyle shapeStyle = WORDHelper.DoShapeProperties(wordDoc, ChartShapeProperties, element, ImageHandler, positionc);
                             dict.Add("colStyle", shapeStyle);
                         }
                         else
                         {
                             dict.Add("colStyle", null);
                         }
-                        var colNameNode = HTEXLib.ShapeHelper.GetPPTXNodeByPath(node,"c:tx/c:strRef/c:strCache/c:pt/c:v");
+                        var colNameNode = HTEXLib.ShapeHelper.GetPPTXNodeByPath(node, "c:tx/c:strRef/c:strCache/c:pt/c:v");
                         if (colNameNode != null)
                         {
                             dict.Add("colName", colNameNode.Value);
@@ -1029,11 +1177,40 @@ namespace OpenXmlPowerTools
         {
             var rdm = element.Attribute(R.dm);
             var dgm = wordDoc.MainDocumentPart.Parts.FirstOrDefault(pp => pp.RelationshipId == rdm.Value);
-            return null;
+            XElement img = null;
+            string mathxml = Globals.UnsupportedImage;
+            var imageInfo = new ImageInfo()
+            {
+                ContentType = "image/x-emf",
+                DrawingElement = element,
+                AltText = "UnsupportedImageError",
+                Mathxml = mathxml
+            };
+            img = imageHandler(imageInfo);
+            double? widthInPoints = extentCx * 96.0 / 914400;
+            double? heightInPoints = extentCy * 96.0 / 914400;
+            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;"));
+            }
+            return img;
         }
-        public static string ProcessWps(WordprocessingDocument wordDoc, XElement element, Func<ImageInfo, XElement> imageHandler) {
+        public static (string html, HTEXLib.Shape shape) ProcessWps(WordprocessingDocument wordDoc, XElement element, Func<ImageInfo, XElement> imageHandler)
+        {
 
-          //  var wps = element.Element(MC.Choice).Element(W.drawing).Element(WP.anchor).Element(A.graphic).Element(A.graphicData).Element(WPS.wsp);
+            //  var wps = element.Element(MC.Choice).Element(W.drawing).Element(WP.anchor).Element(A.graphic).Element(A.graphicData).Element(WPS.wsp);
             WordprocessingShape wsp = new WordprocessingShape(element.ToString());
             var ext = element.GetWordNodeByPath("wps:spPr/a:xfrm/a:ext");
             var cx = ext.Attribute("cx").Value;
@@ -1043,7 +1220,8 @@ namespace OpenXmlPowerTools
             shape.style.position = position;
             var ShapeStyle = WORDHelper.DoShapeProperties(wordDoc, wsp.GetFirstChild<DocumentFormat.OpenXml.Office2010.Word.DrawingShape.ShapeProperties>(), element, imageHandler, position);
             SlideColor slideColor = WORDHelper.DoShapeStyle(wsp.GetFirstChild<DocumentFormat.OpenXml.Office2010.Word.DrawingShape.ShapeStyle>(), wordDoc);
-            if (ShapeStyle.border != null) {
+            if (ShapeStyle.border != null)
+            {
                 shape.style.border = ShapeStyle.border;
             }
             //从ShapeProperties 获取 p:spPr
@@ -1060,7 +1238,7 @@ namespace OpenXmlPowerTools
             else
             {
                 shape.style.border = ShapeStyle.border;
-                shape.style.border.outline = ShapeStyle.border != null && ShapeStyle.border.outline != null ? ShapeStyle.border.outline : ShapeStyle.border.outline != null? ShapeStyle.border.outline:null;
+                shape.style.border.outline = ShapeStyle.border != null && ShapeStyle.border.outline != null ? ShapeStyle.border.outline : ShapeStyle.border.outline != null ? ShapeStyle.border.outline : null;
             }
             if (ShapeStyle.fill == null || ShapeStyle.fill.type == -1)
             {
@@ -1104,21 +1282,23 @@ namespace OpenXmlPowerTools
                 }
 
             }
-            return DrawingShape(shape ,pars);
+            return (DrawingShape(shape, pars), shape);
         }
 
-        public static string DrawingShape(HTEXLib.Shape shape,List<string> pars) {
-            
+        public static string DrawingShape(HTEXLib.Shape shape, List<string> pars)
+        {
+
             StringBuilder builder = new StringBuilder();
             if (shape.svg != null)
             {
                 builder.Append($"<svg xmlns='http://www.w3.org/2000/svg' style='width:{shape.style.position.cx}px;height:{shape.style.position.cy}px;rotate({shape.style.position.rot}deg); overflow: visible;'>");
-               
+
                 string bdc = shape.style.border != null && shape.style.border.color != null && shape.style.border.color.solidFill != null ? shape.style.border.color.solidFill : "none";
-                string bds = shape.style.border != null && shape.style.border.stroke != null  ? shape.style.border.stroke : "0";
+                string bds = shape.style.border != null && shape.style.border.stroke != null ? shape.style.border.stroke : "0";
                 double? bdw = shape.style.border != null && shape.style.border.outline != null && shape.style.border.outline.width != null ? shape.style.border.outline.width : 0;
                 string bgc = shape.style.fill != null && shape.style.fill != null && shape.style.fill.solidFill != null ? shape.style.fill.solidFill : "none";
-                if (shape.style.border!=null&&(shape.style.border.tailEnd != null || shape.style.border.headEnd != null)) {
+                if (shape.style.border != null && (shape.style.border.tailEnd != null || shape.style.border.headEnd != null))
+                {
                     builder.Append("<defs  xmlns='http://www.w3.org/2000/svg'>");
                     builder.Append($"<marker id='marker{shape.uid}' viewBox='0 0 20 20' refX='1' refY='10' markerWidth='10' markerHeight='20'  stroke='{bdc}' fill='{bdc}' orient='auto-start-reverse' markerUnits='strokeWidth'><path d='M 0 0 L 20 10 L 0 20 z' /></marker>");
                     builder.Append("</defs>");
@@ -1126,8 +1306,9 @@ namespace OpenXmlPowerTools
 
                 string stm = "";
                 string edm = "";
-                if (shape.style.border!=null&&shape.style.border.headEnd != null) { 
-                    stm= $" marker-start='url(#marker{ shape.uid})'" ;
+                if (shape.style.border != null && shape.style.border.headEnd != null)
+                {
+                    stm = $" marker-start='url(#marker{ shape.uid})'";
                 }
                 if (shape.style.border != null && shape.style.border.tailEnd != null)
                 {
@@ -1140,7 +1321,7 @@ namespace OpenXmlPowerTools
                 }
                 builder.Append("</svg>");
             }
-            return builder.ToString() ; 
+            return builder.ToString();
         }
         public static XElement ProcessOMath(XElement element)
         {
@@ -1175,7 +1356,7 @@ namespace OpenXmlPowerTools
 
                 }
             }
-            officeML= officeML.Replace("mml:", "");
+            officeML = officeML.Replace("mml:", "");
             XElement officeElement = XElement.Load(new StringReader(officeML));
             return officeElement;
         }
@@ -3670,9 +3851,9 @@ namespace OpenXmlPowerTools
             }
             if (element.Name == W.pict || element.Name == W._object)
             {
-                return ProcessPictureOrObject(wordDoc, element , imageHandler);
+                return ProcessPictureOrObject(wordDoc, element, imageHandler);
             }
-            
+
             return null;
         }
 
@@ -3711,14 +3892,14 @@ namespace OpenXmlPowerTools
             if (containerElement.Elements(A.graphic)
                 .Elements(A.graphicData) != null)
             {
-                XElement rest = null; 
+                XElement rest = null;
                 var elms = containerElement.Elements(A.graphic)
                  .Elements(A.graphicData).Elements();
                 foreach (var elm in elms)
                 {
                     if (elm.Name == Pic._pic)
                     {
-                        rest= ProcessPic(wordDoc, containerElement, imageHandler, extentCx, extentCy, altText, elm, hyperlinkUri);
+                        rest = ProcessPic(wordDoc, containerElement, imageHandler, extentCx, extentCy, altText, elm, hyperlinkUri);
                         break;
                     }
                     if (elm.Name == C.chart)
@@ -3735,14 +3916,16 @@ namespace OpenXmlPowerTools
                 }
                 return rest;
             }
-            else {
+            else
+            {
                 return null;
             }
 
 
         }
-      public static XElement ProcessPic(WordprocessingDocument wordDoc,  XElement containerElement, Func<ImageInfo, XElement> imageHandler,
-          int? extentCx,int? extentCy,string altText, XElement element,string hyperlinkUri) {
+        public static XElement ProcessPic(WordprocessingDocument wordDoc, XElement containerElement, Func<ImageInfo, XElement> imageHandler,
+            int? extentCx, int? extentCy, string altText, XElement element, string hyperlinkUri)
+        {
             var blipFill = containerElement.Elements(A.graphic)
                 .Elements(A.graphicData)
                 .Elements(Pic._pic).Elements(Pic.blipFill).FirstOrDefault();
@@ -3771,7 +3954,7 @@ namespace OpenXmlPowerTools
             if (!ImageContentTypes.Contains(contentType))
                 return null;
 
-            var uil=  imagePart.Uri;
+            var uil = imagePart.Uri;
             //WORDHelper.GetWordNodeByPath(wordDoc,"");
             var Stream = imagePart.GetStream();
             try
@@ -3846,17 +4029,19 @@ namespace OpenXmlPowerTools
                                         new XAttribute(NoNamespace.alt, "wrong image"));
                 return img;
             }
-            finally {
+            finally
+            {
                 Stream.Close();
             }
 
         }
 
-        public static XElement ProcessWmf(Stream  stream,string contentType, XElement element, string hyperlinkUri ,Func<ImageInfo, XElement> imageHandler)
+        public static XElement ProcessWmf(Stream stream, string contentType, XElement element, string hyperlinkUri, Func<ImageInfo, XElement> imageHandler)
         {
 
             XElement img = null;
-            string mathxml = "";
+            string base64 = "";
+            string altText = "";
             if (contentType.Equals("image/x-wmf"))
             {
                 bool compatible = false;
@@ -3865,7 +4050,7 @@ namespace OpenXmlPowerTools
                 WMFConverter.Svg.SvgGdi gdi = new WMFConverter.Svg.SvgGdi(compatible);
                 gdi.ReplaceSymbolFont = replaceSymbolFont;
                 parser.Parse(stream, gdi);
-                mathxml = gdi.Document.InnerXml;
+                base64 = gdi.Document.InnerXml;
             }
             else if (contentType.Equals("image/x-emf"))
             {
@@ -3887,7 +4072,10 @@ namespace OpenXmlPowerTools
                 //memoryStream.Close();
                 //memoryStream.Dispose();
                 //mathxml =  Convert.ToBase64String(arr);
-                mathxml = "EmfBase64ConvertError";
+                //mathxml = "EmfBase64ConvertError";
+                base64 = Globals.UnsupportedImage;
+                contentType = "image/x-emf";
+                altText = "UnsupportedImageError";
             }
             try
             {
@@ -3895,19 +4083,20 @@ namespace OpenXmlPowerTools
                 {
                     ContentType = contentType,
                     DrawingElement = element,
-                    AltText = "",
-                    Mathxml = mathxml
+                    AltText = altText,
+                    Mathxml = base64
                 };
                 var style = (string)element.Elements(VML.shape).Attributes("style").FirstOrDefault();
 
                 float? widthInPoints = null;
                 float? heightInPoints = null;
-                if (style != null) {
+                if (style != null)
+                {
                     var tokens = style.Split(';');
                     widthInPoints = WidthInPoints(tokens);
                     heightInPoints = HeightInPoints(tokens);
                 }
-                img =imageHandler(imageInfo);
+                img = imageHandler(imageInfo);
                 //var imgElement2 = imageHandler(imageInfo);
                 if (widthInPoints != null && heightInPoints != null)
                 {
@@ -3942,7 +4131,7 @@ namespace OpenXmlPowerTools
             {
                 throw new Exception(e.StackTrace);
             }
-            
+
         }
         private static XElement ProcessPictureOrObject(WordprocessingDocument wordDoc,
            XElement element, Func<ImageInfo, XElement> imageHandler)
@@ -3950,7 +4139,7 @@ namespace OpenXmlPowerTools
             var imageRid = (string)element.Elements(VML.shape).Elements(VML.imagedata).Attributes(R.id).FirstOrDefault();
             if (imageRid == null) return null;
             var pp = wordDoc.MainDocumentPart.Parts.FirstOrDefault(pp2 => pp2.RelationshipId == imageRid);
-            Stream stream = null ;
+            Stream stream = null;
             try
             {
 
@@ -3962,7 +4151,7 @@ namespace OpenXmlPowerTools
                 string mathxml = "";
                 if (pp.OpenXmlPart.ContentType.Equals("image/x-wmf"))
                 {
-                    stream= pp.OpenXmlPart.GetStream();
+                    stream = pp.OpenXmlPart.GetStream();
                     bool compatible = false;
                     bool replaceSymbolFont = false;
                     WMFConverter.Wmf.WmfParser parser = new WMFConverter.Wmf.WmfParser();
@@ -3997,7 +4186,7 @@ namespace OpenXmlPowerTools
                     //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);
@@ -4083,13 +4272,14 @@ namespace OpenXmlPowerTools
             {
                 return null;
             }
-            finally {
-                if(stream!=null)
-                stream.Close();
+            finally
+            {
+                if (stream != null)
+                    stream.Close();
             }
         }
 
-       
+
 
         private static XElement ProcessObject(WordprocessingDocument wordDoc,
             XElement element, Func<ImageInfo, XElement> imageHandler)
@@ -4105,8 +4295,8 @@ namespace OpenXmlPowerTools
                 var imagePart = (ImagePart)pp.OpenXmlPart;
                 if (imagePart == null) return null;
                 string hyperlinkUri = null;
-                
-               // WORDHelper.GetWordNodeByPath(wordDoc.MainDocumentPart.GetXDocument(), "//[@name='"+imagePart.Uri+"']");
+
+                // WORDHelper.GetWordNodeByPath(wordDoc.MainDocumentPart.GetXDocument(), "//[@name='"+imagePart.Uri+"']");
                 using (var partStream = imagePart.GetStream())
                 {
                     var contentType = imagePart.ContentType;
@@ -4161,7 +4351,7 @@ namespace OpenXmlPowerTools
             {
                 return null;
             }
-            
+
         }
 
         private static float? HeightInPoints(IEnumerable<string> tokens)

+ 3 - 3
HTEXLib/HTEXLib.csproj

@@ -4,9 +4,9 @@
     <Description>修改解析</Description>
     <PackageReleaseNotes></PackageReleaseNotes>
     <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
-    <Version>5.2107.133</Version>
-    <AssemblyVersion>5.2107.133.3</AssemblyVersion>
-    <FileVersion>5.2107.133.3</FileVersion>
+    <Version>5.2108.31</Version>
+    <AssemblyVersion>5.2108.31.1</AssemblyVersion>
+    <FileVersion>5.2108.31.1</FileVersion>
   </PropertyGroup>
   <ItemGroup>
     <PackageReference Include="DocumentFormat.OpenXml" Version="2.11.3" />

+ 1 - 1
HTEXLib/Translator/DOXC2HTMLTranslator.cs

@@ -157,7 +157,7 @@ namespace HTEXLib.Translator
                     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=\"http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML\"></script>";
+                    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) {

+ 19 - 0
HTEXTest/Program.cs

@@ -279,6 +279,25 @@ namespace HTEXTest
         }
         static void Main(string[] args)
         {
+            string base64 = @"F:\base64.txt";
+            StreamReader sr = new StreamReader(base64, Encoding.Default);
+            StringBuilder content = new StringBuilder();
+            string line;
+            while ((  line = sr.ReadLine()) != null)
+            {
+                content.Append(line);
+            }
+            byte[] bytes = Convert.FromBase64String(content.ToString());
+            // 写入文件到指定位置
+            using (System.IO.FileStream fs = new System.IO.FileStream("F:\\001.emf", System.IO.FileMode.Create, System.IO.FileAccess.Write))
+            {
+                fs.Write(bytes, 0, bytes.Length);
+                fs.Flush();
+            }
+            string aasd = "对错对错对错对对错错错错错对对对对对对错对对错对错对错错错错错错对错对错错对错对对对错对对对对错错对错对对对错错对错错对";
+            for (int i = 1; i <= aasd.Length; i++) {
+                Console.WriteLine($"{i} :   {aasd[i-1]}");
+            }
             long a = 1123; long b = 500000552;
             var c = a / b;
             string aza = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";