Explorar o código

PPT 解析提交

黄贺彬 %!s(int64=5) %!d(string=hai) anos
pai
achega
e645a08a2d

+ 1 - 1
HiTeachCC.Model/HiTeachCC.Model.csproj

@@ -4,7 +4,7 @@
     <TargetFramework>netcoreapp2.2</TargetFramework>
   </PropertyGroup>
   <ItemGroup>
-    <PackageReference Include="TEAMModelOS.SDK" Version="1.0.6" />
+    <PackageReference Include="TEAMModelOS.SDK" Version="1.0.10" />
   </ItemGroup>
   <ItemGroup>
     <Folder Include="Teach\Dtos\" />

+ 1 - 1
HiTeachCC.Model/PowerPoint/Border.cs

@@ -7,7 +7,7 @@ namespace HiTeachCC.Model.PowerPoint
     public  class Border
     {
 
-        public string Width { get; set; }
+        public int Width { get; set; }
         public string Color { get; set; }
         public string Type { get; set; }
         /// <summary>

+ 2 - 1
HiTeachCC.Model/PowerPoint/Fill.cs

@@ -7,7 +7,8 @@ namespace HiTeachCC.Model.PowerPoint
     public class Fill
     {
         /// <summary>
-        /// 1.纯色填充 2.渐变填充 3.图片或纹理填充 4.图案填充
+        /// [a:noFill, solidFill, gradFill, blipFill, pattFill, grpFill]
+        ///0,无填充 1.纯色填充 2.渐变填充 3.图片或纹理填充 4.图案填充
         /// </summary>
         public string Type;
         public string Color;

+ 14 - 2
HiTeachCC.Model/PowerPoint/Paragraph.cs

@@ -11,13 +11,25 @@ namespace HiTeachCC.Model.PowerPoint
         public Paragraph() {
             Texts = new List<Text>();
         }
+        public BuChar BuChar { get; set; }
         public List<Text> Texts { get; set; }
     }
     public class Text
     {
-        public string Content;
-        public FontStyle FontStyle; 
+        public string Content { get; set; }
+        public string Href { get; set; }
+      
+        public FontStyle FontStyle { get; set; }
     }
+
+    public class BuChar{
+        public int MarginLeft { get; set; }
+        public int MarginRiht { get; set; }
+        public string Buchar { get; set; }
+        public string Typeface { get; set; }
+        public string FontSize { get; set; }
+    }
+
     public class ParagraphStyle
     {
         public string LeftMargin { get; set; }

+ 11 - 11
HiTeachCC.Model/PowerPoint/Position.cs

@@ -7,27 +7,27 @@ namespace HiTeachCC.Model.PowerPoint
     public class Position
     {
         //旋转角度
-        public Int64 Rot { get; set; }
+        public Int64 Rot { get; set; } = 0;
         //水平翻转
-        public bool FlipH { get; set; }
+        public bool FlipH { get; set; } = false;
         //垂直翻转
-        public bool FlipV { get; set; }
+        public bool FlipV { get; set; } = false;
         //x轴
-        public Int64 X { get; set; }
+        public Int64 X { get; set; } = 0;
         //y轴
-        public Int64 Y { get; set; }
+        public Int64 Y { get; set; } = 0;
         //宽度
-        public Int64 Cx { get; set; }
+        public Int64 Cx { get; set; } = 0;
         //高度
-        public Int64 Cy { get; set; }
+        public Int64 Cy { get; set; } = 0;
         //初始坐标x
-        public Int64 ChX { get; set; }
+        public Int64 ChX { get; set; } = 0;
         //初始坐标Y
-        public Int64 ChY { get; set; }
+        public Int64 ChY { get; set; } = 0;
         //拉伸宽度
-        public Int64 ChCX { get; set; }
+        public Int64 ChCX { get; set; } = 0;
         //拉伸高度
-        public Int64 ChCY { get; set; }
+        public Int64 ChCY { get; set; } = 0;
         //层级
         public int Index { get; set; }
     }

+ 1 - 1
HiTeachCC.Model/PowerPoint/Shape.cs

@@ -7,7 +7,7 @@ namespace HiTeachCC.Model.PowerPoint
      public class Shape : Item
     { 
         public string ShapeType;
-        public Paragraph Paragraph { get; set; }
+        public List<Paragraph> Paragraph { get; set; }
         public Fill Fill { get; set; }
         public Border Border { get; set; }
 

+ 3 - 2
HiTeachCC.Model/PowerPoint/Slide.cs

@@ -8,10 +8,11 @@ namespace HiTeachCC.Model.PowerPoint
     {
         public Slide()
         {
-            Items = new List<Item>();
+            Items = new List<object>();
         }
-        public List<Item> Items { get; set; }
+        public List<object> Items { get; set; }
         public Fill Fill { get; set; }
         public string Xml { get; set; }
+        public int index { get; set; } 
     }
 }

+ 1 - 1
HiTeachCC.Service/Core/Implement/LoginInfoService.cs

@@ -272,7 +272,7 @@ namespace HiTeachCC.Service.Core.Implement
 
         public async Task<JwtResponse> TeamModelLogin(TicketInfo ticketInfo)
         {
-            string authorizationCode = HttpContextHelper.GetAuthorizationCode(httpContextAccessor, "");
+            string authorizationCode = HttpContextHelper.GetAuthorizationCode(httpContextAccessor);
             if (string.IsNullOrEmpty(authorizationCode))
             {
                 if (ticketInfo != null && string.IsNullOrEmpty(ticketInfo.Ticket))

+ 1 - 1
HiTeachCC.Service/HiTeachCC.Service.csproj

@@ -4,7 +4,7 @@
     <TargetFramework>netcoreapp2.2</TargetFramework>
   </PropertyGroup>
   <ItemGroup>
-    <PackageReference Include="TEAMModelOS.SDK" Version="1.0.6" />
+    <PackageReference Include="TEAMModelOS.SDK" Version="1.0.10" />
   </ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\HiTeachCC.Library\HiTeachCC.Library.csproj" />

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1071 - 31
HiTeachCC.Service/PowerPoint/Implement/PowerPointHelper.cs


+ 360 - 97
HiTeachCC.Service/PowerPoint/Implement/PowerPointService.cs

@@ -11,6 +11,9 @@ using System.IO;
 using System.Linq;
 using System.Xml;
 using ColorMap = DocumentFormat.OpenXml.Presentation.ColorMap;
+using Paragraph = HiTeachCC.Model.PowerPoint.Paragraph;
+using Shape = HiTeachCC.Model.PowerPoint.Shape;
+using Text = HiTeachCC.Model.PowerPoint.Text;
 using Theme = DocumentFormat.OpenXml.Drawing.Theme;
 
 namespace HiTeachCC.Service.PowerPoint.Implement
@@ -19,7 +22,8 @@ namespace HiTeachCC.Service.PowerPoint.Implement
     {
         const double inchpixel = 96.00, inchpt = 72.00, pxBase = 914400.00, ptBase = 12700;
         const double rotBase = 60000.00;
-
+        public Dictionary<string, Dictionary<string ,string >> styleTable = new Dictionary<string, Dictionary<string, string>>();
+       
         /// <summary>
         /// 加载PPTX文件
         /// </summary>
@@ -72,7 +76,9 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                     double y = presentation.SlideSize.Cy * inchpixel / pxBase;
                     List<HiTeachCC.Model.PowerPoint.Slide> slides = new List<HiTeachCC.Model.PowerPoint.Slide>();
                     string slideMasterXml = slideMaster.OuterXml;
-                    Style slideMasterStyle = PowerPointHelper.IndexNodes(slideMasterXml);
+                    Style slideMasterTables = PowerPointHelper.IndexNodes(slideMasterXml);
+
+                    XmlDocument SlideMasterTextStyles= PowerPointHelper.GetSlideMasterTextStyles(slideMasterXml);
                     if (presentation.SlideIdList != null)
                     {
 
@@ -81,14 +87,20 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                         // 获取的是几页PPT数量
                         foreach (var slideId in presentation.SlideIdList.Elements<SlideId>())
                         {
-                            HiTeachCC.Model.PowerPoint.Slide slide = new HiTeachCC.Model.PowerPoint.Slide();
+                           
+                           // HiTeachCC.Model.PowerPoint.Slide slide = new HiTeachCC.Model.PowerPoint.Slide();
                             // 获取这一页 PPT 的id 
                             string id = slideId.RelationshipId;
                             SlidePart slidePart = presentationPart.GetPartById(slideId.RelationshipId) as SlidePart;
+                           
+                            if (slidePart.Uri.ToString().Equals("/ppt/slides/slide10.xml"))
+                            {
+                                string a = "";
+                            }
                             //获取当前页 PPT 的所有元素
                             // slide.Items = GetSlideElement(slidePart, theme, colorMap);
                             //slide.Xml = slidePart.Slide.OuterXml;
-                            GetSlideElement(slidePart, slideMaster, slideMasterColors, theme, slideMasterStyle);
+                            HiTeachCC.Model.PowerPoint.Slide slide = GetSlideElement(slidePart, slideMaster, slideMasterColors, theme, slideMasterTables ,   SlideMasterTextStyles , pageSize);
                             slides.Add(slide);
                             pageSize++;
                         }
@@ -106,15 +118,21 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         /// <param name="slideMaster"></param>
         /// <param name="slideMasterColors"></param>
         /// <param name="theme"></param>
-        /// <param name="slideMasterStyle"></param>
+        /// <param name="slideMasterTables"></param>
         /// <returns></returns>
-        public HiTeachCC.Model.PowerPoint.Slide GetSlideElement(SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> slideMasterColors, Theme theme, Style slideMasterStyle)
+        public HiTeachCC.Model.PowerPoint.Slide GetSlideElement(SlidePart slidePart, SlideMaster slideMaster, 
+            Dictionary<string, string> slideMasterColors, Theme theme,
+            Style slideMasterTables, XmlDocument SlideMasterTextStyles  , int pageSize)
         {
+
+            Model.PowerPoint.Slide slide = new Model.PowerPoint.Slide() { index = pageSize };
+            //用Layout colorMap覆盖 master ColorMap 
+            slideMasterColors = PowerPointHelper.GetLayoutOrMasterColors(slidePart, slideMasterColors, theme);
             //slidePart.SlideLayoutPart;
             string bgColor = PowerPointHelper.GetSlideBackgroundFill(slidePart, slideMaster, slideMasterColors, theme);
             string slideLayoutXml = slidePart.SlideLayoutPart.SlideLayout.OuterXml;
 
-            var slideLayoutStyle = PowerPointHelper.IndexNodes(slideLayoutXml);
+            var slideLayoutTables = PowerPointHelper.IndexNodes(slideLayoutXml);
 
             var shapeTrees = from shap in slidePart.Slide.Descendants<ShapeTree>() select shap;
             if (shapeTrees.Count() > 0 && shapeTrees.First().ChildElements.Count > 0)
@@ -137,11 +155,14 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                 int index = 0;
                 foreach (OpenXmlElement element in openXmlElements)
                 {
-                    ProcessNodesInSlide(element, slidePart, slideMaster, slideMasterColors, index, position, slideLayoutStyle, slideMasterStyle);
+                    if (element is DocumentFormat.OpenXml.Presentation.NonVisualGroupShapeProperties np  || element is DocumentFormat.OpenXml.Presentation.GroupShapeProperties gp  ) {
+                        continue;
+                    }
+                    slide.Items.Add( ProcessNodesInSlide(element, slidePart, slideMaster, slideMasterColors, index, position, slideLayoutTables, slideMasterTables ,   SlideMasterTextStyles,theme));
                     index++;
                 }
             }
-            return null;
+            return slide;
         }
         /// <summary>
         /// 单个元素分类
@@ -152,49 +173,49 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         /// <param name="slideMasterColors"></param>
         /// <param name="index"></param>
         /// <param name="position"></param>
-        /// <param name="slideLayoutStyle"></param>
-        /// <param name="slideMasterStyle"></param>
+        /// <param name="slideLayoutTables"></param>
+        /// <param name="slideMasterTables"></param>
         /// <returns></returns>
-        public string ProcessNodesInSlide(OpenXmlElement element,
+        public object ProcessNodesInSlide(OpenXmlElement element,
             SlidePart slidePart,
             SlideMaster slideMaster,
-            Dictionary<string, string> slideMasterColors,
+            Dictionary<string, string> colorMaps,
             int index,
             HiTeachCC.Model.PowerPoint.Position position,
-            Style slideLayoutStyle,
-            Style slideMasterStyle)
+            Style slideLayoutTables,
+            Style slideMasterTables , XmlDocument SlideMasterTextStyles, Theme theme)
         {
-            if (element is DocumentFormat.OpenXml.Presentation.Shape sp)//p:sp  形状
+            if (element is DocumentFormat.OpenXml.Presentation.Picture pic)//p:pic  图片
             {
-                //  pptElement = ShapeConvert(shape, theme, colorMap, index);
-                ProcessSpNode(sp, slidePart, slideMaster, slideMasterColors, index, position, slideLayoutStyle, slideMasterStyle);
-            }
-            else if (element is DocumentFormat.OpenXml.Presentation.Picture pic)//p:pic  图片
-            {
-                ProcessPicNode(pic, slidePart, slideMaster, slideMasterColors, index, position, slideLayoutStyle, slideMasterStyle);
+                return ProcessPicNode(pic, slidePart, slideMaster, colorMaps, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme);
                 // pptElement = PictureConvert(picture, theme, colorMap, slidePart, index);
             }
             else if (element is DocumentFormat.OpenXml.AlternateContent mc)//mc:alternatecontent   公式等 
             {
-                ProcessMcNode(mc, slidePart, slideMaster, slideMasterColors, index, position, slideLayoutStyle, slideMasterStyle);
+                return ProcessMcNode(mc, slidePart, slideMaster, colorMaps, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme);
                 /// pptElement = AlternateContentConvert(content, theme, colorMap, slidePart, index);
             }
             else if (element is DocumentFormat.OpenXml.Presentation.GraphicFrame graphicFrame)//p:graphicFrame   Chart, Diagram, Table
             {
-                ProcessGraphicFrameNode(graphicFrame, slidePart, slideMaster, slideMasterColors, index, position, slideLayoutStyle, slideMasterStyle);
+                return ProcessGraphicFrameNode(graphicFrame, slidePart, slideMaster, colorMaps, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme);
                 /// pptElement = GraphicFrameConvert(graphicFrame, theme, colorMap, index);
             }
             else if (element is DocumentFormat.OpenXml.Presentation.GroupShape grpSp)//p:grpSp  组合图形
             {
-                ProcessGrpSpNode(grpSp, slidePart, slideMaster, slideMasterColors, index, position, slideLayoutStyle, slideMasterStyle);
+                return ProcessGrpSpNode(grpSp, slidePart, slideMaster, colorMaps, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme);
                 /// pptElement = GroupShapeConvert(groupShape, theme, colorMap, index);
             }
             else if (element is DocumentFormat.OpenXml.Presentation.ConnectionShape cxnSp) // p:cxnSp  连接线
             {
-                ProcessCxnSpNode(cxnSp, slidePart, slideMaster, slideMasterColors, index, position, slideLayoutStyle, slideMasterStyle);
+                return ProcessCxnSpNode(cxnSp, slidePart, slideMaster, colorMaps, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme);
                 ///  pptElement = ConnectionShapeConvert(connectionShape, theme, colorMap, index);
             }
-            return null;
+            else if(element is DocumentFormat.OpenXml.Presentation.Shape sp)//p:sp  形状
+            {
+                //  pptElement = ShapeConvert(shape, theme, colorMap, index);
+                return ProcessSpNode(sp, slidePart, slideMaster, colorMaps, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme);
+            }
+              return element.OuterXml;
         }
 
 
@@ -207,25 +228,15 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         /// <param name="colors"></param>
         /// <param name="index"></param>
         /// <param name="position"></param>
-        /// <param name="slideLayoutStyle"></param>
-        /// <param name="slideMasterStyle"></param>
+        /// <param name="slideLayoutTables"></param>
+        /// <param name="slideMasterTables"></param>
         /// <returns></returns>
-        public string ProcessSpNode(DocumentFormat.OpenXml.Presentation.Shape element, SlidePart slidePart, SlideMaster slideMaster,
+        public object ProcessSpNode(DocumentFormat.OpenXml.Presentation.Shape element, SlidePart slidePart, SlideMaster slideMaster,
             Dictionary<string, string> colors, int index, HiTeachCC.Model.PowerPoint.Position position,
-            Style slideLayoutStyle,
-            Style slideMasterStyle)
+            Style slideLayoutTables,
+            Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme)
         {
-            HiTeachCC.Model.PowerPoint.Shape shape = new HiTeachCC.Model.PowerPoint.Shape();
-            HiTeachCC.Model.PowerPoint.Position spPosition = null;
-            if (element.ShapeProperties != null)
-            {
-                Transform2D transform2D = element.ShapeProperties.Transform2D;
-                if (transform2D != null)
-                {
-                    spPosition = GetPositionByTransform2D(transform2D);
-                }
-            }
-            DocumentFormat.OpenXml.Presentation.NonVisualShapeProperties nonVisualShapeProperties = element.NonVisualShapeProperties;
+            
             XmlDocument doc = new XmlDocument();
             doc.LoadXml(element.OuterXml);
             //获取当前节点的相关样式属性
@@ -237,28 +248,117 @@ namespace HiTeachCC.Service.PowerPoint.Implement
             XmlDocument slideMasterSpNode = null;
             if (typeNode != null)
             {
-                slideLayoutSpNode = slideLayoutStyle.TypeTable;
-                slideMasterSpNode = slideMasterStyle.TypeTable;
+
+                //  检查 slideLayoutSpNode slideMasterSpNode 为空时产生的位置 横竖排版 空指针问题
+
+
+                //slideLayoutSpNode = slideLayoutTables.TypeTable;
+                //slideMasterSpNode = slideMasterTables.TypeTable;
+
+
+                doc.LoadXml(slideLayoutTables.TypeTable.OuterXml);
+                XmlNodeList types = doc.SelectNodes("//xmlDatas/xmlData", PowerPointHelper.GetXmlnsManager(doc.NameTable));
+                if (types != null)
+                {
+                    int size = types.Count;
+                    for (int i = 0; i < size; i++)
+                    {
+                        XmlNode node = types.Item(i);
+                        doc.LoadXml(node.OuterXml);
+                        XmlNode id = doc.SelectSingleNode("./xmlData/@id", PowerPointHelper.GetXmlnsManager(doc.NameTable));
+                        if (id.Value.Equals(typeNode.Value))
+                        {
+                            XmlDocument nodeDoc = new XmlDocument();
+                            nodeDoc.LoadXml(types.Item(i).OuterXml);
+                            slideLayoutSpNode = nodeDoc;
+                            break;
+                        }
+                    }
+                }
+                doc.LoadXml(slideMasterTables.TypeTable.OuterXml);
+                types = doc.SelectNodes("//xmlDatas/xmlData", PowerPointHelper.GetXmlnsManager(doc.NameTable));
+                if (types != null)
+                {
+                    int size = types.Count;
+                    for (int i = 0; i < size; i++)
+                    {
+                        XmlNode node = types.Item(i);
+                        doc.LoadXml(node.OuterXml);
+                        XmlNode id = doc.SelectSingleNode("./xmlData/@id", PowerPointHelper.GetXmlnsManager(doc.NameTable));
+                        if (id.Value.Equals(typeNode.Value))
+                        {
+                            XmlDocument nodeDoc = new XmlDocument();
+                            nodeDoc.LoadXml(types.Item(i).OuterXml);
+                            slideMasterSpNode = nodeDoc;
+                            break;
+                        }
+                    }
+                }
             }
             else
             {
                 if (idxNode != null)
                 {
-                    slideLayoutSpNode = slideLayoutStyle.IdxTable;
-                    slideMasterSpNode = slideMasterStyle.IdxTable;
+                    //slideLayoutSpNode = slideLayoutTables.IdxTable;
+                    //slideMasterSpNode = slideMasterTables.IdxTable;
+                    doc.LoadXml(slideLayoutTables.IdxTable.OuterXml);
+                    XmlNodeList types = doc.SelectNodes("//xmlDatas/xmlData", PowerPointHelper.GetXmlnsManager(doc.NameTable));
+                    if (types != null)
+                    {
+                        int size = types.Count;
+                        for (int i = 0; i < size; i++)
+                        {
+                            XmlNode node = types.Item(i);
+                            doc.LoadXml(node.OuterXml);
+                            XmlNode id = doc.SelectSingleNode("./xmlData/@id", PowerPointHelper.GetXmlnsManager(doc.NameTable));
+                            if (id.Value.Equals(idxNode.Value))
+                            {
+                                XmlDocument nodeDoc = new XmlDocument();
+                                nodeDoc.LoadXml(types.Item(i).OuterXml);
+                                slideLayoutSpNode = nodeDoc;
+                                break;
+                            }
+                        }
+                    }
+                    doc.LoadXml(slideMasterTables.IdxTable.OuterXml);
+                    types = doc.SelectNodes("//xmlDatas/xmlData", PowerPointHelper.GetXmlnsManager(doc.NameTable));
+                    if (types != null)
+                    {
+                        int size = types.Count;
+                        for (int i = 0; i < size; i++)
+                        {
+                            XmlNode node = types.Item(i);
+                            doc.LoadXml(node.OuterXml);
+                            XmlNode id = doc.SelectSingleNode("./xmlData/@id", PowerPointHelper.GetXmlnsManager(doc.NameTable));
+                            if (id.Value.Equals(idxNode.Value))
+                            {
+                                XmlDocument nodeDoc = new XmlDocument();
+                                nodeDoc.LoadXml(types.Item(i).OuterXml);
+                                slideMasterSpNode = nodeDoc;
+                                break;
+                            }
+                        }
+                    }
                 }
             }
-            if (typeNode == null)
+            if (typeNode == null )
             {
-                typeNode = slideLayoutSpNode.SelectSingleNode("//p:nvSpPr/p:nvPr/p:ph/@type", PowerPointHelper.GetXmlnsManager(slideLayoutSpNode.NameTable));
+                if (slideLayoutSpNode != null) {
+                    typeNode = slideLayoutSpNode.SelectSingleNode("//p:nvSpPr/p:nvPr/p:ph/@type", PowerPointHelper.GetXmlnsManager(slideLayoutSpNode.NameTable));
+                }
                 //getTextByPathList(slideLayoutSpNode, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "type"]);
                 if (typeNode == null)
                 {
-                    typeNode = slideLayoutSpNode.SelectSingleNode("//p:nvSpPr/p:nvPr/p:ph/@type", PowerPointHelper.GetXmlnsManager(slideLayoutSpNode.NameTable));
+                    if (slideMasterSpNode != null)
+                    {
+                        typeNode = slideMasterSpNode.SelectSingleNode("//p:nvSpPr/p:nvPr/p:ph/@type", PowerPointHelper.GetXmlnsManager(slideMasterSpNode.NameTable));
+                    }
                     // typeNode = getTextByPathList(slideMasterSpNode, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "type"]);
                 }
             }
-            return null;
+            object s=   GenShape(element, slidePart, slideMaster, colors, index, position, slideLayoutTables,
+                slideMasterTables, idNode, nameNode, idxNode, typeNode, slideLayoutSpNode, slideMasterSpNode , slideMasterTextStyles  , theme);
+            return s;
         }
         /// <summary>
         /// 处理图形的具体信息
@@ -269,8 +369,8 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         /// <param name="colors"></param>
         /// <param name="index"></param>
         /// <param name="position"></param>
-        /// <param name="slideLayoutStyle"></param>
-        /// <param name="slideMasterStyle"></param>
+        /// <param name="slideLayoutTables"></param>
+        /// <param name="slideMasterTables"></param>
         /// <param name="idNode"></param>
         /// <param name="nameNode"></param>
         /// <param name="idxNode"></param>
@@ -280,16 +380,42 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         /// <returns></returns>
         public object GenShape(DocumentFormat.OpenXml.Presentation.Shape element, SlidePart slidePart, SlideMaster slideMaster,
            Dictionary<string, string> colors, int index, HiTeachCC.Model.PowerPoint.Position position,
-           Style slideLayoutStyle,
-           Style slideMasterStyle, XmlNode idNode, XmlNode nameNode, XmlNode idxNode, XmlNode typeNode, XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode)
+           Style slideLayoutTables,
+           Style slideMasterTables, XmlNode idNode, XmlNode nameNode, XmlNode idxNode, XmlNode typeNode,
+           XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode ,XmlDocument slideMasterTextStyles, Theme theme)
         {
+
+            HiTeachCC.Model.PowerPoint.Shape shape = new HiTeachCC.Model.PowerPoint.Shape();
+            HiTeachCC.Model.PowerPoint.Position spPosition = null;
+            if (element.ShapeProperties != null)
+            {
+                Transform2D transform2D = element.ShapeProperties.Transform2D;
+                if (transform2D != null)
+                {
+                    spPosition = PowerPointHelper.GetPositionByTransform2D(transform2D);
+                }
+            }
+            DocumentFormat.OpenXml.Presentation.NonVisualShapeProperties nonVisualShapeProperties = element.NonVisualShapeProperties;
+
             XmlDocument doc = new XmlDocument();
             doc.LoadXml(element.OuterXml);
             XmlNode shapeType = doc.SelectSingleNode("//p:spPr/a:prstGeom/@prst", PowerPointHelper.GetXmlnsManager(doc.NameTable));
             if (shapeType != null)
             {
-               //常规图形
-
+                //常规图形
+                HiTeachCC.Model.PowerPoint.Position shapePosition = PowerPointHelper.GetPosition(element.OuterXml, slideLayoutSpNode, slideMasterSpNode);
+                Border border = PowerPointHelper.GetBorder(element.OuterXml, true, colors);
+                HiTeachCC.Model.PowerPoint.Fill fill = PowerPointHelper.GetShapeFill(element.OuterXml, colors);
+                var headEndTypeNode = doc.SelectSingleNode("//p:spPr/a:ln/a:headEnd/@type", PowerPointHelper.GetXmlnsManager(doc.NameTable));
+                var tailEndTypeNode = doc.SelectSingleNode("//p:spPr/a:ln/a:tailEnd/@type", PowerPointHelper.GetXmlnsManager(doc.NameTable));
+                PowerPointHelper.GenPPTXShape(shapeType);
+                shape.Position = shapePosition;
+                shape.Paragraph = GenTextBody(element.OuterXml, slideLayoutSpNode, slideMasterSpNode, typeNode, slideLayoutTables, slideMasterTables, slideMasterTextStyles, theme, slidePart ,colors);
+                shape.Fill = fill;
+                shape.Border = border;
+                shape.Type = "shape";
+                shape.ShapeType = shapeType.Value;
+                return shape;
             }
             else
             {
@@ -297,29 +423,166 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                 if (shapeType != null)
                 {
                     //自定义图形 画线 轨迹
+
+                    //常规图形
+                    HiTeachCC.Model.PowerPoint.Position shapePosition = PowerPointHelper.GetPosition(element.OuterXml, slideLayoutSpNode, slideMasterSpNode);
+                    Border border = PowerPointHelper.GetBorder(element.OuterXml, true, colors);
+                    HiTeachCC.Model.PowerPoint.Fill fill = PowerPointHelper.GetShapeFill(element.OuterXml, colors);
+                    var headEndTypeNode = doc.SelectSingleNode("//p:spPr/a:ln/a:headEnd/@type", PowerPointHelper.GetXmlnsManager(doc.NameTable));
+                    var tailEndTypeNode = doc.SelectSingleNode("//p:spPr/a:ln/a:tailEnd/@type", PowerPointHelper.GetXmlnsManager(doc.NameTable));
+                    PowerPointHelper.GenPPTXShape(shapeType);
+                    shape.Position = shapePosition;
+                    shape.Paragraph = GenTextBody(element.OuterXml, slideLayoutSpNode, slideMasterSpNode, typeNode, 
+                        slideLayoutTables, slideMasterTables, slideMasterTextStyles, theme, slidePart, colors);
+                    shape.Fill = fill;
+                    shape.Border = border;
+                    shape.Type = "shape";
+                    shape.ShapeType = "custom";
+                    return shape;
                 }
                 else {
-                    //都不是的图形 如页眉 页脚
+                    string align = PowerPointHelper.GetVerticalAlign(element, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles);
+                    HiTeachCC.Model.PowerPoint.Position shapePosition = PowerPointHelper.GetPosition(element.OuterXml,slideLayoutSpNode,slideMasterSpNode);
+                    Border border = PowerPointHelper.GetBorder(element.OuterXml, true, colors);
+                    HiTeachCC.Model.PowerPoint.Fill fill = PowerPointHelper.GetShapeFill(element.OuterXml,colors);
+                    shape.Position = shapePosition;
+                    shape.Paragraph = GenTextBody(element.OuterXml, slideLayoutSpNode, slideMasterSpNode, typeNode,
+                        slideLayoutTables, slideMasterTables, slideMasterTextStyles, theme, slidePart,colors);
+                    shape.Fill = fill;
+                    shape.Border = border;
+                    shape.Type = "shape";
+                    shape.ShapeType = "rect";
+                    return shape;
+
                 }
             }
-            return null;
+            //return null;
         }
-        /// <summary>
-        /// 获取位置信息
-        /// </summary>
-        /// <param name="transform2D"></param>
-        /// <returns></returns>
-        private static HiTeachCC.Model.PowerPoint.Position GetPositionByTransform2D(Transform2D transform2D)
-        {
-            HiTeachCC.Model.PowerPoint.Position spPosition = new HiTeachCC.Model.PowerPoint.Position();
-            spPosition.Rot = transform2D.Rotation == null ? 0 : transform2D.Rotation.Value;
-            spPosition.FlipH = transform2D.HorizontalFlip == null ? false : transform2D.HorizontalFlip.Value;
-            spPosition.FlipV = transform2D.VerticalFlip == null ? false : transform2D.VerticalFlip.Value;
-            spPosition.X = transform2D.Offset.X == null ? 0 : transform2D.Offset.X.Value;
-            spPosition.Y = transform2D.Offset.Y == null ? 0 : transform2D.Offset.Y.Value;
-            spPosition.Cx = transform2D.Extents.Cx == null ? 0 : transform2D.Extents.Cx.Value;
-            spPosition.Cy = transform2D.Extents.Cy == null ? 0 : transform2D.Extents.Cy.Value;
-            return spPosition;
+
+
+        public List<Paragraph> GenTextBody(string nodeXml, XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode,
+            XmlNode typeNode , Style slideLayoutTables,
+            Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme , SlidePart slidePart,Dictionary<string ,string> colors) {
+            List<Paragraph> paragraphs = new List<Paragraph>();
+            XmlDocument doc = new XmlDocument();
+            doc.LoadXml(nodeXml);
+            XmlNodeList pNodes = doc.SelectNodes("//p:txBody/child::* ",PowerPointHelper. GetXmlnsManager(doc.NameTable));
+            //XmlNodeList plvlNodes = doc.SelectNodes("//p:txBody/a:p/a:pPr/@lvl", PowerPointHelper.GetXmlnsManager(doc.NameTable));
+            //bool hasBuChar = false;
+            //if (plvlNodes != null && plvlNodes.Count > 0) {
+            //    hasBuChar = true;
+            //}
+            if (pNodes != null) {
+                int size = pNodes.Count;
+                for (int i = 0; i < size; i++) {
+                    XmlNode pNode = pNodes.Item(i);
+                    if (!pNode.Name.Equals("a:p") )
+                    {
+                        continue;
+                    }
+                    XmlDocument pXmlNode = new XmlDocument();
+                    pXmlNode.LoadXml(pNode.OuterXml);
+                    //XmlDocument docNode = new XmlDocument();
+                    //docNode.LoadXml(pNode.OuterXml);
+                    string HorizontalAlign=   PowerPointHelper.GetHorizontalAlign(pXmlNode  , slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles);
+                    Paragraph paragraph = new Paragraph();
+                    ParagraphStyle paragraphStyle = new ParagraphStyle { Alignment = HorizontalAlign };
+                    XmlNodeList pPrNodes = pXmlNode.SelectNodes("//a:pPr", PowerPointHelper.GetXmlnsManager(pXmlNode.NameTable));
+                    BuChar buChar= PowerPointHelper.GenBuChar(pXmlNode,  slideLayoutTables , slideMasterTables, slideMasterTextStyles  , typeNode);
+                    paragraph.BuChar = buChar;
+                    paragraph.ParagraphStyle = paragraphStyle;
+                   
+                    XmlNodeList rNodes = pXmlNode.SelectNodes("//a:r", PowerPointHelper.GetXmlnsManager(pXmlNode.NameTable));
+                    if (null == rNodes)
+                    {
+                        XmlDocument rNode = new XmlDocument();
+                        rNode.LoadXml(pNode.OuterXml);
+                        paragraph.Texts.Add(GenSpanElement(rNode, slideLayoutSpNode, slideMasterSpNode,typeNode,slideMasterTextStyles, theme, slidePart ,colors) );
+                    }
+                    else {
+                        int rsize = rNodes.Count;
+                        for (int ri = 0; ri < rsize; ri++) {
+                            
+                            XmlDocument rNode = new XmlDocument() ;
+                            rNode.LoadXml(rNodes.Item(ri).OuterXml);
+                            paragraph.Texts.Add(GenSpanElement(rNode, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles,theme , slidePart ,colors));
+                        }
+                        
+                    }
+                    paragraphs.Add(paragraph);
+                }
+            }
+
+            return paragraphs;
+        }
+
+
+        public Text GenSpanElement(XmlDocument nodeXml, XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode, XmlNode typeNode, 
+            XmlDocument slideMasterTextStyles, Theme theme, SlidePart slidePart ,Dictionary<string ,string> colors) {
+          
+            XmlNode tNode = nodeXml.SelectSingleNode("//a:t", PowerPointHelper.GetXmlnsManager(nodeXml.NameTable));
+            /*
+            var text = node["a:t"];
+            if (typeof text !== 'string') {
+                text = getTextByPathList(node, ["a:fld", "a:t"]);
+                if (typeof text !== 'string') {
+                    text = "&nbsp;";
+                    //debug("XXX: " + JSON.stringify(node));
+                }
+            }
+             */
+            string color= PowerPointHelper.GetFontColor(nodeXml,typeNode,slideMasterTextStyles , colors);
+            int font_size = PowerPointHelper.GetFontSize(nodeXml,slideLayoutSpNode,slideMasterSpNode,typeNode, slideMasterTextStyles);
+            string font_family = PowerPointHelper.GetFontType(nodeXml, typeNode, slideMasterTextStyles, theme);
+            string font_weight = PowerPointHelper.GetFontBold(nodeXml,typeNode,slideMasterTextStyles);
+            string font_style = PowerPointHelper.GetFontItalic(nodeXml,typeNode,slideMasterTextStyles);
+            string text_decoration = PowerPointHelper.GetFontDecoration(nodeXml,typeNode,slideMasterTextStyles);
+            string vertical_align = PowerPointHelper.GetTextVerticalAlign(nodeXml,typeNode,slideMasterTextStyles);
+            FontStyle fontStyle = new FontStyle
+            {
+                Color = color,
+                Size = font_size,
+                Type = font_family,
+                Bold = font_weight,
+                Italic = font_style,
+                Decoration = text_decoration,
+                VerticalAlign = vertical_align
+            };
+            string styleText = "color:"+color+ ";font-size:"+ font_size +
+                ";font-family:" + font_family + ";font-weight:" + font_weight +
+                ";font-style:" + font_style + ";text-decoration:" + text_decoration +
+                ";vertical-align:" + vertical_align;
+            string cssName = "";
+            if (styleTable.TryGetValue(styleText, out Dictionary<string, string> css))
+            {
+                cssName = css["name"];
+            }
+            else {
+                cssName = "_css_" + (styleTable.Keys.Count + 1);
+                styleTable.TryAdd(styleText, new Dictionary<string, string> { { "name", cssName } , { "text" ,styleText} });
+            }
+
+            Text text = new Text { Content=tNode.InnerText ,FontStyle=fontStyle};
+            XmlNode linkID = nodeXml.SelectSingleNode("//a:rPr/a:hlinkClick/@r:id", PowerPointHelper.GetXmlnsManager(nodeXml.NameTable));
+            if (linkID != null)
+            {
+                List< DocumentFormat.OpenXml.Packaging.HyperlinkRelationship  > hyperlinkRelationships =  slidePart.HyperlinkRelationships.ToList();
+                bool flag = true ;
+                foreach (var  HyperlinkRelationship in hyperlinkRelationships){
+                    if (HyperlinkRelationship.Id.Equals(linkID.Value)) {
+                        text.Href = HyperlinkRelationship.Uri.ToString();
+                        flag = false;
+                        break;
+                    }
+                }
+                if (flag) {
+                    text.Href = "#";
+                }
+            }
+            else {
+                text.Href = null;
+            }
+            return text;
         }
         /// <summary>
         /// 处理图片
@@ -330,14 +593,14 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         /// <param name="colors"></param>
         /// <param name="index"></param>
         /// <param name="position"></param>
-        /// <param name="slideLayoutStyle"></param>
-        /// <param name="slideMasterStyle"></param>
+        /// <param name="slideLayoutTables"></param>
+        /// <param name="slideMasterTables"></param>
         /// <returns></returns>
         public string ProcessPicNode(DocumentFormat.OpenXml.Presentation.Picture element,
             SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> colors, int index,
             HiTeachCC.Model.PowerPoint.Position position,
-            Style slideLayoutStyle,
-            Style slideMasterStyle)
+            Style slideLayoutTables,
+            Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme)
         {
             return null;
         }
@@ -351,14 +614,14 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         /// <param name="colors"></param>
         /// <param name="index"></param>
         /// <param name="position"></param>
-        /// <param name="slideLayoutStyle"></param>
-        /// <param name="slideMasterStyle"></param>
+        /// <param name="slideLayoutTables"></param>
+        /// <param name="slideMasterTables"></param>
         /// <returns></returns>
         public string ProcessMcNode(DocumentFormat.OpenXml.AlternateContent element, SlidePart slidePart,
             SlideMaster slideMaster, Dictionary<string, string> colors,
             int index, HiTeachCC.Model.PowerPoint.Position position,
-            Style slideLayoutStyle,
-            Style slideMasterStyle)
+            Style slideLayoutTables,
+            Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme)
         {
             return null;
         }
@@ -371,14 +634,14 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         /// <param name="colors"></param>
         /// <param name="index"></param>
         /// <param name="position"></param>
-        /// <param name="slideLayoutStyle"></param>
-        /// <param name="slideMasterStyle"></param>
+        /// <param name="slideLayoutTables"></param>
+        /// <param name="slideMasterTables"></param>
         /// <returns></returns>
         public string ProcessGraphicFrameNode(DocumentFormat.OpenXml.Presentation.GraphicFrame element,
             SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> colors,
             int index, HiTeachCC.Model.PowerPoint.Position position,
-            Style slideLayoutStyle,
-            Style slideMasterStyle)
+            Style slideLayoutTables,
+            Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme)
         {
             return null;
         }
@@ -391,19 +654,19 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         /// <param name="colors"></param>
         /// <param name="index"></param>
         /// <param name="position"></param>
-        /// <param name="slideLayoutStyle"></param>
-        /// <param name="slideMasterStyle"></param>
+        /// <param name="slideLayoutTables"></param>
+        /// <param name="slideMasterTables"></param>
         /// <returns></returns>
-        public string ProcessGrpSpNode(DocumentFormat.OpenXml.Presentation.GroupShape element, SlidePart slidePart,
+        public object ProcessGrpSpNode(DocumentFormat.OpenXml.Presentation.GroupShape element, SlidePart slidePart,
             SlideMaster slideMaster, Dictionary<string, string> colors, int index,
             HiTeachCC.Model.PowerPoint.Position position,
-            Style slideLayoutStyle,
-            Style slideMasterStyle)
+            Style slideLayoutTables,
+            Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme)
         {
             var shapes = from shap in element.Descendants<DocumentFormat.OpenXml.Presentation.Shape>() select shap;
             foreach (var shape in shapes)
             {
-                string s = ProcessNodesInSlide(shape, slidePart, slideMaster, colors, index, position, slideLayoutStyle, slideMasterStyle);
+                object s = ProcessNodesInSlide(shape, slidePart, slideMaster, colors, index, position, slideLayoutTables, slideMasterTables , slideMasterTextStyles,theme);
             }
             return null;
         }
@@ -417,14 +680,14 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         /// <param name="colors"></param>
         /// <param name="index"></param>
         /// <param name="position"></param>
-        /// <param name="slideLayoutStyle"></param>
-        /// <param name="slideMasterStyle"></param>
+        /// <param name="slideLayoutTables"></param>
+        /// <param name="slideMasterTables"></param>
         /// <returns></returns>
         public string ProcessCxnSpNode(DocumentFormat.OpenXml.Presentation.ConnectionShape element,
             SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> colors,
             int index, HiTeachCC.Model.PowerPoint.Position position,
-            Style slideLayoutStyle,
-            Style slideMasterStyle)
+            Style slideLayoutTables,
+            Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme)
         {
             return null;
         }

+ 1 - 1
HiTeachCC/HiTeachCC.csproj

@@ -8,7 +8,7 @@
   <ItemGroup>
     <PackageReference Include="Microsoft.AspNetCore.App" />
     <PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />
-    <PackageReference Include="TEAMModelOS.SDK" Version="1.0.6" />
+    <PackageReference Include="TEAMModelOS.SDK" Version="1.0.10" />
   </ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\HiTeachCC.Service\HiTeachCC.Service.csproj" />