소스 검색

修改PPTLayOut获取内容信息

黄贺彬 5 년 전
부모
커밋
ff350e0105

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

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

+ 12 - 3
HiTeachCC.Model/PowerPoint/Fill.cs

@@ -10,8 +10,17 @@ namespace HiTeachCC.Model.PowerPoint
         /// [a:noFill, solidFill, gradFill, blipFill, pattFill, grpFill]
         ///0,无填充 1.纯色填充 2.渐变填充 3.图片或纹理填充 4.图案填充
         /// </summary>
-        public string Type;
-        public string Color;
-        public string Image;
+        public int Type { get; set; }
+        public string Color { get; set; }
+        public string Image { get; set; }
+        public FillStyle FillStyle { get; set; }
+
+    }
+    public class FillStyle {
+        public int Left { get; set; } = 0;
+        public int Top { get; set; } = 0;
+        public int Right { get; set; } = 0;
+        public int Bottom { get; set; } = 0;
     }
+
 }

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

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

+ 133 - 15
HiTeachCC.Service/PowerPoint/Implement/PowerPointHelper.cs

@@ -5,6 +5,7 @@ using DocumentFormat.OpenXml.Presentation;
 using HiTeachCC.Model.PowerPoint;
 using System.Collections.Generic;
 using System.Drawing;
+using System.Linq;
 using System.Text;
 using System.Xml;
 using TEAMModelOS.SDK.Helper.Common.ColorHelper;
@@ -628,7 +629,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
             XmlNode nofillNode = doc.SelectSingleNode("//p:spPr/a:noFill", GetXmlnsManager(doc.NameTable));
             if (nofillNode != null)
             {
-                return new Model.PowerPoint.Fill() { Type = "0", };
+                return new Model.PowerPoint.Fill() { Type = 0, };
             }
             Model.PowerPoint.Fill fill = new Model.PowerPoint.Fill();
             string fillColor = null;
@@ -661,17 +662,20 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                 //调和颜色
 
             }
-            return new Model.PowerPoint.Fill { Type = "1", Color = fillColor };
+            return new Model.PowerPoint.Fill { Type =1, Color = fillColor };
         }
         /// <summary>
         /// 获取边框样式
         /// </summary>
         /// <param name="nodeXml"></param>
         /// <param name="isSvg"></param>
-        public static Border GetBorder(string nodeXml, bool isSvg, Dictionary<string, string> colorMaps)
+        public static Border GetBorder(string nodeXml, bool isCxnSp, Dictionary<string, string> colorMaps)
         {
             //边框宽度
-            int borderWidth = 1;
+            int borderWidth =0;
+            if (isCxnSp) {
+                borderWidth = 1;
+            }
             XmlDocument doc = new XmlDocument();
             doc.LoadXml(nodeXml);
             XmlNode borderw = doc.SelectSingleNode("//p:spPr/a:ln/@w", GetXmlnsManager(doc.NameTable));
@@ -722,7 +726,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                         break;
                     case "dash":
                         borderType += "dashed";
-                        strokeDasharray = "5";
+                        strokeDasharray = "20";
                         break;
                     case "dashDot":
                         borderType += "dashed";
@@ -764,11 +768,31 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                         //cssText += "#000 solid";
                 }
             }
-            if (string.IsNullOrEmpty(borderType))
+
+            if (isCxnSp)
             {
-                return null;
+                borderWidth = borderWidth == 0 ? 1 : borderWidth;
+                return new Border { Width = borderWidth, Color = borderColor, Type = borderType, Stroke = strokeDasharray };
+            }
+            else {
+                if (string.IsNullOrEmpty(borderType) )
+                {
+                    if (borderWidth == 0)
+                    {
+                        return new Border { Width = 0, Color = borderColor, Type = borderType, Stroke = strokeDasharray };
+                    }
+                    else {
+                        return new Border { Width = borderWidth, Color = borderColor, Type = "solid", Stroke = "0" };
+                    }
+                }
+                else
+                {
+                    borderWidth = borderWidth == 0 ? 1 : borderWidth;
+                    return new Border { Width = borderWidth, Color = borderColor, Type = borderType, Stroke = strokeDasharray };
+                }
             }
-            return new Border { Width = borderWidth, Color = borderColor, Type = borderType, Stroke = strokeDasharray };
+           
+            
         }
         /// <summary>
         /// 调色补充 Shade Tint  LumMod LumOff 等
@@ -1227,8 +1251,9 @@ namespace HiTeachCC.Service.PowerPoint.Implement
             return new HiTeachCC.Model.PowerPoint.Style { IdTable = idXmlDoc, IdxTable = idxXmlDoc, TypeTable = typeXmlDoc };
         }
 
