Selaa lähdekoodia

GenTextBody 代码编写

CrazyIter 5 vuotta sitten
vanhempi
commit
c26658671c

+ 2 - 0
TEAMModelOS.Service/Models/PowerPoint/Item.cs

@@ -6,10 +6,12 @@ namespace HiTeachCC.Model.PowerPoint
 {
     public abstract class Item
     {
+        // Sp  CxnSp Media Group
         public string Type { get; set; }
         public Position Position { get; set; }
         public string Xml { get; set; }
         public int Index { get; set; }
+        public Svg Svg { get; set; }
         //public Picture Picture { get; set; }
         //public Shape Shape { get; set; }
         //public Math Math { get; set; }

+ 1 - 0
TEAMModelOS.Service/Models/PowerPoint/Shape.cs

@@ -27,6 +27,7 @@ namespace HiTeachCC.Model.PowerPoint
         public List<SvgShape> SvgShape { get; set; }
         public string Defs { get; set; }
         public string Transform { get; set; }
+        public string SvgData { get; set; }
        
     }
 

+ 234 - 37
TEAMModelOS.Service/Services/PowerPoint/Implement/ShapeGenerator.cs

@@ -12,6 +12,7 @@ using System.Xml.Linq;
 using TEAMModelOS.SDK.Context.Constant;
 using TEAMModelOS.SDK.Context.Constant.Common;
 using TEAMModelOS.SDK.Context.Exception;
+using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
 using TEAMModelOS.SDK.Helper.Security.ShaHash;
 using TEAMModelOS.SDK.Module.AzureBlob.Container;
 using TEAMModelOS.SDK.Module.AzureBlob.Interfaces;
@@ -26,7 +27,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
     public class ShapeGenerator : IShapeGenerator
     {
 
-      
+
         private string fileShaCode { get; set; }
         private bool isDone = false;
         private List<object> MsgQueue = new List<object>();
@@ -280,9 +281,10 @@ namespace HiTeachCC.Service.PowerPoint.Implement
             {
                 var nodes = spTreeNode.ChildNodes;
                 int order = 1;
+                List<Item> items = new List<Item>();
                 foreach (XmlNode node in nodes)
                 {
-                    result += await ProcessNodesInSlide(node.Name, node, order, warpObj);
+                    await ProcessNodesInSlide(items, node.Name, node, order, warpObj);
                     order += 1;
                 }
             }
@@ -290,41 +292,39 @@ namespace HiTeachCC.Service.PowerPoint.Implement
             return result;
         }
 
-        public async Task<string> ProcessNodesInSlide(string nodeKey, XmlNode node, int order, WarpObj warpObj)
+        public async Task ProcessNodesInSlide(List<Item> items, string nodeKey, XmlNode node, int order, WarpObj warpObj)
         {
-            string result = "";
+            //  string result = "";
 
             switch (nodeKey)
             {
                 case "p:sp":    // Shape, Text
-                    result = await ProcessSpNode(node, order, warpObj);
+                    await ProcessSpNode(node, order, warpObj);
                     break;
                 case "p:cxnSp":    // Shape, Text (with connection)
-                    result = await ProcessCxnSpNode(node, order, warpObj);
+                    await ProcessCxnSpNode(node, order, warpObj);
                     break;
                 case "p:pic":    // Picture
-                    await ProcessPicNode(node, order, warpObj);
+                    items.Add(await ProcessPicNode(node, order, warpObj));
                     break;
                 case "p:graphicFrame":    // Chart, Diagram, Table
-                    result = ProcessGraphicFrameNode(node, order, warpObj);
+                    ProcessGraphicFrameNode(items, node, order, warpObj);
                     break;
                 case "p:grpSp":
-                    await ProcessGroupSpNode(node, order, warpObj);
+                    await ProcessGroupSpNode(items, node, order, warpObj);
                     break;
                 case "mc:AlternateContent": //Equations and formulas as Image  处理公式 方程等
                     var mcFallbackNode = node.GetTextByPath("mc:Fallback/p:sp");
-                    result = await ProcessSpNode(mcFallbackNode, order, warpObj);
+                    await ProcessSpNode(mcFallbackNode, order, warpObj);
                     break;
                 default:
                     break;
             }
-            return result;
         }
 
-        public async Task<string> ProcessGroupSpNode(XmlNode node, int order, WarpObj warpObj)
+        public async Task ProcessGroupSpNode(List<Item> items, XmlNode node, int order, WarpObj warpObj)
         {
             var factor = 1.00 * px96 / px914400;
-
             var xfrmNode = node.GetTextByPath("p:grpSpPr/a:xfrm");
             var x = int.Parse(xfrmNode.GetTextByPath("a:off/@x").Value) * factor;
             var y = int.Parse(xfrmNode.GetTextByPath("a:off/@y").Value) * factor;
@@ -334,22 +334,29 @@ namespace HiTeachCC.Service.PowerPoint.Implement
             var cy = int.Parse(xfrmNode.GetTextByPath("a:ext/@cy").Value) * factor;
             var chcx = int.Parse(xfrmNode.GetTextByPath("a:chExt/@cx").Value) * factor;
             var chcy = int.Parse(xfrmNode.GetTextByPath("a:chExt/@cy").Value) * factor;
-            string result = "<div class='block group' style='z-index: " + order + "; top: " + (y - chy) + "px; left: " + (x - chx) + "px; width: " + (cx - chcx) + "px; height: " + (cy - chcy) + "px;'>";
-
+            var rotate = ShapeHelper.AngleToDegrees(xfrmNode.GetTextByPath("@rot"));
+            string result = "<div class='block group' style='z-index: " + order + "; top: " + (y - chy) + "px; left: " + (x - chx) + "px;" +
+                " width: " + (cx - chcx) + "px; height: " + (cy - chcy) + "px;'>";
+            Group group = new Group();
+            group.Position = new Position { X = x - chx, Y = y - chy, Cx = cx - chcx, Cy = cy - chcy, Rot = rotate };
+            group.Type = "Group";
+            group.Index = order++;
             // Procsee all child nodes
             var nodes = node.ChildNodes;
+            List<Item> gpIterm = new List<Item>();
             foreach (XmlNode nd in nodes)
             {
-                result += await ProcessNodesInSlide(nd.Name, nd, order, warpObj);
+                await ProcessNodesInSlide(gpIterm, nd.Name, nd, order, warpObj);
                 order += 1;
             }
-
+            group.Shapes = gpIterm;
+            items.Add(group);
             result += "</div>";
 
-            return result;
+            //return result;
         }
 
-        public string ProcessGraphicFrameNode(XmlNode node, int order, WarpObj warpObj)
+        public string ProcessGraphicFrameNode(List<Item> items, XmlNode node, int order, WarpObj warpObj)
         {
             var result = "";
             var graphicTypeUri = node.GetTextByPath("a:graphic/a:graphicData/uri");
@@ -370,8 +377,6 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                         break;
                 }
             }
