Przeglądaj źródła

PPT解析,阶段性提交。

黄贺彬 5 lat temu
rodzic
commit
9e9ac9045c

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

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

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

@@ -14,6 +14,6 @@ namespace HiTeachCC.Model.PowerPoint
         public string CxnType { get; set; }
         public string HeadEnd { get; set; }
         public string TailEnd { get; set; }
-        public Border border { get; set; }
+        public Border Border { get; set; }
     }
 }

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

@@ -12,6 +12,6 @@ namespace HiTeachCC.Model.PowerPoint
         public string Bold { get; set; }
         public string Italic { get; set; }
         public string Decoration { get; set; }
-        public string VerticalAlign { get; set; }
+        public string VertAlign { get; set; }
     }
 }

+ 0 - 11
HiTeachCC.Model/PowerPoint/GroupShape.cs

@@ -1,11 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace HiTeachCC.Model.PowerPoint
-{
-    public class GroupShape : Item
-    {
-        public Shape Shape { get; set; }
-    }
-}

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

@@ -4,11 +4,12 @@ using System.Text;
 
 namespace HiTeachCC.Model.PowerPoint
 {
-    public class Item
+    public abstract class Item
     {
         public string Type { get; set; }
         public Position Position { get; set; }
         public string Xml { get; set; }
+        public int Index { get; set; }
         //public Picture Picture { get; set; }
         //public Shape Shape { get; set; }
         //public Math Math { get; set; }

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

@@ -32,7 +32,8 @@ namespace HiTeachCC.Model.PowerPoint
 
     public class ParagraphStyle
     {
-        public string LeftMargin { get; set; }
-        public string Alignment { get; set; }
+        public string VertAlign { get; set; }
+        // public string LeftMargin { get; set; }
+        public string HoriAlign { get; set; }
     }
 }

+ 77 - 0
HiTeachCC.Model/PowerPoint/Path.cs

@@ -0,0 +1,77 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HiTeachCC.Model.PowerPoint
+{
+    public abstract class Path
+    {
+        public string Type { get; set; }
+    }
+    public   class ClosePath :Path
+    {
+        public bool Close { get; set; } = false;
+    }
+
+    /// <summary>
+    /// 起点 <a:moveTo>
+    /// </summary>
+    public class MoveToPath : Path
+    {
+        public MoveToPath()
+        {
+            Pts = new List<Point> { };
+        }
+        public List<Point> Pts { get; set; }
+    }
+    /// <summary>
+    /// 弧形 <a:arcTo>
+    /// </summary>
+    public class ArcToPath : Path
+    {
+        public string WidthRadius { get; set; }
+        public string HeightRadius { get; set; }
+        public string StartAngle { get; set; }
+        public string SwingAngle { get; set; }
+    }
+
+
+    /// <summary>
+    /// 画线 <a:lnTo>
+    /// </summary>
+    public class LineToPath : Path
+    {
+        public LineToPath()
+        {
+            Pts = new List<Point> { };
+        }
+        public List<Point> Pts { get; set; }
+    }
+    /// <summary>
+    /// 三次贝塞尔曲线<a:cubicBezTo>
+    /// </summary>
+    public class CubicBezPath : Path
+    {
+        public CubicBezPath()
+        {
+            Pts = new List<Point> { };
+        }
+        public List<Point> Pts { get; set; }
+    }/// <summary>
+     /// 二次贝塞尔曲线  <a:quadBezTo>
+     /// </summary>
+    public class QuadBezPath : Path
+    {
+        public QuadBezPath()
+        {
+            Pts = new List<Point> { };
+        }
+        public List<Point> Pts { get; set; }
+    }
+
+    public class Point
+    {
+        public double X { get; set; }
+        public double Y { get; set; }
+    }
+}

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

@@ -8,7 +8,7 @@ namespace HiTeachCC.Model.PowerPoint
     {
         
         //base64编码信息
-        public string Data { get; set; }
+        public string Base64 { get; set; }
         public Fill Fill { get; set; }
         public Border Border { get; set; }
     }

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

@@ -20,15 +20,15 @@ namespace HiTeachCC.Model.PowerPoint
         public Int64 Cx { get; set; } = 0;
         //高度
         public Int64 Cy { get; set; } = 0;
-        //初始坐标x
-        public Int64 ChX { get; set; } = 0;
-        //初始坐标Y
-        public Int64 ChY { get; set; } = 0;
-        //拉伸宽度
-        public Int64 ChCX { get; set; } = 0;
-        //拉伸高度
-        public Int64 ChCY { get; set; } = 0;
+        ////初始坐标x
+        //public Int64 ChX { get; set; } = 0;
+        ////初始坐标Y
+        //public Int64 ChY { get; set; } = 0;
+        ////拉伸宽度
+        //public Int64 ChCX { get; set; } = 0;
+        ////拉伸高度
+        //public Int64 ChCY { get; set; } = 0;
         //层级
-        public int Index { get; set; }
+      
     }
 }

+ 3 - 1
HiTeachCC.Model/PowerPoint/Pptx.cs

@@ -13,7 +13,9 @@ namespace HiTeachCC.Model.PowerPoint
         //缩略图
         public string Thumbnail { get; set; }
         //PPT幻灯片集合
-        public List<Slide> Slides { get; set; }
+        public List<string> HiXmls { get; set; }
+        public string PptUrl { get; set; }
+        public string Sha1Code { get; set; }
         //页数
         public int PageSize { get; set; }
     }

+ 9 - 0
HiTeachCC.Model/PowerPoint/Shape.cs

@@ -10,6 +10,15 @@ namespace HiTeachCC.Model.PowerPoint
         public List<Paragraph> Paragraph { get; set; }
         public Fill Fill { get; set; }
         public Border Border { get; set; }
+       
+        public List<ShapeGuide> ShapeGuides { get; set; }
+        public List<Path> Paths { get; set; }
+
+    }
+    public class ShapeGuide
+    {
+        public string Name { get; set; }
+        public string Fmla { get; set; }
 
     }
 }