-        public static string GetSlideBackgroundFill(SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> colors, Theme theme)
+        public static Model.PowerPoint.Fill GetSlideBackgroundFill(SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> colors, Theme theme)
         {
+            Model.PowerPoint.Fill fill = null ;
             XmlDocument doc = new XmlDocument();
             string SlideXml = slidePart.Slide.OuterXml;
             doc.LoadXml(SlideXml);
@@ -1261,7 +1286,32 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                     compositeElement.SystemColor,
                     compositeElement.SchemeColor,
                     compositeElement.PresetColor);
-                return colorHex;
+                new Model.PowerPoint.Fill { Type=1,Color=colorHex};
+                return fill;
+            }
+           
+            node_sld = doc.SelectSingleNode("//p:sld/p:cSld/p:bg/p:bgPr/a:blipFill", GetXmlnsManager(doc.NameTable));
+            if (node_sld != null)
+            {
+                DocumentFormat.OpenXml.Drawing.BlipFill blipFill = new DocumentFormat.OpenXml.Drawing.BlipFill(node_sld.OuterXml);
+                var imageRid = blipFill.Blip.Embed.Value;
+                IdPartPair idParie = slidePart.Parts.Where(x => x.RelationshipId == imageRid).FirstOrDefault();
+                ImagePart imagePart = (ImagePart)idParie.OpenXmlPart;
+                var contentType = imagePart.ContentType;
+                string base64 = "";
+                using (var stream = imagePart.GetStream())
+                {
+                    byte[] buffer = new byte[stream.Length];
+                    stream.Read(buffer, 0, buffer.Length);
+                    stream.Close();
+                    base64 = System.Convert.ToBase64String(buffer);
+                    base64 = "data:" + contentType + ";base64," + base64;
+                }
+                string a = node_sld.OuterXml;
+                doc.LoadXml(slideMaster.OuterXml);
+                FillStyle fillStyle = GetFillStyle(doc);
+                fill = new Model.PowerPoint.Fill { Type = 3, Image = base64, FillStyle = fillStyle };
+                return fill;
             }
             string SlideLayoutXml = slidePart.SlideLayoutPart.SlideLayout.OuterXml;
             OverrideColorMapping colorMap = slidePart.SlideLayoutPart.SlideLayout.ColorMapOverride.OverrideColorMapping;
@@ -1286,7 +1336,8 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                     compositeElement.SystemColor,
                     compositeElement.SchemeColor,
                     compositeElement.PresetColor);
-                return colorHex;
+                new Model.PowerPoint.Fill { Type = 1, Color = colorHex };
+                return fill;
             }
             node_sldLayout = doc.SelectSingleNode("//p:sldLayout/p:cSld/p:bg/p:bgRef", GetXmlnsManager(doc.NameTable));
             if (node_sldLayout != null)
@@ -1299,7 +1350,8 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                     compositeElement.SystemColor,
                     compositeElement.SchemeColor,
                     compositeElement.PresetColor);
-                return colorHex;
+                new Model.PowerPoint.Fill { Type = 1, Color = colorHex };
+                return fill;
             }
             string slideMasterXml = slideMaster.OuterXml;
             doc.LoadXml(slideMasterXml);
@@ -1313,7 +1365,8 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                     compositeElement.SystemColor,
                     compositeElement.SchemeColor,
                     compositeElement.PresetColor);
-                return colorHex;
+                new Model.PowerPoint.Fill { Type = 1, Color = colorHex };
+                return fill;
             }
             node_sldMaster = doc.SelectSingleNode("//p:sldMaster/p:cSld/p:bg/p:bgRef", GetXmlnsManager(doc.NameTable));
             if (node_sldMaster != null)
@@ -1325,10 +1378,75 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                     compositeElement.SystemColor,
                     compositeElement.SchemeColor,
                     compositeElement.PresetColor);