-
-
             return result;
         }
 
@@ -393,10 +398,9 @@ namespace HiTeachCC.Service.PowerPoint.Implement
 
         public async Task<string> ProcessCxnSpNode(XmlNode node, int order, WarpObj warpObj)
         {
-
             var id = node.GetTextByPath("p:nvCxnSpPr/p:cNvPr/@id");
             var name = node.GetTextByPath("p:nvCxnSpPr/p:cNvPr/@name");
-            return await GenShape(node, null, null, id, name, null, null, order, warpObj);
+            return await GenShape("CxnSp", node, null, null, id, name, null, null, order, warpObj);
         }
 
         public async Task<string> ProcessSpNode(XmlNode node, int order, WarpObj warpObj)
@@ -437,12 +441,11 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                     // type = getTextByPathList(slideMasterSpNode, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "type"]);
                 }
             }
-            string s = await GenShape(node, slideLayoutSpNode, slideMasterSpNode, id, name, idx, type, order, warpObj);
-
+            string s = await GenShape("Sp", node, slideLayoutSpNode, slideMasterSpNode, id, name, idx, type, order, warpObj);
             return "";
         }
 
-        public async Task<string> GenShape(XmlNode node, XmlNode slideLayoutSpNode, XmlNode slideMasterSpNode, XmlNode id, XmlNode name, XmlNode idx, XmlNode type, int order, WarpObj warpObj)
+        public async Task<string> GenShape(string ShapeType, XmlNode node, XmlNode slideLayoutSpNode, XmlNode slideMasterSpNode, XmlNode id, XmlNode name, XmlNode idx, XmlNode type, int order, WarpObj warpObj)
         {
             var xfrmList = "p:spPr/a:xfrm";
             var slideXfrmNode = node.GetTextByPath(xfrmList);
@@ -503,8 +506,9 @@ namespace HiTeachCC.Service.PowerPoint.Implement
             var shapeBorder = ShapeHelper.GetBorder(node, true, "shape", slideLayoutClrOvride, warpObj.slideMasterContent, warpObj.themeContent);
             var headEndNodeAttrs = node.GetTextByPath("p:spPr/a:ln/a:headEnd");
             var tailEndNodeAttrs = node.GetTextByPath("p:spPr/a:ln/a:tailEnd");
-            StringBuilder svgPath = new StringBuilder("<svg class='drawing' _id='" + order + id + "' _idx='" + order + idx + "' _type='" + order + type + "' _name='" + order + name+ "'");
-            svgPath.Append(" style='top:"+position.Y+"px;left:"+position.X+ "px;width:"+position.Cx+ "px;height"+position.Cy+"px;'");
+            Svg shapeSvg = new Svg { Id = order + "", Width = position.Cx + "", Height = position.Cy + "", Top = position.X + "", Left = position.Y + "", Transform = "rotate(" + position.Rot + "deg)" };
+            StringBuilder svgPath = new StringBuilder("<svg class='drawing' _id='" + order + id + "' _idx='" + order + idx + "' _type='" + order + type + "' _name='" + order + name + "'");
+            svgPath.Append(" style='top:" + position.Y + "px;left:" + position.X + "px;width:" + position.Cx + "px;height" + position.Cy + "px;'");
             if (shapeType != null || custShapType != null)
             {
 
@@ -517,8 +521,8 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                 //            "'>";
                 //result += "<defs>";
                 // Fill Color
-               
-              
+
+
                 var clrFillType = ShapeHelper.GetFillType(node.GetTextByPath("p:spPr"));
                 /////////////////////////////////////////                    
                 if (clrFillType == "GRADIENT_FILL")
@@ -528,6 +532,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                     var angl = Fill.Rot;
 
                     var svgGrdnt = ShapeHelper.GetSvgGradient(position.Cx, position.Cy, angl, color_arry, order, slideLayoutClrOvride, warpObj.themeContent);
+                    shapeSvg.Defs = svgGrdnt;
                     //fill="url(#linGrd)"
                     Fill.SvgText = svgGrdnt;
                     result += svgGrdnt;
@@ -536,6 +541,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                 {
                     imgFillFlg = true;
                     var svgBgImg = ShapeHelper.GetSvgImagePattern(Fill.Image, order);
+                    shapeSvg.Defs = svgBgImg;
                     //fill="url(#imgPtrn)"
                     //console.log(svgBgImg)
                     Fill.SvgText = svgBgImg;
@@ -546,6 +552,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                     if (clrFillType != null && clrFillType != "SOLID_FILL" && clrFillType != "PATTERN_FILL")
                     {
                         Fill.HtmlText = "none";
+                        Fill.Color = "none";
                     }
                     if (shapeType != null)
                     {
@@ -556,13 +563,14 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                             shapeType.Value == "leftBrace" ||
                             shapeType.Value == "rightBrace" ||
                             shapeType.Value == "rightBracket")
-                            { //Temp. solution  - TODO
-                                Fill.HtmlText = "none";
-                            }
+                        { //Temp. solution  - TODO
+                            Fill.HtmlText = "none";
+                            Fill.Color = "none";
+                        }
                     }
 
                 }
-              
+
                 // type: none, triangle, stealth, diamond, oval, arrow
 
                 if ((headEndNodeAttrs != null && (headEndNodeAttrs.GetTextByPath("@type").Value == "triangle" || (headEndNodeAttrs.GetTextByPath("@type").Value == "arrow")) ||
@@ -575,12 +583,201 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                 result += "</defs>";
             }
 
-            if (shapeType != null && custShapType == null) {
-                result+= ShapeSvg.GenShapeSvg(node, order, shapeType, isFlipV, position, grndFillFlg, imgFillFlg, Fill, shapeBorder, headEndNodeAttrs, tailEndNodeAttrs);
+            if (shapeType != null && custShapType == null)
+            {
+                Svg svg = ShapeSvg.GenShapeSvg(node, order, shapeType, isFlipV, position, grndFillFlg, imgFillFlg, Fill, shapeBorder, headEndNodeAttrs, tailEndNodeAttrs);
+                shapeSvg.SvgShape = svg.SvgShape;
+                shapeSvg.SvgData = svg.SvgData;
+                if (ShapeType.Equals("Sp"))
+                {
+                    Shape  shape=  new Shape { Border = shapeBorder, Fill = Fill, Svg = shapeSvg, Type = "Sp", Position = position, Index = order, ShapeType = shapeType.Value };
+                    
+                    var txbody = node.GetTextByPath("p:txBody");
+                    if (txbody != null) {
+                        List<Paragraph> paragraphs= GenTextBody(txbody, node, slideLayoutSpNode, slideMasterSpNode, type, warpObj);
+                    }
+                   
+                }
+                else if (ShapeType.Equals("CxnSp"))
+                {
+                    new Connector { Border = shapeBorder, Svg = shapeSvg, Type = "CxnSp", Position = position, Index = order, CxnType = shapeType.Value };
+                }
+
+            }
+            else {
+
             }
+            
             return result;
         }
 
+        private List<Paragraph> GenTextBody(XmlNode textBodyNode, XmlNode node, XmlNode slideLayoutSpNode, XmlNode slideMasterSpNode, XmlNode type, WarpObj warpObj)
+        {
+            var slideMasterTextStyles = warpObj.slideMasterTextStyles;
+            string vert = GetVerticalAlign(node, slideLayoutSpNode, slideMasterSpNode);
+            var ps= textBodyNode.GetTextByPathList("a:p");
+            if (ps != null) {
+                foreach (XmlNode pNode in ps) {
+                    var rNode = pNode.GetTextByPathList("a:r");
+                    GetHorizontalAlign(pNode, slideLayoutSpNode, slideMasterSpNode, type, slideMasterTextStyles);
+                   BuChar buChar=  GenBuChar(pNode, node, slideLayoutSpNode, slideMasterSpNode, type, warpObj);
+                }
+            }
+            return null;
+        }
+
+        private BuChar GenBuChar(XmlNode node, XmlNode spNode, XmlNode slideLayoutSpNode, XmlNode slideMasterSpNode, XmlNode type, WarpObj warpObj)
+        {
+            var sldMstrTxtStyles = warpObj.slideMasterTextStyles;
+            var slideMasterContent = warpObj.slideMasterContent;
+            var themeContent = warpObj.themeContent;
+            var rNodes=  node.GetTextByPathList("a:r");
+            XmlNode rNode = null;
+            if (rNodes != null) {
+                rNode = rNodes[0];
+            }
+            XmlNode dfltBultColor, dfltBultSize, bultColor, bultSize;
+            if (rNode !=  null)
+            {
+                dfltBultColor = GetFontColorPr(rNode, spNode, type, sldMstrTxtStyles, slideMasterContent , themeContent);
+            }
+                throw new NotImplementedException();
+        }
+
+        private XmlNode GetFontColorPr(XmlNode node, XmlNode spNode, XmlNode type, XmlNode sldMstrTxtStyles , XmlNode slideMasterContent ,XmlNode themeContent)
+        {
+            var rPrNode = node.GetTextByPath("a:rPr");
+            string filTyp,  textBordr;
+            string color = null;
+            if (rPrNode != null) {
+                filTyp = ShapeHelper.GetFillType(rPrNode);
+                if (filTyp == "SOLID_FILL")
+                {
+                    var solidFillNode = node.GetTextByPath( "a:rPr/a:solidFill");
+                    string  colorstr = ShapeHelper.GetSolidFill(solidFillNode , slideLayoutClrOvride, slideMasterContent , themeContent);
+                    color =  PowerPointHelper.ColorToning(solidFillNode.OuterXml, colorstr);
+                     
+                }
+                else if (filTyp == "PATTERN_FILL")
+                {
+                    var pattFill = node.GetTextByPath("a:rPr/a:pattFill");
+                    Fill colorFill = ShapeHelper. GetPatternFill(pattFill ,slideLayoutClrOvride,slideMasterContent,themeContent);
+
+                    if (colorFill != null && colorFill.gradColor.IsNotEmpty())
+                    {
+                        color = colorFill.gradColor[0];
+                    }
+                    else {
+                        color = "000000";
+                    }
+                }
+                else
+                {
+                    var sPstyle = spNode.GetTextByPath("p:style/a:fontRef");
+                    if (sPstyle !=null)
+                    {
+                        string colorstr   = ShapeHelper.GetSolidFill(sPstyle,slideLayoutClrOvride,slideMasterContent,themeContent);
+                        color = PowerPointHelper.ColorToning(sPstyle.OuterXml, colorstr);
+                    }
+                }
+            }
+            if (color == null) {
+                color = "000000";
+            }
+            var txtBrdrNode = node.GetTextByPath("a:rPr/a:ln");
+            if (txtBrdrNode != null) {
+                var txBrd = ShapeHelper.GetBorder(node,true,"text",slideLayoutClrOvride,slideMasterContent,themeContent);
+            }
+            throw new NotImplementedException();
+        }
+
+        public string GetVerticalAlign(XmlNode node, XmlNode slideLayoutSpNode, XmlNode slideMasterSpNode ) {
+            XmlDocument doc = new XmlDocument();
+            doc.LoadXml(node.OuterXml);
+            XmlNode anchor = doc.GetTextByPath("//p:txBody/a:bodyPr/@anchor");
+            if (anchor == null)
+            {
+                if (slideLayoutSpNode != null)
+                {
+                    doc.LoadXml(slideLayoutSpNode.OuterXml);
+                    anchor = doc.GetTextByPath("//p:txBody/a:bodyPr/@anchor");
+                }
+                if (anchor == null && slideMasterSpNode != null)
+                {
+                    doc.LoadXml(slideMasterSpNode.OuterXml);
+                    anchor = doc.GetTextByPath("//p:txBody/a:bodyPr/@anchor");
+                }
+            }
+            if (anchor != null)
+            {
+                return anchor.Value.Equals("ctr") ? "v-mid" : anchor.Value.Equals("b") ? "v-down" : "v-up";
+            }
+            else
+            {
+                return "v-up";
+            }
+        }
+        public string GetHorizontalAlign(XmlNode node, XmlNode slideLayoutSpNode, XmlNode slideMasterSpNode,
+            XmlNode typeNode, XmlNode slideMasterTextStyles)
+        {
+            XmlDocument doc = new XmlDocument();
+            doc.LoadXml(node.OuterXml);
+            XmlNode algn = doc.GetTextByPath("//a:pPr/@algn");
+            if (algn == null)
+            {
+                if (slideLayoutSpNode != null)
+                {
+                    doc.LoadXml(slideLayoutSpNode.OuterXml);
+                    algn = doc.GetTextByPath("//p:txBody/a:p/a:pPr/@algn");
+                }
+
+                if (algn == null && slideMasterSpNode != null)
+                {
+                    doc.LoadXml(slideMasterSpNode.OuterXml);
+                    algn = doc.GetTextByPath("//p:txBody/a:p/a:pPr/@algn");
+                }
+                if (algn == null && typeNode != null)
+                {
+                    switch (typeNode.Value)
+                    {
+                        case "title":
+                        case "subTitle":
+                        case "ctrTitle":
+                            //doc.LoadXml(slideMasterStyle.TypeTable.OuterXml);
+                            doc.LoadXml(slideMasterTextStyles.OuterXml);
+                            algn = doc.GetTextByPath("//p:titleStyle/a:lvl1pPr/@algn");
+                            break;
+                        case "body":
+                            doc.LoadXml(slideMasterTextStyles.OuterXml);
+                            algn = doc.GetTextByPath("//p:bodyStyle/a:lvl1pPr/@algn");
+                            break;
+                        default:
+                            //  doc.LoadXml(slideMasterStyle.TypeTable.OuterXml);
+                            doc.LoadXml(slideMasterTextStyles.OuterXml);
+                            algn = doc.GetTextByPath("//p:otherStyle/a:lvl1pPr/@algn");
+                            break;
+                    }
+                }
+            }
+            if (algn == null)
+            {
+                if (typeNode == null)
+                {
+                    return "h-left";
+                }
+                if (typeNode.Value.Equals("title") || typeNode.Value.Equals("subTitle") || typeNode.Value.Equals("ctrTitle"))
+                {
+                    return "h-mid";
+                }
+                else if (typeNode.Value == "sldNum")
+                {
+                    return "h-right";
+                }
+                else if (typeNode.Value.Equals("body")) { return "h-left"; }
+            }
+            return algn.Value.Equals("ctr") ? "h-mid" : algn.Value.Equals("r") ? "h-right" : "h-left";
+        }
+
         /// <summary>
         /// 幻灯片 背景色填充
         /// </summary>
@@ -1034,7 +1231,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         {
             var xfrmList = "p:spPr/a:xfrm";
             var xfrmNode = node.GetTextByPath(xfrmList);
-            Media media = new Media() { Type = "Pic" };
+            Media media = new Media() { Type = "Media" };
             var id = node.GetTextByPath("p:nvPicPr/p:cNvPr/@id");
             XmlNode slideLayoutSpNode = ShapeHelper.GetNodesTable(id, null, null, warpObj, "Layout");
             XmlNode slideMasterSpNode = ShapeHelper.GetNodesTable(id, null, null, warpObj, "Master");

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 303 - 302
TEAMModelOS.Service/Services/PowerPoint/Implement/ShapeSvg.cs


+ 3 - 2
TEAMModelOS/Startup.cs

@@ -11,11 +11,13 @@ using Microsoft.AspNetCore.Builder;
 using Microsoft.AspNetCore.Hosting;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.Mvc;
 using Microsoft.AspNetCore.SpaServices;
 using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Hosting;
 using Microsoft.IdentityModel.Tokens;
+using Newtonsoft.Json;
 using TEAMModelOS.SDK.Context.Attributes.Azure;
 using TEAMModelOS.SDK.Context.Configuration;
 using TEAMModelOS.SDK.Context.Filter;
@@ -96,7 +98,7 @@ namespace TEAMModelOS
             //    });
             //});
             services.AddMemoryCache();
-            services.AddControllers().AddNewtonsoftJson();
+            services.AddControllers().AddNewtonsoftJson().AddJsonOptions(options => { options.JsonSerializerOptions.IgnoreNullValues = true; });
             //上传文件最大处理
             services.Configure<FormOptions>(x =>
             {   x.BufferBodyLengthLimit= long.MaxValue;
@@ -105,7 +107,6 @@ namespace TEAMModelOS
                 x.MultipartHeadersLengthLimit = int.MaxValue;
             });
 
-
             // Table配置
             services.AddScoped<IAzureTableDBRepository, AzureTableDBRepository>();
             //使用Blob配置