+ 8 - 4
HiTeachCC.Model/PowerPoint/Slide.cs

@@ -8,11 +8,15 @@ namespace HiTeachCC.Model.PowerPoint
     {
         public Slide()
         {
-            Items = new List<object>();
+            Items = new List<Item>();
         }
-        public List<object> Items { get; set; }
+        public List<Item> Items { get; set; }
         public Fill Fill { get; set; }
-        public string Xml { get; set; }
-        public int index { get; set; } 
+      //  public string Xml { get; set; }
+        public int Index { get; set; }
+        //宽度
+        public double Width { get; set; }
+        //高度
+        public double Height { get; set; }
     }
 }

+ 0 - 59
HiTeachCC.Service/Core/Implement/XmlSerializeHelper.cs

@@ -1,59 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Text;
-using System.Xml.Serialization;
-
-namespace HiTeachCC.Service.Core.Implement
-{
-    /// <summary>
-    /// XML序列化公共处理类
-    /// </summary>
-    public static class XmlSerializeHelper
-    {
-        /// <summary>
-        /// 将实体对象转换成XML
-        /// </summary>
-        /// <typeparam name="T">实体类型</typeparam>
-        /// <param name="obj">实体对象</param>
-        public static string XmlSerialize<T>(T obj)
-        {
-            try
-            {
-                using (StringWriter sw = new StringWriter())
-                {
-                    Type t = obj.GetType();
-                    XmlSerializer serializer = new XmlSerializer(obj.GetType());
-                    serializer.Serialize(sw, obj);
-                    sw.Close();
-                    return sw.ToString();
-                }
-            }
-            catch (Exception ex)
-            {
-                throw new Exception("将实体对象转换成XML异常", ex);
-            }
-        }
-
-        /// <summary>
-        /// 将XML转换成实体对象
-        /// </summary>
-        /// <typeparam name="T">实体类型</typeparam>
-        /// <param name="strXML">XML</param>
-        public static T DESerializer<T>(string strXML) where T : class
-        {
-            try
-            {
-                using (StringReader sr = new StringReader(strXML))
-                {
-                    XmlSerializer serializer = new XmlSerializer(typeof(T));
-                    return serializer.Deserialize(sr) as T;
-                }
-            }
-            catch (Exception ex)
-            {
-                throw new Exception("将XML转换成实体对象异常", ex);
-            }
-        }
-    }
-}

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

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

+ 72 - 72
HiTeachCC.Service/PowerPoint/Implement/PowerPointHelper.cs

@@ -877,79 +877,12 @@ namespace HiTeachCC.Service.PowerPoint.Implement
             }
             return new Model.PowerPoint.Position();
         }