-                return colorHex;
+                new Model.PowerPoint.Fill { Type = 1, Color = colorHex };
+                return fill;
+            }
+            doc.LoadXml(slideMaster.OuterXml);
+            node_sld = doc.SelectSingleNode("//p:sldMaster/p:cSld/p:bg/p:bgPr/a:blipFill", GetXmlnsManager(doc.NameTable));
+            if (node_sld != null)
+            {
+              
+                var imgpart = slideMaster.SlideMasterPart.ImageParts;
+                if (imgpart != null)
+                {
+                    string bg64 = "";
+                    imgpart.ToList().ForEach(yy =>
+                    {
+                        var bgct = yy.ContentType;
+                        using (var stream = yy.GetStream())
+                        {
+                            byte[] buffer = new byte[stream.Length];
+                            stream.Read(buffer, 0, buffer.Length);
+                            stream.Close();
+                            bg64 = System.Convert.ToBase64String(buffer);
+                            bg64 = "data:" + bgct + ";base64," + bg64;
+                        }
+                    });
+                    string a =  node_sld.OuterXml;
+                    doc.LoadXml(slideMaster.OuterXml);
+                    FillStyle fillStyle = GetFillStyle( doc);
+                    fill = new Model.PowerPoint.Fill { Type = 3, Image = bg64, FillStyle = fillStyle };
+                    return fill;
+                }
+            }
+            //if (fill == null) {
+
+            //}
+
+            return null ;
+        }
+
+        private static FillStyle GetFillStyle(XmlDocument doc)
+        {
+            XmlNode fillRect_node = doc.SelectSingleNode("//a:stretch/a:fillRect", GetXmlnsManager(doc.NameTable));
+            FillStyle fillStyle = new FillStyle();
+            if (fillRect_node != null)
+            {
+                XmlNode left = doc.SelectSingleNode("//a:stretch/a:fillRect/@l", GetXmlnsManager(doc.NameTable));
+                XmlNode top = doc.SelectSingleNode("//a:stretch/a:fillRect/@t", GetXmlnsManager(doc.NameTable));
+                XmlNode right = doc.SelectSingleNode("//a:stretch/a:fillRect/@r", GetXmlnsManager(doc.NameTable));
+                XmlNode bottom = doc.SelectSingleNode("//a:stretch/a:fillRect/@b", GetXmlnsManager(doc.NameTable));
+                if (left != null)
+                {
+                    fillStyle.Left = int.Parse(left.Value);
+                }
+                if (top != null)
+                {
+                    fillStyle.Top = int.Parse(top.Value);
+                }
+                if (right != null)
+                {
+                    fillStyle.Right = int.Parse(right.Value);
+                }
+                if (bottom != null)
+                {
+                    fillStyle.Bottom = int.Parse(bottom.Value);
+                }
             }
-            return "#FFF";
+
+            return fillStyle;
         }
+
         public static Dictionary<string, string> DoColorMap(OverrideColorMapping overrideColorMapping, ColorMap colorMap, Theme theme)
         {
             string[] colors = { "accent1", "accent2", "accent3", "accent4", "accent5", "accent6",

+ 138 - 61
HiTeachCC.Service/PowerPoint/Implement/PowerPointService.cs

@@ -78,15 +78,18 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                     throw new ArgumentNullException("presentationDocument");
                 }
                 var thumbnailPart = presentationDocument.ThumbnailPart;
-                var contentType = thumbnailPart.ContentType;
+               
                 string base64 = "";
-                using (var stream = thumbnailPart.GetStream())
-                {
-                    byte[] buffer = new byte[stream.Length];
-                    stream.Read(buffer, 0, buffer.Length);
-                    stream.Close();
-                    base64 = System.Convert.ToBase64String(buffer);
-                    base64 = "data:" + contentType + ";base64," + base64;
+                if (thumbnailPart != null) {
+                    var contentType = thumbnailPart.ContentType;
+                    using (var stream = thumbnailPart.GetStream())
+                    {
+                        byte[] buffer = new byte[stream.Length];
+                        stream.Read(buffer, 0, buffer.Length);
+                        stream.Close();
+                        base64 = System.Convert.ToBase64String(buffer);
+                        base64 = "data:" + contentType + ";base64," + base64;
+                    }
                 }
                 PresentationPart presentationPart = presentationDocument.PresentationPart;
                 if (presentationPart != null && presentationPart.Presentation != null)
@@ -107,6 +110,40 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                         slideMaster = slideMasterPart.SlideMaster;
                         colorMap = slideMasterPart.SlideMaster.ColorMap;
                         theme = slideMasterPart.ThemePart.Theme;
+                        var imgpart = slideMasterPart.ImageParts;
+                        if (imgpart != null)
+                        {
+                            imgpart.ToList().ForEach(yy =>
+                            {
+                                var bgct = yy.ContentType;
+                                string bg64 = "";
+                                using (var stream = yy.GetStream())
+                                {
+                                    byte[] buffer = new byte[stream.Length];
+                                    stream.Read(buffer, 0, buffer.Length);
+                                    stream.Close();
+                                    bg64 = System.Convert.ToBase64String(buffer);
+                                    bg64 = "data:" + bgct + ";base64," + bg64;
+                                }
+                            });
+                            //  slideMaster.CommonSlideData.Background.BackgroundProperties;
+
+                            //blipfill blipfill = element.blipfill;
+                            //var imagerid = blipfill.blip.embed.value;
+                            //idpartpair idparie = slidepart.parts.where(x => x.relationshipid == imagerid).firstordefault();
+                            //imagepart imagepart = (imagepart)idparie.openxmlpart;
+                            //var contenttype = imagepart.contenttype;
+                            //string base64 = "";
+                            //using (var stream = imagepart.getstream())
+                            //{
+                            //    byte[] buffer = new byte[stream.length];
+                            //    stream.read(buffer, 0, buffer.length);
+                            //    stream.close();
+                            //    base64 = system.convert.tobase64string(buffer);
+                            //    base64 = "data:" + contenttype + ";base64," + base64;
+                            //}
+
+                        }
                     }
                     Dictionary<string, string> slideMasterColors = PowerPointHelper.DoColorMap(null, colorMap, theme);
                     //获取PPT 一页大小
@@ -133,16 +170,16 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                             //获取当前页 PPT 的所有元素
                             // slide.Items = GetSlideElement(slidePart, theme, colorMap);
                             //slide.Xml = slidePart.Slide.OuterXml;
-
+                            var slide10 = slidePart.Slide;
                             HiTeachCC.Model.PowerPoint.Slide slide = GetSlideElement(slidePart, slideMaster, slideMasterColors, theme, slideMasterTables, SlideMasterTextStyles, pageSize);
                             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""?>" + 
+                            string result = @"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>" +
                                 @"<?xml-stylesheet type=""text/xsl"" href=""hixml2html.xsl""?>" +
                                 xml.OuterXml;
-                            AzureBlobModel amodel = await azureBlobDBRepository.UploadTextByFolder(result, shaCode, (pageSize + 1) + ".xml" ,"pptx",false);
+                            AzureBlobModel amodel = await azureBlobDBRepository.UploadTextByFolder(result, shaCode, (pageSize + 1) + ".xml", "pptx", false);
                             slides.Add(amodel.BlobUrl);
                             pageSize++;
                         }
@@ -175,7 +212,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
             //用Layout colorMap覆盖 master ColorMap 
             slideMasterColors = PowerPointHelper.GetLayoutOrMasterColors(slidePart, slideMasterColors, theme);
             //slidePart.SlideLayoutPart;
-            string bgColor = PowerPointHelper.GetSlideBackgroundFill(slidePart, slideMaster, slideMasterColors, theme);
+            HiTeachCC.Model.PowerPoint.Fill bgFill = PowerPointHelper.GetSlideBackgroundFill(slidePart, slideMaster, slideMasterColors, theme);
             string slideLayoutXml = slidePart.SlideLayoutPart.SlideLayout.OuterXml;
 
             var slideLayoutTables = PowerPointHelper.IndexNodes(slideLayoutXml);
@@ -186,7 +223,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                 OpenXmlElementList openXmlElements = shapeTrees.First().ChildElements;
                 //TransformGroup transformGroup = shapeTrees.First().GroupShapeProperties.TransformGroup;
                 //HiTeachCC.Model.PowerPoint.Position position = new
-                //    HiTeachCC.Model.PowerPoint.Position();
+                //HiTeachCC.Model.PowerPoint.Position();
                 //position.Rot = transformGroup.Rotation == null ? 0 : transformGroup.Rotation.Value;
                 //position.FlipH = transformGroup.HorizontalFlip == null ? 0 : transformGroup.HorizontalFlip.Value == true ? 1 : 0;
                 //position.FlipV = transformGroup.VerticalFlip == null ? 0 : transformGroup.VerticalFlip.Value == true ? 1 : 0;
@@ -207,12 +244,45 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                     }
 
                     List<Item> list = new List<Item>();
-                    ProcessNodesInSlide(list, element, slidePart, slideMaster, slideMasterColors, index, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme);
+                    ProcessNodesInSlide(list, element, slidePart.Parts, slideMaster, slideMasterColors, index, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme, slidePart, false);
                     slide.Items.AddRange(list);
 
                     index++;
                 }
             }
+            var layOutshapeTrees = from shap in slidePart.SlideLayoutPart.SlideLayout.Descendants<ShapeTree>() select shap;
+            if (layOutshapeTrees.Count() > 0 && layOutshapeTrees.First().ChildElements.Count > 0)
+            {
+                OpenXmlElementList openXmlElements = layOutshapeTrees.First().ChildElements;
+                //TransformGroup transformGroup = shapeTrees.First().GroupShapeProperties.TransformGroup;
+                //HiTeachCC.Model.PowerPoint.Position position = new
+                //HiTeachCC.Model.PowerPoint.Position();
+                //position.Rot = transformGroup.Rotation == null ? 0 : transformGroup.Rotation.Value;
+                //position.FlipH = transformGroup.HorizontalFlip == null ? 0 : transformGroup.HorizontalFlip.Value == true ? 1 : 0;
+                //position.FlipV = transformGroup.VerticalFlip == null ? 0 : transformGroup.VerticalFlip.Value == true ? 1 : 0;
+                //position.X = transformGroup.Offset.X == null ? 0 : transformGroup.Offset.X.Value;
+                //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;
+                int index = 0;
+                foreach (OpenXmlElement element in openXmlElements)
+                {
+                    if (element is DocumentFormat.OpenXml.Presentation.NonVisualGroupShapeProperties np || element is DocumentFormat.OpenXml.Presentation.GroupShapeProperties gp)
+                    {
+                        continue;
+                    }
+
+                    List<Item> list = new List<Item>();
+                    ProcessNodesInSlide(list, element, slidePart.SlideLayoutPart.Parts, slideMaster, slideMasterColors, index, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme, slidePart, true);
+                    slide.Items.AddRange(list);
+                    index++;
+                }
+            }
+            slide.Fill = bgFill;
             return slide;
         }
         /// <summary>