-        /// <summary>
-        /// 获取垂直排版
-        /// </summary>
-        /// <param name="element"></param>
-        /// <param name="slideLayoutSpNode"></param>
-        /// <param name="slideMasterSpNode"></param>
-        /// <param name="typeNode"></param>
-        /// <param name="slideMasterStyle"></param>
-        /// <returns></returns>
-        public static string GetHorizontalAlign(XmlDocument nodeXml,
-            XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode,
-            XmlNode typeNode, XmlDocument slideMasterTextStyles)
-        {
-            //XmlDocument doc = new XmlDocument();
-            //doc.LoadXml(nodeXml);
-            XmlNode algn = nodeXml.SelectSingleNode("//a:pPr/@algn", GetXmlnsManager(nodeXml.NameTable));
-            if (algn == null)
-            {
-                if (slideLayoutSpNode != null)
-                {
-                    algn = slideLayoutSpNode.SelectSingleNode("//p:txBody/a:p/a:pPr/@algn", GetXmlnsManager(slideLayoutSpNode.NameTable));
-                }
-
-                if (algn == null && slideMasterSpNode != null)
-                {
-                    algn = slideMasterSpNode.SelectSingleNode("//p:txBody/a:p/a:pPr/@algn", GetXmlnsManager(slideMasterSpNode.NameTable));
-                }
-                if (algn == null && typeNode != null)
-                {
-                    switch (typeNode.Value)
-                    {
-                        case "title":
-                        case "subTitle":
-                        case "ctrTitle":
-                            //doc.LoadXml(slideMasterStyle.TypeTable.OuterXml);
-                            algn = slideMasterTextStyles.SelectSingleNode("//p:titleStyle/a:lvl1pPr/@algn", GetXmlnsManager(slideMasterTextStyles.NameTable));
-                            break;
-                        case "body":
-                            algn = slideMasterTextStyles.SelectSingleNode("//p:bodyStyle/a:lvl1pPr/@algn", GetXmlnsManager(slideMasterTextStyles.NameTable));
-                            break;
-                        default:
-                            //  doc.LoadXml(slideMasterStyle.TypeTable.OuterXml);
-                            algn = slideMasterTextStyles.SelectSingleNode("//p:otherStyle/a:lvl1pPr/@algn", GetXmlnsManager(slideMasterTextStyles.NameTable));
-                            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";
-        }
-
+       
         public static BuChar GenBuChar(XmlDocument nodeXml, Style slideLayoutTables,
             Style slideMasterTables, XmlDocument SlideMasterTextStyles, XmlNode typeNode, bool hasBuChar)
         {
 
-            if (nodeXml.InnerText.Equals("AAA")) {
-                int s = 0;
-            }
+           
             // todo
             //需要完善slideMaster1.xml 中含有a:buChar 的情况
 
@@ -1063,6 +996,73 @@ namespace HiTeachCC.Service.PowerPoint.Implement
             return bchar;
         }
 
+        /// <summary>
+        /// 获取垂直排版
+        /// </summary>
+        /// <param name="element"></param>
+        /// <param name="slideLayoutSpNode"></param>
+        /// <param name="slideMasterSpNode"></param>
+        /// <param name="typeNode"></param>
+        /// <param name="slideMasterStyle"></param>
+        /// <returns></returns>
+        public static string GetHorizontalAlign(XmlDocument nodeXml,
+            XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode,
+            XmlNode typeNode, XmlDocument slideMasterTextStyles)
+        {
+            //XmlDocument doc = new XmlDocument();
+            //doc.LoadXml(nodeXml);
+            XmlNode algn = nodeXml.SelectSingleNode("//a:pPr/@algn", GetXmlnsManager(nodeXml.NameTable));
+            if (algn == null)
+            {
+                if (slideLayoutSpNode != null)
+                {
+                    algn = slideLayoutSpNode.SelectSingleNode("//p:txBody/a:p/a:pPr/@algn", GetXmlnsManager(slideLayoutSpNode.NameTable));
+                }
+
+                if (algn == null && slideMasterSpNode != null)
+                {
+                    algn = slideMasterSpNode.SelectSingleNode("//p:txBody/a:p/a:pPr/@algn", GetXmlnsManager(slideMasterSpNode.NameTable));
+                }
+                if (algn == null && typeNode != null)
+                {
+                    switch (typeNode.Value)
+                    {
+                        case "title":
+                        case "subTitle":
+                        case "ctrTitle":
+                            //doc.LoadXml(slideMasterStyle.TypeTable.OuterXml);
+                            algn = slideMasterTextStyles.SelectSingleNode("//p:titleStyle/a:lvl1pPr/@algn", GetXmlnsManager(slideMasterTextStyles.NameTable));
+                            break;
+                        case "body":
+                            algn = slideMasterTextStyles.SelectSingleNode("//p:bodyStyle/a:lvl1pPr/@algn", GetXmlnsManager(slideMasterTextStyles.NameTable));
+                            break;
+                        default:
+                            //  doc.LoadXml(slideMasterStyle.TypeTable.OuterXml);
+                            algn = slideMasterTextStyles.SelectSingleNode("//p:otherStyle/a:lvl1pPr/@algn", GetXmlnsManager(slideMasterTextStyles.NameTable));
+                            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>
         /// 获取水平排版
         /// 上中下对齐 X, <a:bodyPr anchor="ctr">, <a:bodyPr anchor="b">
@@ -1071,12 +1071,13 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         /// <param name="slideLayoutSpNode"></param>
         /// <param name="slideMasterSpNode"></param>
         /// <param name="typeNode"></param>
-        public static string GetVerticalAlign(DocumentFormat.OpenXml.Presentation.Shape element,
+        public static string GetVerticalAlign(string xmlNode,
             XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode,
             XmlNode typeNode, XmlDocument slideMasterTextStyles)
         {
             XmlDocument doc = new XmlDocument();
-            doc.LoadXml(element.OuterXml);
+            doc.LoadXml(xmlNode);
+            
             XmlNode anchor = doc.SelectSingleNode("//p:txBody/a:bodyPr/@anchor", GetXmlnsManager(doc.NameTable));
             if (anchor == null)
             {
@@ -1095,7 +1096,6 @@ namespace HiTeachCC.Service.PowerPoint.Implement
             }
             else
             {
-
                 return "v-up";
             }
 

+ 258 - 59
HiTeachCC.Service/PowerPoint/Implement/PowerPointService.cs

@@ -6,14 +6,25 @@ using DocumentFormat.OpenXml.Presentation;
 using HiTeachCC.Model.PowerPoint;
 using HiTeachCC.Service.Core.Implement;
 using HiTeachCC.Service.PowerPoint.Interface;
+using Microsoft.AspNetCore.Http;
 using System;
 using System.Collections.Generic;
 using System.IO;
 using System.Linq;
+using System.Threading.Tasks;
 using System.Xml;
+using TEAMModelOS.SDK.Context.Constant.Common;
+using TEAMModelOS.SDK.Context.Exception;
+using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
+using TEAMModelOS.SDK.Helper.Common.JsonHelper;
+using TEAMModelOS.SDK.Helper.Common.XmlHelper;
+using TEAMModelOS.SDK.Helper.Security.ShaHash;
+using TEAMModelOS.SDK.Module.AzureBlob.Container;
+using TEAMModelOS.SDK.Module.AzureBlob.Interfaces;
 using BlipFill = DocumentFormat.OpenXml.Presentation.BlipFill;
 using ColorMap = DocumentFormat.OpenXml.Presentation.ColorMap;
 using Paragraph = HiTeachCC.Model.PowerPoint.Paragraph;
+using Point = HiTeachCC.Model.PowerPoint.Point;
 using Shape = HiTeachCC.Model.PowerPoint.Shape;
 using Text = HiTeachCC.Model.PowerPoint.Text;
 using Theme = DocumentFormat.OpenXml.Drawing.Theme;
@@ -23,25 +34,49 @@ namespace HiTeachCC.Service.PowerPoint.Implement
 {
     public class PowerPointService : BaseService, IPowerPointService
     {
+        private readonly IAzureBlobDBRepository azureBlobDBRepository;
+
+        public PowerPointService(IAzureBlobDBRepository _azureBlobDBRepository)
+        {
+            azureBlobDBRepository = _azureBlobDBRepository;
+        }
+
         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>>();
+        public async Task<Dictionary<string, object>> LoadPresentation(IFormFile file)
+        {
+            Dictionary<string, object> resdict = new Dictionary<string, object>();
 
+            if (FileType.GetExtention(file.FileName).ToLower().Equals("pptx"))
+            {
+                await ProcessPPT(file, resdict);
+                return resdict;
+            }
+            else if (FileType.GetExtention(file.FileName).ToLower().Equals("pdf"))
+            {
+                await ProcessPDF(file, resdict);
+                return resdict;
+            }
+            else
+            {
+                throw new BizException(500, "file type does not support!");
+            }
+        }
         /// <summary>
         /// 加载PPTX文件
         /// </summary>
         /// <param name="presentationFile"></param>
         /// <returns></returns>
-        public Pptx LoadPresentation(Stream presentationStream)
+        public async Task<Dictionary<string, object>> ProcessPPT(IFormFile file, Dictionary<string, object> resdict)
         {
-            using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationStream, false))
+            string shaCode = ShaHashHelper.GetSHA1(file.OpenReadStream());
+            using (PresentationDocument presentationDocument = PresentationDocument.Open(file.OpenReadStream(), false))
             {
                 if (presentationDocument == null)
                 {
                     throw new ArgumentNullException("presentationDocument");
                 }
-                // Get a PresentationPart object from the PresentationDocument object.
-
                 var thumbnailPart = presentationDocument.ThumbnailPart;
                 var contentType = thumbnailPart.ContentType;
                 string base64 = "";
@@ -77,7 +112,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                     //获取PPT 一页大小
                     double x = presentation.SlideSize.Cx * inchpixel / pxBase;
                     double y = presentation.SlideSize.Cy * inchpixel / pxBase;
-                    List<HiTeachCC.Model.PowerPoint.Slide> slides = new List<HiTeachCC.Model.PowerPoint.Slide>();
+                    List<string> slides = new List<string>();
                     string slideMasterXml = slideMaster.OuterXml;
                     Style slideMasterTables = PowerPointHelper.IndexNodes(slideMasterXml);
 
@@ -95,21 +130,27 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                             // 获取这一页 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;
+
                             HiTeachCC.Model.PowerPoint.Slide slide = GetSlideElement(slidePart, slideMaster, slideMasterColors, theme, slideMasterTables, SlideMasterTextStyles, pageSize);
-                            slides.Add(slide);
+                            slide.Width = x;
+                            slide.Height = y;
+
+                            XmlDocument xml = Newtonsoft.Json.JsonConvert.DeserializeXmlNode(slide.ToJson(), "Slide");
+                            string result = @"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>" + xml.OuterXml;
+                            AzureBlobModel amodel = await azureBlobDBRepository.UploadTextByFolder(result, shaCode, (pageSize + 1) + ".xml" ,"pptx",false);
+                            slides.Add(amodel.BlobUrl);
                             pageSize++;
                         }
                     }
-                    Pptx info = new Pptx { Slides = slides, Width = x, Height = y, PageSize = pageSize, Thumbnail = base64 };
-                    return info;
+                    Pptx info = new Pptx { HiXmls = slides, Width = x, Height = y, PageSize = pageSize, Thumbnail = base64, Sha1Code = shaCode };
+                    AzureBlobModel model = await azureBlobDBRepository.UploadFileByFolder(file.OpenReadStream(), shaCode, shaCode + ".pptx", "pptx", false);
+                    info.PptUrl = model.BlobUrl;
+                    resdict.Add("pptx", info);
+                    resdict.Add("type", "pptx");
+                    return resdict;
                 }
                 return null;
             }
@@ -128,7 +169,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
             Style slideMasterTables, XmlDocument SlideMasterTextStyles, int pageSize)
         {
 
-            Model.PowerPoint.Slide slide = new Model.PowerPoint.Slide() { index = pageSize };
+            Model.PowerPoint.Slide slide = new Model.PowerPoint.Slide() { Index = pageSize };
             //用Layout colorMap覆盖 master ColorMap 
             slideMasterColors = PowerPointHelper.GetLayoutOrMasterColors(slidePart, slideMasterColors, theme);
             //slidePart.SlideLayoutPart;
@@ -151,10 +192,10 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                 position.Y = transformGroup.Offset.Y == null ? 0 : transformGroup.Offset.Y.Value;
                 position.Cx = transformGroup.Extents.Cx == null ? 0 : transformGroup.Extents.Cx.Value;
                 position.Cy = transformGroup.Extents.Cy == null ? 0 : transformGroup.Extents.Cy.Value;
-                position.ChX = transformGroup.ChildOffset.X == null ? 0 : transformGroup.ChildOffset.X.Value;
-                position.ChY = transformGroup.ChildOffset.Y == null ? 0 : transformGroup.ChildOffset.Y.Value;
-                position.ChCX = transformGroup.ChildExtents.Cx == null ? 0 : transformGroup.ChildExtents.Cx.Value;
-                position.ChCY = transformGroup.ChildExtents.Cy == null ? 0 : transformGroup.ChildExtents.Cy.Value;
+                //position.ChX = transformGroup.ChildOffset.X == null ? 0 : transformGroup.ChildOffset.X.Value;
+                //position.ChY = transformGroup.ChildOffset.Y == null ? 0 : transformGroup.ChildOffset.Y.Value;
+                //position.ChCX = transformGroup.ChildExtents.Cx == null ? 0 : transformGroup.ChildExtents.Cx.Value;
+                //position.ChCY = transformGroup.ChildExtents.Cy == null ? 0 : transformGroup.ChildExtents.Cy.Value;
                 int index = 0;
                 foreach (OpenXmlElement element in openXmlElements)
                 {
@@ -163,9 +204,10 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                         continue;
                     }
 
-                    List<object> list = new List<object>();
-                    ProcessNodesInSlide(list,element, slidePart, slideMaster, slideMasterColors, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme);
+                    List<Item> list = new List<Item>();
+                    ProcessNodesInSlide(list, element, slidePart, slideMaster, slideMasterColors, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme);
                     slide.Items.AddRange(list);
+
                     index++;
                 }
             }
@@ -183,7 +225,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         /// <param name="slideLayoutTables"></param>
         /// <param name="slideMasterTables"></param>
         /// <returns></returns>
-        public void ProcessNodesInSlide(List<object> list , OpenXmlElement element,
+        public void ProcessNodesInSlide(List<Item> list, OpenXmlElement element,
             SlidePart slidePart,
             SlideMaster slideMaster,
             Dictionary<string, string> colorMaps,
@@ -195,7 +237,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
 
             if (element is DocumentFormat.OpenXml.Presentation.Picture pic)//p:pic  图片
             {
-                  list.Add(ProcessPicNode(pic, slidePart, slideMaster, colorMaps, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme) );
+                list.Add(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   公式等 
@@ -210,7 +252,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
             }
             else if (element is DocumentFormat.OpenXml.Presentation.GroupShape grpSp)//p:grpSp  组合图形
             {
-                 ProcessGrpSpNode(list,grpSp, slidePart, slideMaster, colorMaps, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme);
+                ProcessGrpSpNode(list, 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  连接线
@@ -221,9 +263,9 @@ namespace HiTeachCC.Service.PowerPoint.Implement
             else if (element is DocumentFormat.OpenXml.Presentation.Shape sp)//p:sp  形状
             {
                 //  pptElement = ShapeConvert(shape, theme, colorMap, index);
-                list.Add(ProcessSpNode(sp, slidePart, slideMaster, colorMaps, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme) );
+                list.Add(ProcessSpNode(sp, slidePart, slideMaster, colorMaps, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme));
             }
-          //  return null;  //element.OuterXml;
+            //  return null;  //element.OuterXml;
         }
 
 
@@ -239,7 +281,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         /// <param name="slideLayoutTables"></param>
         /// <param name="slideMasterTables"></param>
         /// <returns></returns>
-        public object ProcessSpNode(DocumentFormat.OpenXml.Presentation.Shape element, SlidePart slidePart, SlideMaster slideMaster,
+        public HiTeachCC.Model.PowerPoint.Shape ProcessSpNode(DocumentFormat.OpenXml.Presentation.Shape element, SlidePart slidePart, SlideMaster slideMaster,
             Dictionary<string, string> colors, int index, HiTeachCC.Model.PowerPoint.Position position,
             Style slideLayoutTables,
             Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme)
@@ -365,7 +407,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                     // typeNode = getTextByPathList(slideMasterSpNode, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "type"]);
                 }
             }
-            object s = GenShape(element, slidePart, slideMaster, colors, index, position, slideLayoutTables,
+            HiTeachCC.Model.PowerPoint.Shape s = GenShape(element, slidePart, slideMaster, colors, index, position, slideLayoutTables,
                 slideMasterTables, idNode, nameNode, idxNode, typeNode, slideLayoutSpNode, slideMasterSpNode, slideMasterTextStyles, theme);
             return s;
         }
@@ -387,7 +429,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         /// <param name="slideLayoutSpNode"></param>
         /// <param name="slideMasterSpNode"></param>
         /// <returns></returns>
-        public object GenShape(DocumentFormat.OpenXml.Presentation.Shape element, SlidePart slidePart, SlideMaster slideMaster,
+        public HiTeachCC.Model.PowerPoint.Shape GenShape(DocumentFormat.OpenXml.Presentation.Shape element, SlidePart slidePart, SlideMaster slideMaster,
            Dictionary<string, string> colors, int index, HiTeachCC.Model.PowerPoint.Position position,
            Style slideLayoutTables,
            Style slideMasterTables, XmlNode idNode, XmlNode nameNode, XmlNode idxNode, XmlNode typeNode,
@@ -415,15 +457,20 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                 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));
+                //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);
+                // shapePosition.Index = index;
                 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.Type = "Sp";
                 shape.ShapeType = shapeType.Value;
+                shape.Index = index++;
+                // shape.VertAlign = PowerPointHelper.GetVerticalAlign(element, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles);
+                XmlNode avLstNode = doc.SelectSingleNode("//p:spPr/a:prstGeom/a:avLst", PowerPointHelper.GetXmlnsManager(doc.NameTable));
+                shape.ShapeGuides = GenShapeGuide(avLstNode);
                 return shape;
             }
             else
@@ -445,13 +492,17 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                         slideLayoutTables, slideMasterTables, slideMasterTextStyles, theme, slidePart, colors);
                     shape.Fill = fill;
                     shape.Border = border;
-                    shape.Type = "shape";
+                    shape.Type = "Sp";
                     shape.ShapeType = "custom";
+                    shape.Index = index++;
+                    //shape.VertAlign = PowerPointHelper.GetVerticalAlign(element, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles);
+                    var pathNode = doc.SelectSingleNode("//p:spPr/a:custGeom/a:pathLst/a:path", PowerPointHelper.GetXmlnsManager(doc.NameTable));
+                    shape.Paths = GenPath(pathNode.OuterXml);
                     return shape;
                 }
                 else
                 {
-                    string align = PowerPointHelper.GetVerticalAlign(element, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles);
+                    // 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);
@@ -460,14 +511,108 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                         slideLayoutTables, slideMasterTables, slideMasterTextStyles, theme, slidePart, colors);
                     shape.Fill = fill;
                     shape.Border = border;
-                    shape.Type = "shape";
+                    shape.Type = "Sp";
                     shape.ShapeType = "rect";
+                    shape.Index = index++;
+                    // shape.VertAlign = PowerPointHelper.GetVerticalAlign(element, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles);
                     return shape;
 
                 }
             }
             //return null;
         }
+        public List<HiTeachCC.Model.PowerPoint.ShapeGuide> GenShapeGuide(XmlNode avLstNode)
+        {
+            if (avLstNode != null)
+            {
+                AdjustValueList adjustValueList = new AdjustValueList(avLstNode.OuterXml);
+                List<HiTeachCC.Model.PowerPoint.ShapeGuide> ShapeGuides = new List<Model.PowerPoint.ShapeGuide>();
+                var elements = adjustValueList.ChildElements;
+                foreach (var xmlElement in elements)
+                {
+                    if (xmlElement is DocumentFormat.OpenXml.Drawing.ShapeGuide shapeGuide)
+                    {
+                        HiTeachCC.Model.PowerPoint.ShapeGuide ShapeGuide = new HiTeachCC.Model.PowerPoint.ShapeGuide { Name = shapeGuide.Name, Fmla = shapeGuide.Formula };
+                        ShapeGuides.Add(ShapeGuide);
+                    }
+                }
+                return ShapeGuides;
+            }
+            return null;
+
+        }
+
+        public List<HiTeachCC.Model.PowerPoint.Path> GenPath(string nodeXml)
+        {
+            DocumentFormat.OpenXml.Drawing.Path path = new DocumentFormat.OpenXml.Drawing.Path(nodeXml);
+            OpenXmlElementList elements = path.ChildElements;
+            List<HiTeachCC.Model.PowerPoint.Path> Paths = new List<Model.PowerPoint.Path>();
+            foreach (OpenXmlElement xmlElement in elements)
+            {
+                //起点
+                if (xmlElement is DocumentFormat.OpenXml.Drawing.MoveTo moveTo)
+                {
+                    DocumentFormat.OpenXml.Drawing.Point point = moveTo.Point;
+                    MoveToPath moveToPath = new MoveToPath { Type = "MoveTo" };
+                    moveToPath.Pts.Add(new Point { X = double.Parse(point.X) * inchpixel / pxBase, Y = double.Parse(point.Y) * inchpixel / pxBase });
+                    Paths.Add(moveToPath);
+                }
+                //连线
+                if (xmlElement is DocumentFormat.OpenXml.Drawing.LineTo linTo)
+                {
+                    DocumentFormat.OpenXml.Drawing.Point point = linTo.Point;
+                    LineToPath lineToPath = new LineToPath { Type = "LineTo" };
+                    lineToPath.Pts.Add(new Point { X = double.Parse(point.X) * inchpixel / pxBase, Y = double.Parse(point.Y) * inchpixel / pxBase });
+                    Paths.Add(lineToPath);
+                }
+                //三次贝塞尔曲线
+                if (xmlElement is DocumentFormat.OpenXml.Drawing.CubicBezierCurveTo cubicBezierCurveTo)
+                {
+                    OpenXmlElementList list = cubicBezierCurveTo.ChildElements;
+                    CubicBezPath cubicBezPath = new CubicBezPath { Type = "CubicBez" };
+                    foreach (var ls in list)
+                    {
+                        if (ls is DocumentFormat.OpenXml.Drawing.Point point)
+                        {
+                            cubicBezPath.Pts.Add(new Point { X = double.Parse(point.X) * inchpixel / pxBase, Y = double.Parse(point.Y) * inchpixel / pxBase });
+                        }
+                    }
+                    Paths.Add(cubicBezPath);
+                }
+                //二次贝塞尔曲线
+                if (xmlElement is DocumentFormat.OpenXml.Drawing.QuadraticBezierCurveTo quadraticBezierCurveTo)
+                {
+                    OpenXmlElementList list = quadraticBezierCurveTo.ChildElements;
+                    QuadBezPath quadBezPath = new QuadBezPath { Type = "QuadBez" };
+                    foreach (var ls in list)
+                    {
+                        if (ls is DocumentFormat.OpenXml.Drawing.Point point)
+                        {
+                            quadBezPath.Pts.Add(new Point { X = double.Parse(point.X) * inchpixel / pxBase, Y = double.Parse(point.Y) * inchpixel / pxBase });
+
+                        }
+                    }
+                    Paths.Add(quadBezPath);
+                }
+                //处理曲线
+                if (xmlElement is DocumentFormat.OpenXml.Drawing.ArcTo arcTO)
+                {
+                    ArcToPath arcToPath = new ArcToPath() { WidthRadius = arcTO.WidthRadius, HeightRadius = arcTO.HeightRadius, StartAngle = arcTO.StartAngle, SwingAngle = arcTO.SwingAngle };
+                    Paths.Add(arcToPath);
+                }
+                ///判断路径是否闭合
+                if (xmlElement is DocumentFormat.OpenXml.Drawing.CloseShapePath close)
+                {
+                    if (close != null)
+                    {
+                        ClosePath closePath = new ClosePath { Type = "Close" };
+                        closePath.Close = true;
+                        Paths.Add(closePath);
+                    }
+                }
+            }
+            return Paths;
+        }
 
 
         public List<Paragraph> GenTextBody(string nodeXml, XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode,
@@ -499,13 +644,13 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                     //XmlDocument docNode = new XmlDocument();
                     //docNode.LoadXml(pNode.OuterXml);
                     string HorizontalAlign = PowerPointHelper.GetHorizontalAlign(pXmlNode, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles);
+                    string VerticalAlign = PowerPointHelper.GetVerticalAlign(nodeXml, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles);
                     Paragraph paragraph = new Paragraph();
-                    ParagraphStyle paragraphStyle = new ParagraphStyle { Alignment = HorizontalAlign };
+                    ParagraphStyle paragraphStyle = new ParagraphStyle { HoriAlign = HorizontalAlign, VertAlign = VerticalAlign };
                     XmlNodeList pPrNodes = pXmlNode.SelectNodes("//a:pPr", PowerPointHelper.GetXmlnsManager(pXmlNode.NameTable));
                     BuChar buChar = PowerPointHelper.GenBuChar(pXmlNode, slideLayoutTables, slideMasterTables, slideMasterTextStyles, typeNode, hasBuChar);
                     paragraph.BuChar = buChar;
                     paragraph.ParagraphStyle = paragraphStyle;
-
                     XmlNodeList rNodes = pXmlNode.SelectNodes("//a:r", PowerPointHelper.GetXmlnsManager(pXmlNode.NameTable));
                     if (null == rNodes)
                     {
@@ -518,17 +663,14 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                         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, buChar));
                         }
-
                     }
                     paragraphs.Add(paragraph);
                 }
             }