@@ -228,46 +298,53 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         /// <param name="slideMasterTables"></param>
         /// <returns></returns>
         public void ProcessNodesInSlide(List<Item> list, OpenXmlElement element,
-            SlidePart slidePart,
+            IEnumerable<IdPartPair> idPartPairs,
             SlideMaster slideMaster,
             Dictionary<string, string> colorMaps,
             int index,
-            //HiTeachCC.Model.PowerPoint.Position position,
             Style slideLayoutTables,
-            Style slideMasterTables, XmlDocument SlideMasterTextStyles, Theme theme)
+            Style slideMasterTables, XmlDocument SlideMasterTextStyles, Theme theme, SlidePart slidePart, bool isLayOut)
         {
 
             if (element is DocumentFormat.OpenXml.Presentation.Picture pic)//p:pic  图片
             {
-                list.Add(ProcessPicNode(pic, slidePart, slideMaster, colorMaps, index, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme));
-                // pptElement = PictureConvert(picture, theme, colorMap, slidePart, index);
+                list.Add(ProcessPicNode(pic, idPartPairs, slideMaster, colorMaps, index, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme));
             }
             else if (element is DocumentFormat.OpenXml.AlternateContent mc)//mc:alternatecontent   公式等 
             {
-                list.Add(ProcessMcNode(mc, slidePart, slideMaster, colorMaps, index, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme));
-                /// pptElement = AlternateContentConvert(content, theme, colorMap, slidePart, index);
+                list.Add(ProcessMcNode(mc, idPartPairs, slideMaster, colorMaps, index, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme));
             }
             else if (element is DocumentFormat.OpenXml.Presentation.GraphicFrame graphicFrame)//p:graphicFrame   Chart, Diagram, Table
             {
-                list.Add(ProcessGraphicFrameNode(graphicFrame, slidePart, slideMaster, colorMaps, index, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme));
-                /// pptElement = GraphicFrameConvert(graphicFrame, theme, colorMap, index);
+                list.Add(ProcessGraphicFrameNode(graphicFrame, idPartPairs, slideMaster, colorMaps, index, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme));
             }
             else if (element is DocumentFormat.OpenXml.Presentation.GroupShape grpSp)//p:grpSp  组合图形
             {
-                ProcessGrpSpNode(list, grpSp, slidePart, slideMaster, colorMaps, index, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme);
-                /// pptElement = GroupShapeConvert(groupShape, theme, colorMap, index);
+                ProcessGrpSpNode(list, grpSp, idPartPairs, slideMaster, colorMaps, index, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme, slidePart);
             }
             else if (element is DocumentFormat.OpenXml.Presentation.ConnectionShape cxnSp) // p:cxnSp  连接线
             {
-                list.Add(ProcessCxnSpNode(cxnSp, slidePart, slideMaster, colorMaps, index, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme));
-                ///  pptElement = ConnectionShapeConvert(connectionShape, theme, colorMap, index);
+                list.Add(ProcessCxnSpNode(cxnSp, idPartPairs, slideMaster, colorMaps, index, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme));
             }
             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, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme));
+                if (isLayOut)
+                {
+                    XmlDocument doc = new XmlDocument();
+                    doc.LoadXml(element.OuterXml);
+                    XmlNode userDrawnNode = doc.SelectSingleNode("//p:nvPr//@userDrawn", PowerPointHelper.GetXmlnsManager(doc.NameTable));
+                    //处理模板中有无背编辑过的元素
+                    if (userDrawnNode != null && userDrawnNode.Value.Equals("1"))
+                    {
+                        list.Add(ProcessSpNode(sp, idPartPairs, slideMaster, colorMaps, index, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme, slidePart));
+                    }
+                }
+                else
+                {
+                    list.Add(ProcessSpNode(sp, idPartPairs, slideMaster, colorMaps, index, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme, slidePart));
+                }
+
             }
-            //  return null;  //element.OuterXml;
         }
 
 
@@ -283,11 +360,11 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         /// <param name="slideLayoutTables"></param>
         /// <param name="slideMasterTables"></param>
         /// <returns></returns>
-        public HiTeachCC.Model.PowerPoint.Shape ProcessSpNode(DocumentFormat.OpenXml.Presentation.Shape element, SlidePart slidePart, SlideMaster slideMaster,
+        public HiTeachCC.Model.PowerPoint.Shape ProcessSpNode(DocumentFormat.OpenXml.Presentation.Shape element, IEnumerable<IdPartPair> idPartPairs, SlideMaster slideMaster,
             Dictionary<string, string> colors, int index,
             //HiTeachCC.Model.PowerPoint.Position position,
             Style slideLayoutTables,
-            Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme)
+            Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme, SlidePart slidePart)
         {
 
             XmlDocument doc = new XmlDocument();
@@ -410,8 +487,8 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                     // typeNode = getTextByPathList(slideMasterSpNode, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "type"]);
                 }
             }
-            HiTeachCC.Model.PowerPoint.Shape s = GenShape(element, slidePart, slideMaster, colors, index, slideLayoutTables,
-                slideMasterTables, idNode, nameNode, idxNode, typeNode, slideLayoutSpNode, slideMasterSpNode, slideMasterTextStyles, theme);
+            HiTeachCC.Model.PowerPoint.Shape s = GenShape(element, idPartPairs, slideMaster, colors, index, slideLayoutTables,
+                slideMasterTables, idNode, nameNode, idxNode, typeNode, slideLayoutSpNode, slideMasterSpNode, slideMasterTextStyles, theme, slidePart);
             return s;
         }
         /// <summary>
@@ -432,12 +509,12 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         /// <param name="slideLayoutSpNode"></param>
         /// <param name="slideMasterSpNode"></param>
         /// <returns></returns>