-
             return paragraphs;
         }
 
@@ -536,7 +678,6 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         public Text GenSpanElement(XmlDocument nodeXml, XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode, XmlNode typeNode,
             XmlDocument slideMasterTextStyles, Theme theme, SlidePart slidePart, Dictionary<string, string> colors, BuChar buChar)
         {
-
             XmlNode tNode = nodeXml.SelectSingleNode("//a:t", PowerPointHelper.GetXmlnsManager(nodeXml.NameTable));
             /*
             var text = node["a:t"];
@@ -567,7 +708,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                 Bold = font_weight,
                 Italic = font_style,
                 Decoration = text_decoration,
-                VerticalAlign = vertical_align
+                VertAlign = vertical_align
             };
             string styleText = "color:" + color + ";font-size:" + font_size +
                 ";font-family:" + font_family + ";font-weight:" + font_weight +
@@ -622,7 +763,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         /// <param name="slideLayoutTables"></param>
         /// <param name="slideMasterTables"></param>
         /// <returns></returns>
-        public object ProcessPicNode(DocumentFormat.OpenXml.Presentation.Picture element,
+        public Model.PowerPoint.Picture ProcessPicNode(DocumentFormat.OpenXml.Presentation.Picture element,
             SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> colors, int index,
             HiTeachCC.Model.PowerPoint.Position position,
             Style slideLayoutTables,
@@ -630,6 +771,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         {
 
             HiTeachCC.Model.PowerPoint.Position picPosition = PowerPointHelper.GetPosition(element.OuterXml, null, null);
+            //picPosition.Index = index;
             BlipFill blipFill = element.BlipFill;
             var imageRid = blipFill.Blip.Embed.Value;
             IdPartPair idParie = slidePart.Parts.Where(x => x.RelationshipId == imageRid).FirstOrDefault();
@@ -651,10 +793,11 @@ namespace HiTeachCC.Service.PowerPoint.Implement
             {
                 Type = "Pic",
                 Position = picPosition,
-                Data = base64,
+                Base64 = base64,
                 Fill = fill,
                 Border = border
             };
+            picture.Index = index++;
             return picture;
         }
 
@@ -670,7 +813,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         /// <param name="slideLayoutTables"></param>
         /// <param name="slideMasterTables"></param>
         /// <returns></returns>
-        public object ProcessMcNode(DocumentFormat.OpenXml.AlternateContent element, SlidePart slidePart,
+        public Model.PowerPoint.Picture ProcessMcNode(DocumentFormat.OpenXml.AlternateContent element, SlidePart slidePart,
             SlideMaster slideMaster, Dictionary<string, string> colors,
             int index, HiTeachCC.Model.PowerPoint.Position position,
             Style slideLayoutTables,
@@ -697,7 +840,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         }
 
 
-        public object MathConvertImage(AlternateContent content, Theme theme, Dictionary<string, string> colors, SlidePart slidePart, int index)
+        public Model.PowerPoint.Picture MathConvertImage(AlternateContent content, Theme theme, Dictionary<string, string> colors, SlidePart slidePart, int index)
         {
             var fallbacks = from contentChoice in content.Descendants<AlternateContentFallback>() select contentChoice;
             if (fallbacks.Count() > 0)
@@ -724,17 +867,19 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                                 base64 = "data:" + contentType + ";base64," + base64;
                             }
 
-                            Model.PowerPoint.Position picPosition = PowerPointHelper.GetPosition(shape.OuterXml, null,null);
+                            Model.PowerPoint.Position picPosition = PowerPointHelper.GetPosition(shape.OuterXml, null, null);
                             Border border = PowerPointHelper.GetBorder(shape.OuterXml, true, colors);
                             Model.PowerPoint.Fill fill = PowerPointHelper.GetShapeFill(shape.OuterXml, colors);
+                            //  picPosition.Index = index;
                             Model.PowerPoint.Picture picture = new Model.PowerPoint.Picture
                             {
                                 Type = "Pic",
                                 Position = picPosition,
-                                Data = base64,
+                                Base64 = base64,
                                 Fill = fill,
                                 Border = border
                             };
+                            picture.Index = index++;
                             return picture;
                         }
                     }
@@ -754,13 +899,38 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         /// <param name="slideLayoutTables"></param>
         /// <param name="slideMasterTables"></param>
         /// <returns></returns>
-        public object ProcessGraphicFrameNode(DocumentFormat.OpenXml.Presentation.GraphicFrame element,
+        public Item ProcessGraphicFrameNode(DocumentFormat.OpenXml.Presentation.GraphicFrame graphicFrame,
             SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> colors,
             int index, HiTeachCC.Model.PowerPoint.Position position,
             Style slideLayoutTables,
             Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme)
         {
+            DocumentFormat.OpenXml.Drawing.GraphicData graphicData = graphicFrame.ChildElements.First<DocumentFormat.OpenXml.Drawing.GraphicData>();
+            if (graphicData != null)
+            {
+                OpenXmlElement element = graphicData.ChildElements.First();
+                if (element != null)
+                {
+                    if (element is DocumentFormat.OpenXml.Drawing.Table table)
+                    {
+                         TableConvert(table, theme, colors);
+                    }
+                    if (element is DocumentFormat.OpenXml.Drawing.Chart chart)
+                    {
+                        //return ChartConvert(graphicFrame, theme, colorMap);
+                    }
+                    if (element is DocumentFormat.OpenXml.Drawing.Diagram diagram)
+                    {
+                        //return DiagramConvert(graphicFrame, theme, colorMap);
+                    }
+                }
+            }
             return null;
+        }
+        public void TableConvert(DocumentFormat.OpenXml.Drawing.Table table, Theme theme, Dictionary<string, string> colors)
+        {
+
+            
         }
         /// <summary>
         /// 处理组合图形
@@ -774,18 +944,18 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         /// <param name="slideLayoutTables"></param>
         /// <param name="slideMasterTables"></param>
         /// <returns></returns>
-        public  void ProcessGrpSpNode(List<object>list, DocumentFormat.OpenXml.Presentation.GroupShape element, SlidePart slidePart,
+        public void ProcessGrpSpNode(List<Item> list, DocumentFormat.OpenXml.Presentation.GroupShape element, SlidePart slidePart,
             SlideMaster slideMaster, Dictionary<string, string> colors, int index,
             HiTeachCC.Model.PowerPoint.Position position,
             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)
             {
-                 ProcessNodesInSlide(list ,shape, slidePart, slideMaster, colors, index, position, slideLayoutTables, slideMasterTables, slideMasterTextStyles, theme);
-                
+                ProcessNodesInSlide(list, shape, slidePart, slideMaster, colors, index, position, slideLayoutTables, slideMasterTables, slideMasterTextStyles, theme);
+
             }
             //return list;
         }
@@ -802,13 +972,13 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         /// <param name="slideLayoutTables"></param>
         /// <param name="slideMasterTables"></param>
         /// <returns></returns>
-        public object ProcessCxnSpNode(DocumentFormat.OpenXml.Presentation.ConnectionShape element,
+        public HiTeachCC.Model.PowerPoint.Connector ProcessCxnSpNode(DocumentFormat.OpenXml.Presentation.ConnectionShape element,
             SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> colors,
             int index, HiTeachCC.Model.PowerPoint.Position position,
             Style slideLayoutTables,
             Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme)
         {
-            HiTeachCC.Model.PowerPoint.Shape shape = new HiTeachCC.Model.PowerPoint.Shape();
+            HiTeachCC.Model.PowerPoint.Connector shape = new HiTeachCC.Model.PowerPoint.Connector();
             HiTeachCC.Model.PowerPoint.Position spPosition = null;
             if (element.ShapeProperties != null)
             {
@@ -825,21 +995,50 @@ namespace HiTeachCC.Service.PowerPoint.Implement
             if (shapeType != null)
             {
                 //常规图形
-                HiTeachCC.Model.PowerPoint.Position shapePosition = PowerPointHelper.GetPosition(element.OuterXml, null,null);
+                HiTeachCC.Model.PowerPoint.Position shapePosition = PowerPointHelper.GetPosition(element.OuterXml, null, null);
                 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);
+                //shapePosition.Index = index;
                 shape.Position = shapePosition;
-                shape.Fill = fill;
+                // shape.Fill = fill;
                 shape.Border = border;
-                shape.Type = "shape";
-                shape.ShapeType = shapeType.Value;
+                shape.Type = "CxnSp";
+                shape.CxnType = shapeType.Value;
+                shape.Index = index++;
+                if (headEndTypeNode != null)
+                {
+                    shape.HeadEnd = headEndTypeNode.Value;
+                }
+                if (tailEndTypeNode != null)
+                {
+                    shape.TailEnd = tailEndTypeNode.Value;
+                }
                 return shape;
             }
             return null;
         }
-
+        private async Task ProcessPDF(IFormFile file, Dictionary<string, object> resdict)
+        {
+            string shaCode = ShaHashHelper.GetSHA1(file.OpenReadStream());
+            Dictionary<string, object> dict = new Dictionary<string, object> { { "Sha1Code", shaCode } };
+            List<AzureBlobModel> models = await FindListByDict<AzureBlobModel>(dict);
+            if (models.IsNotEmpty())
+            {
+                resdict.Add("pdf", models[0]);
+                resdict.Add("type", "pdf");
+            }
+            else
+            {
+                AzureBlobModel azureBlobModel = await azureBlobDBRepository.UploadFile(file, "pdffiles", true);
+                azureBlobModel.Sha1Code = shaCode;
+                await SaveOrUpdate<AzureBlobModel>(azureBlobModel);
+                azureBlobModel.Sha1Code = shaCode;
+                resdict.Add("pdf", azureBlobModel);
+                resdict.Add("type", "pdf");
+            }
+        }
     }
 }

+ 3 - 1
HiTeachCC.Service/PowerPoint/Interface/IPowerPointService.cs

@@ -1,14 +1,16 @@
 using HiTeachCC.Model.PowerPoint;
 using HiTeachCC.Service.Core.Interface;
+using Microsoft.AspNetCore.Http;
 using System;
 using System.Collections.Generic;
 using System.IO;
 using System.Text;
+using System.Threading.Tasks;
 
 namespace HiTeachCC.Service.PowerPoint.Interface
 {
     public interface IPowerPointService : IBusinessService, IBaseService
     {
-        Pptx LoadPresentation(Stream presentationStream); 
+        Task<Dictionary<string, object>> LoadPresentation(IFormFile file); 
     }
 }

+ 2 - 2
HiTeachCC/Controllers/Core/FileController.cs

@@ -44,10 +44,10 @@ namespace HiTeachCC.Controllers.Core
         /// <returns></returns>
         [HttpPost("UploadPowerPoint")]
         [RequestSizeLimit(102_400_000_00)] //最大10000m左右
-        public BaseJosnRPCResponse UploadPowerPoint([FromForm] IFormFile file)
+        public async Task<BaseJosnRPCResponse> UploadPowerPoint([FromForm] IFormFile file)
         {
             JsonRPCResponseBuilder responseBuilder = new JsonRPCResponseBuilder();
-            Pptx model =   powerPointService.LoadPresentation(file.OpenReadStream());
+            Dictionary<string, object> model =  await powerPointService.LoadPresentation(file);
             return responseBuilder.Data(model).build();
         }
 

+ 1 - 1
HiTeachCC/HiTeachCC.csproj

@@ -10,7 +10,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.10" />
+    <PackageReference Include="TEAMModelOS.SDK" Version="1.0.12" />
     <PackageReference Include="VueCliMiddleware" Version="2.2.1" />
   </ItemGroup>
 

+ 1 - 1
HiTeachCC/appsettings.Development.json

@@ -14,7 +14,7 @@
     },
     "Blob": {
       "ConnectionString": "https://teammodelstorage.blob.core.chinacloudapi.cn/hiteachcc?st=2019-07-04T11%3A35%3A39Z&se=2070-07-05T11%3A35%3A00Z&sp=rwdl&sv=2018-03-28&sr=c&sig=6y93fcIRmzQpx7bz9GxJd2nqVQFFEflQqAE0U9uLZPw%3D",
-      "Container": "teammodelos",
+      "Container": "hiteachcc",
       "AzureTableDialect": ""
     },
     "CosmosDB": {

+ 1 - 1
HiTeachCC/appsettings.json

@@ -14,7 +14,7 @@
     },
     "Blob": {
       "ConnectionString": "https://teammodelstorage.blob.core.chinacloudapi.cn/hiteachcc?st=2019-07-04T11%3A35%3A39Z&se=2070-07-05T11%3A35%3A00Z&sp=rwdl&sv=2018-03-28&sr=c&sig=6y93fcIRmzQpx7bz9GxJd2nqVQFFEflQqAE0U9uLZPw%3D",
-      "Container": "teammodelos",
+      "Container": "hiteachcc",
       "AzureTableDialect": ""
     },
     "CosmosDB": {