-        public HiTeachCC.Model.PowerPoint.Shape GenShape(DocumentFormat.OpenXml.Presentation.Shape element, SlidePart slidePart, SlideMaster slideMaster,
+        public HiTeachCC.Model.PowerPoint.Shape GenShape(DocumentFormat.OpenXml.Presentation.Shape element, IEnumerable<IdPartPair> idPartPairs, 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,
-           XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode, XmlDocument slideMasterTextStyles, Theme theme)
+           XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode, XmlDocument slideMasterTextStyles, Theme theme, SlidePart slidePart)
         {
 
             HiTeachCC.Model.PowerPoint.Shape shape = new HiTeachCC.Model.PowerPoint.Shape();
@@ -459,14 +536,14 @@ namespace HiTeachCC.Service.PowerPoint.Implement
             {
                 //常规图形
                 HiTeachCC.Model.PowerPoint.Position shapePosition = PowerPointHelper.GetPosition(element.OuterXml, slideLayoutSpNode, slideMasterSpNode);
-                Border border = PowerPointHelper.GetBorder(element.OuterXml, true, colors);
+                Border border = PowerPointHelper.GetBorder(element.OuterXml, false, 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.Paragraph = GenTextBody(element.OuterXml, slideLayoutSpNode, slideMasterSpNode, typeNode, slideLayoutTables, slideMasterTables, slideMasterTextStyles, theme, slidePart, colors);
+                shape.Paragraph = GenTextBody(element.OuterXml, slideLayoutSpNode, slideMasterSpNode, typeNode, slideLayoutTables, slideMasterTables, slideMasterTextStyles, theme, idPartPairs, colors, slidePart);
                 shape.Fill = fill;
                 shape.Border = border;
                 shape.Type = "Sp";
@@ -486,14 +563,14 @@ namespace HiTeachCC.Service.PowerPoint.Implement
 
                     //常规图形
                     HiTeachCC.Model.PowerPoint.Position shapePosition = PowerPointHelper.GetPosition(element.OuterXml, slideLayoutSpNode, slideMasterSpNode);
-                    Border border = PowerPointHelper.GetBorder(element.OuterXml, true, colors);
+                    Border border = PowerPointHelper.GetBorder(element.OuterXml, false, 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);
+                        slideLayoutTables, slideMasterTables, slideMasterTextStyles, theme, idPartPairs, colors, slidePart);
                     shape.Fill = fill;
                     shape.Border = border;
                     shape.Type = "Sp";
@@ -508,11 +585,11 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                 {
                     // 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);
+                    Border border = PowerPointHelper.GetBorder(element.OuterXml, false, 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);
+                        slideLayoutTables, slideMasterTables, slideMasterTextStyles, theme, idPartPairs, colors, slidePart);
                     shape.Fill = fill;
                     shape.Border = border;
                     shape.Type = "Sp";
@@ -621,7 +698,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
 
         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)
+            Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme, IEnumerable<IdPartPair> idPartPairs, Dictionary<string, string> colors, SlidePart slidePart)
         {
             List<Paragraph> paragraphs = new List<Paragraph>();
             XmlDocument doc = new XmlDocument();
@@ -660,7 +737,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                     {
                         XmlDocument rNode = new XmlDocument();
                         rNode.LoadXml(pNode.OuterXml);
-                        paragraph.Texts.Add(GenSpanElement(rNode, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles, theme, slidePart, colors, buChar));
+                        paragraph.Texts.Add(GenSpanElement(rNode, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles, theme, idPartPairs, colors, buChar, slidePart));
                     }
                     else
                     {
@@ -669,7 +746,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                         {
                             XmlDocument rNode = new XmlDocument();
                             rNode.LoadXml(rNodes.Item(ri).OuterXml);
-                            paragraph.Texts.Add(GenSpanElement(rNode, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles, theme, slidePart, colors, buChar));
+                            paragraph.Texts.Add(GenSpanElement(rNode, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles, theme, idPartPairs, colors, buChar, slidePart));
                         }
                     }
                     paragraphs.Add(paragraph);
@@ -680,7 +757,7 @@ 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)
+            XmlDocument slideMasterTextStyles, Theme theme, IEnumerable<IdPartPair> idPartPairs, Dictionary<string, string> colors, BuChar buChar, SlidePart slidePart)
         {
             XmlNode tNode = nodeXml.SelectSingleNode("//a:t", PowerPointHelper.GetXmlnsManager(nodeXml.NameTable));
             /*
@@ -768,7 +845,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         /// <param name="slideMasterTables"></param>
         /// <returns></returns>
         public Model.PowerPoint.Picture ProcessPicNode(DocumentFormat.OpenXml.Presentation.Picture element,
-            SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> colors, int index,
+            IEnumerable<IdPartPair> idPartPairs, SlideMaster slideMaster, Dictionary<string, string> colors, int index,
             Style slideLayoutTables,
             Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme)
         {
@@ -777,7 +854,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
             //picPosition.Index = index;
             BlipFill blipFill = element.BlipFill;
             var imageRid = blipFill.Blip.Embed.Value;
-            IdPartPair idParie = slidePart.Parts.Where(x => x.RelationshipId == imageRid).FirstOrDefault();
+            IdPartPair idParie = idPartPairs.Where(x => x.RelationshipId == imageRid).FirstOrDefault();
             ImagePart imagePart = (ImagePart)idParie.OpenXmlPart;
             var contentType = imagePart.ContentType;
             string base64 = "";
@@ -790,7 +867,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                 base64 = "data:" + contentType + ";base64," + base64;
             }
 
-            Border border = PowerPointHelper.GetBorder(element.OuterXml, true, colors);
+            Border border = PowerPointHelper.GetBorder(element.OuterXml, false, colors);
             Model.PowerPoint.Fill fill = PowerPointHelper.GetShapeFill(element.OuterXml, colors);
             Model.PowerPoint.Picture picture = new Model.PowerPoint.Picture
             {
@@ -816,7 +893,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         /// <param name="slideLayoutTables"></param>
         /// <param name="slideMasterTables"></param>
         /// <returns></returns>
-        public Model.PowerPoint.Picture ProcessMcNode(DocumentFormat.OpenXml.AlternateContent element, SlidePart slidePart,
+        public Model.PowerPoint.Picture ProcessMcNode(DocumentFormat.OpenXml.AlternateContent element, IEnumerable<IdPartPair> slidePart,
             SlideMaster slideMaster, Dictionary<string, string> colors,
             int index,
             Style slideLayoutTables,
@@ -843,7 +920,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         }
 
 
-        public Model.PowerPoint.Picture 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, IEnumerable<IdPartPair> slidePart, int index)
         {
             var fallbacks = from contentChoice in content.Descendants<AlternateContentFallback>() select contentChoice;
             if (fallbacks.Count() > 0)
@@ -857,7 +934,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                         if (blipFills.Count() > 0)
                         {
                             var imageRid = blipFills.First().Blip.Embed.Value;
-                            IdPartPair idParie = slidePart.Parts.Where(x => x.RelationshipId == imageRid).FirstOrDefault();
+                            IdPartPair idParie = slidePart.Where(x => x.RelationshipId == imageRid).FirstOrDefault();
                             ImagePart imagePart = (ImagePart)idParie.OpenXmlPart;
                             var contentType = imagePart.ContentType;
                             string base64 = "";
@@ -871,7 +948,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                             }
 
                             Model.PowerPoint.Position picPosition = PowerPointHelper.GetPosition(shape.OuterXml, null, null);
-                            Border border = PowerPointHelper.GetBorder(shape.OuterXml, true, colors);
+                            Border border = PowerPointHelper.GetBorder(shape.OuterXml, false, colors);
                             Model.PowerPoint.Fill fill = PowerPointHelper.GetShapeFill(shape.OuterXml, colors);
                             //  picPosition.Index = index;
                             Model.PowerPoint.Picture picture = new Model.PowerPoint.Picture
@@ -903,7 +980,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         /// <param name="slideMasterTables"></param>
         /// <returns></returns>
         public Item ProcessGraphicFrameNode(DocumentFormat.OpenXml.Presentation.GraphicFrame graphicFrame,
-            SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> colors,
+            IEnumerable<IdPartPair> slidePart, SlideMaster slideMaster, Dictionary<string, string> colors,
             int index,
             Style slideLayoutTables,
             Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme)
@@ -916,7 +993,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                 {
                     if (element is DocumentFormat.OpenXml.Drawing.Table table)
                     {
-                         TableConvert(table, theme, colors);
+                        TableConvert(table, theme, colors);
                     }
                     if (element is DocumentFormat.OpenXml.Drawing.Chart chart)
                     {
@@ -933,7 +1010,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         public void TableConvert(DocumentFormat.OpenXml.Drawing.Table table, Theme theme, Dictionary<string, string> colors)
         {
             int s =
-0;            
+0;
         }
         /// <summary>
         /// 处理组合图形
@@ -947,15 +1024,15 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         /// <param name="slideLayoutTables"></param>
         /// <param name="slideMasterTables"></param>
         /// <returns></returns>
-        public void ProcessGrpSpNode(List<Item> list, DocumentFormat.OpenXml.Presentation.GroupShape element, SlidePart slidePart,
+        public void ProcessGrpSpNode(List<Item> list, DocumentFormat.OpenXml.Presentation.GroupShape element, IEnumerable<IdPartPair> idPartPairs,
             SlideMaster slideMaster, Dictionary<string, string> colors, int index,
             //HiTeachCC.Model.PowerPoint.Position position,
             Style slideLayoutTables,
-            Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme)
+            Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme, SlidePart slidePart)
         {
             var shapes = from shap in element.Descendants<DocumentFormat.OpenXml.Presentation.Shape>() select shap;
             HiTeachCC.Model.PowerPoint.Position position = new HiTeachCC.Model.PowerPoint.Position();
-            TransformGroup transformGroup=  element.GroupShapeProperties.TransformGroup;
+            TransformGroup transformGroup = element.GroupShapeProperties.TransformGroup;
             position.Rot = transformGroup.Rotation == null ? 0 : transformGroup.Rotation.Value;
             position.FlipH = transformGroup.HorizontalFlip == null ? 0 : transformGroup.HorizontalFlip.Value == true ? 1 : 0;
             position.FlipV = transformGroup.VerticalFlip == null ? 0 : transformGroup.VerticalFlip.Value == true ? 1 : 0;
@@ -978,7 +1055,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
             List<Item> items = new List<Item>();
             foreach (var shape in shapes)
             {
-                ProcessNodesInSlide(items, shape, slidePart, slideMaster, colors, index, slideLayoutTables, slideMasterTables, slideMasterTextStyles, theme);
+                ProcessNodesInSlide(items, shape, idPartPairs, slideMaster, colors, index, slideLayoutTables, slideMasterTables, slideMasterTextStyles, theme, slidePart, false);
             }
             group.Shapes = items;
             list.Add(group);
@@ -998,7 +1075,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         /// <param name="slideMasterTables"></param>
         /// <returns></returns>
         public HiTeachCC.Model.PowerPoint.Connector ProcessCxnSpNode(DocumentFormat.OpenXml.Presentation.ConnectionShape element,
-            SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> colors,
+            IEnumerable<IdPartPair> slidePart, SlideMaster slideMaster, Dictionary<string, string> colors,
             int index,
             Style slideLayoutTables,
             Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme)

+ 1 - 0
HiTeachCC/Controllers/Core/FileController.cs

@@ -92,6 +92,7 @@ namespace HiTeachCC.Controllers.Core
                     fileExt = ext;
                 }
                 else {
+                    //解决多种扩展名不能获取的
                     string[] sp = StringHelper.SubMidString(strs[0], "/", ";").Split("-");
                     fileExt = sp[sp.Length - 1];
                     sp= fileExt.Split("+");

+ 2 - 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.14" />
+    <PackageReference Include="TEAMModelOS.SDK" Version="1.0.15" />
     <PackageReference Include="VueCliMiddleware" Version="2.2.1" />
   </ItemGroup>
 
@@ -28,6 +28,7 @@
     <!-- Typescript/Javascript Client Configuration -->
     <SpaRoot>ClientApp\</SpaRoot>
     <DefaultItemExcludes>$(DefaultItemExcludes);$(SpaRoot)node_modules\**</DefaultItemExcludes>
+    <UserSecretsId>e359068c-7896-46e5-992f-469d55656f4b</UserSecretsId>
   </PropertyGroup>
 
   <Target Name="DebugEnsureNodeEnv" BeforeTargets="Build">