瀏覽代碼

提交PPTX解析代码

黄贺彬 5 年之前
父節點
當前提交
f555a1db4e

+ 0 - 31
HiTeachCC.Model/PowerPoint/ColorMap.cs

@@ -1,31 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace HiTeachCC.Model.PowerPoint
-{
-    public class ColorMap
-    {
-
-
-
-
-
-
-
-        public string accent1 { get; set; }
-        public string accent2 { get; set; }
-        public string accent3 { get; set; }
-        public string accent4 { get; set; }
-        public string accent5 { get; set; }
-        public string accent6 { get; set; }
-        public string lt1 { get; set; }
-        public string lt2 { get; set; }
-        public string tx1 { get; set; }
-        public string tx2 { get; set; }
-        public string dk1 { get; set; }
-        public string dk2 { get; set; }
-        public string hlink { get; set; }
-        public string folHlink { get; set; }
-    }
-}

+ 14 - 0
HiTeachCC.Model/PowerPoint/Style.cs

@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+
+namespace HiTeachCC.Model.PowerPoint
+{
+    public class Style
+    {
+        public XmlDocument IdTable { get; set; }
+        public XmlDocument IdxTable { get; set; }
+        public XmlDocument TypeTable { get; set; }
+    }
+}

+ 5 - 4
HiTeachCC.Service/PowerPoint/Implement/PowerPointHelper.cs

@@ -51,14 +51,15 @@ namespace HiTeachCC.Service.PowerPoint.Implement
             return xmlnsManager;
         }
 
+
+
         /// <summary>
         /// 根据slideLayout 或 slideMaster 获取 id idx type
         /// </summary>
         /// <param name="xml"></param>
         /// <returns></returns>
-        public static dynamic IndexNodes(string xml) {
-           
-            XmlDocument doc = new XmlDocument();
+        public static HiTeachCC.Model.PowerPoint.Style IndexNodes(string xml) {
+            XmlDocument doc = new XmlDocument() ;
             doc.LoadXml(xml);
             XmlNodeList spTreeNodes = doc.SelectNodes("//p:cSld/p:spTree/child::*", GetXmlnsManager(doc.NameTable));
 
@@ -143,7 +144,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                     }
                 }
             }
-            return new { idTable=idXmlDoc, idxTable = idxXmlDoc, typeTable = typeXmlDoc };
+            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)

+ 222 - 23
HiTeachCC.Service/PowerPoint/Implement/PowerPointService.cs

@@ -71,6 +71,8 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                     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>();
+                    string slideMasterXml = slideMaster.OuterXml;
+                    Style slideMasterStyle = PowerPointHelper.IndexNodes(slideMasterXml);
                     if (presentation.SlideIdList != null)
                     {
 
@@ -86,7 +88,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                             //获取当前页 PPT 的所有元素
                             // slide.Items = GetSlideElement(slidePart, theme, colorMap);
                             //slide.Xml = slidePart.Slide.OuterXml;
-                            GetSlideElement(slidePart, slideMaster, slideMasterColors, theme);
+                            GetSlideElement(slidePart, slideMaster, slideMasterColors, theme, slideMasterStyle);
                             slides.Add(slide);
                             pageSize++;
                         }
@@ -97,15 +99,23 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                 return null;
             }
         }
-        public HiTeachCC.Model.PowerPoint.Slide GetSlideElement(SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> slideMasterColors, Theme theme)
+        /// <summary>
+        /// 处理图形非可视化信息
+        /// </summary>
+        /// <param name="slidePart"></param>
+        /// <param name="slideMaster"></param>
+        /// <param name="slideMasterColors"></param>
+        /// <param name="theme"></param>
+        /// <param name="slideMasterStyle"></param>
+        /// <returns></returns>
+        public HiTeachCC.Model.PowerPoint.Slide GetSlideElement(SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> slideMasterColors, Theme theme, Style slideMasterStyle)
         {
             //slidePart.SlideLayoutPart;
             string bgColor = PowerPointHelper.GetSlideBackgroundFill(slidePart, slideMaster, slideMasterColors, theme);
-            string slideLayoutXml  = slidePart.SlideLayoutPart.SlideLayout.OuterXml;
+            string slideLayoutXml = slidePart.SlideLayoutPart.SlideLayout.OuterXml;
+
+            var slideLayoutStyle = PowerPointHelper.IndexNodes(slideLayoutXml);
 
-            PowerPointHelper.IndexNodes(slideLayoutXml);
-            string slideMasterXml = slideMaster.OuterXml;
-            PowerPointHelper.IndexNodes(slideMasterXml);
             var shapeTrees = from shap in slidePart.Slide.Descendants<ShapeTree>() select shap;
             if (shapeTrees.Count() > 0 && shapeTrees.First().ChildElements.Count > 0)
             {
@@ -127,48 +137,83 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                 int index = 0;
                 foreach (OpenXmlElement element in openXmlElements)
                 {
-                    ProcessNodesInSlide(element, slidePart, slideMaster, slideMasterColors, index, position);
+                    ProcessNodesInSlide(element, slidePart, slideMaster, slideMasterColors, index, position, slideLayoutStyle, slideMasterStyle);
                     index++;
                 }
             }
             return null;
         }
-        public string ProcessNodesInSlide(OpenXmlElement element, SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> slideMasterColors, int index, HiTeachCC.Model.PowerPoint.Position position)
+        /// <summary>
+        /// 单个元素分类
+        /// </summary>
+        /// <param name="element"></param>
+        /// <param name="slidePart"></param>
+        /// <param name="slideMaster"></param>
+        /// <param name="slideMasterColors"></param>
+        /// <param name="index"></param>
+        /// <param name="position"></param>
+        /// <param name="slideLayoutStyle"></param>
+        /// <param name="slideMasterStyle"></param>
+        /// <returns></returns>
+        public string ProcessNodesInSlide(OpenXmlElement element,
+            SlidePart slidePart,
+            SlideMaster slideMaster,
+            Dictionary<string, string> slideMasterColors,
+            int index,
+            HiTeachCC.Model.PowerPoint.Position position,
+            Style slideLayoutStyle,
+            Style slideMasterStyle)
         {
             if (element is DocumentFormat.OpenXml.Presentation.Shape sp)//p:sp
             {
                 //  pptElement = ShapeConvert(shape, theme, colorMap, index);
-                ProcessSpNode(sp, slidePart, slideMaster, slideMasterColors, index, position);
+                ProcessSpNode(sp, slidePart, slideMaster, slideMasterColors, index, position, slideLayoutStyle, slideMasterStyle);
             }
             else if (element is DocumentFormat.OpenXml.Presentation.Picture pic)//p:pic
             {
-                ProcessPicNode(pic, slidePart, slideMaster, slideMasterColors, index, position);
+                ProcessPicNode(pic, slidePart, slideMaster, slideMasterColors, index, position, slideLayoutStyle, slideMasterStyle);
                 // pptElement = PictureConvert(picture, theme, colorMap, slidePart, index);
             }
             else if (element is DocumentFormat.OpenXml.AlternateContent mc)//mc:alternatecontent 
             {
-                ProcessMcNode(mc, slidePart, slideMaster, slideMasterColors, index, position);
+                ProcessMcNode(mc, slidePart, slideMaster, slideMasterColors, index, position, slideLayoutStyle, slideMasterStyle);
                 /// pptElement = AlternateContentConvert(content, theme, colorMap, slidePart, index);
             }
             else if (element is DocumentFormat.OpenXml.Presentation.GraphicFrame graphicFrame)//p:graphicFrame
             {
-                ProcessGraphicFrameNode(graphicFrame, slidePart, slideMaster, slideMasterColors, index, position);
+                ProcessGraphicFrameNode(graphicFrame, slidePart, slideMaster, slideMasterColors, index, position, slideLayoutStyle, slideMasterStyle);
                 /// pptElement = GraphicFrameConvert(graphicFrame, theme, colorMap, index);
             }
             else if (element is DocumentFormat.OpenXml.Presentation.GroupShape grpSp)//p:grpSp
             {
-                ProcessGrpSpNode(grpSp, slidePart, slideMaster, slideMasterColors, index, position);
+                ProcessGrpSpNode(grpSp, slidePart, slideMaster, slideMasterColors, index, position, slideLayoutStyle, slideMasterStyle);
                 /// pptElement = GroupShapeConvert(groupShape, theme, colorMap, index);
             }
             else if (element is DocumentFormat.OpenXml.Presentation.ConnectionShape cxnSp) // p:cxnSp
             {
-                ProcessCxnSpNode(cxnSp, slidePart, slideMaster, slideMasterColors, index, position);
+                ProcessCxnSpNode(cxnSp, slidePart, slideMaster, slideMasterColors, index, position, slideLayoutStyle, slideMasterStyle);
                 ///  pptElement = ConnectionShapeConvert(connectionShape, theme, colorMap, index);
             }
             return null;
         }
+
+
+        /// <summary>
+        /// 处理Shape的样式 位置信息
+        /// </summary>
+        /// <param name="element"></param>
+        /// <param name="slidePart"></param>
+        /// <param name="slideMaster"></param>
+        /// <param name="colors"></param>
+        /// <param name="index"></param>
+        /// <param name="position"></param>
+        /// <param name="slideLayoutStyle"></param>
+        /// <param name="slideMasterStyle"></param>
+        /// <returns></returns>
         public string ProcessSpNode(DocumentFormat.OpenXml.Presentation.Shape element, SlidePart slidePart, SlideMaster slideMaster,
-            Dictionary<string, string> colors, int index, HiTeachCC.Model.PowerPoint.Position position)
+            Dictionary<string, string> colors, int index, HiTeachCC.Model.PowerPoint.Position position,
+            Style slideLayoutStyle,
+            Style slideMasterStyle)
         {
             HiTeachCC.Model.PowerPoint.Shape shape = new HiTeachCC.Model.PowerPoint.Shape();
             HiTeachCC.Model.PowerPoint.Position spPosition = null;
@@ -185,12 +230,85 @@ namespace HiTeachCC.Service.PowerPoint.Implement
             doc.LoadXml(element.OuterXml);
             //获取当前节点的相关样式属性
             XmlNode idNode = doc.SelectSingleNode("//p:nvSpPr/p:cNvPr/@id", PowerPointHelper.GetXmlnsManager(doc.NameTable));
-            XmlNode NameNode = doc.SelectSingleNode("//p:nvSpPr/p:cNvPr/@name", PowerPointHelper.GetXmlnsManager(doc.NameTable));
+            XmlNode nameNode = doc.SelectSingleNode("//p:nvSpPr/p:cNvPr/@name", PowerPointHelper.GetXmlnsManager(doc.NameTable));
             XmlNode idxNode = doc.SelectSingleNode("//p:nvSpPr/p:nvPr/p:ph/@idx", PowerPointHelper.GetXmlnsManager(doc.NameTable));
             XmlNode typeNode = doc.SelectSingleNode("//p:nvSpPr/p:nvPr/p:ph/@type", PowerPointHelper.GetXmlnsManager(doc.NameTable));
+            XmlDocument slideLayoutSpNode = null;
+            XmlDocument slideMasterSpNode = null;
+            if (typeNode != null)
+            {
+                slideLayoutSpNode = slideLayoutStyle.TypeTable;
+                slideMasterSpNode = slideMasterStyle.TypeTable;
+            }
+            else
+            {
+                if (idxNode != null)
+                {
+                    slideLayoutSpNode = slideLayoutStyle.IdxTable;
+                    slideMasterSpNode = slideMasterStyle.IdxTable;
+                }
+            }
+            if (typeNode == null)
+            {
+                typeNode = slideLayoutSpNode.SelectSingleNode("//p:nvSpPr/p:nvPr/p:ph/@type", PowerPointHelper.GetXmlnsManager(slideLayoutSpNode.NameTable));
+                //getTextByPathList(slideLayoutSpNode, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "type"]);
+                if (typeNode == null)
+                {
+                    typeNode = slideLayoutSpNode.SelectSingleNode("//p:nvSpPr/p:nvPr/p:ph/@type", PowerPointHelper.GetXmlnsManager(slideLayoutSpNode.NameTable));
+                    // typeNode = getTextByPathList(slideMasterSpNode, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "type"]);
+                }
+            }
             return null;
         }
+        /// <summary>
+        /// 处理图形的具体信息
+        /// </summary>
+        /// <param name="element"></param>
+        /// <param name="slidePart"></param>
+        /// <param name="slideMaster"></param>
+        /// <param name="colors"></param>
+        /// <param name="index"></param>
+        /// <param name="position"></param>
+        /// <param name="slideLayoutStyle"></param>
+        /// <param name="slideMasterStyle"></param>
+        /// <param name="idNode"></param>
+        /// <param name="nameNode"></param>
+        /// <param name="idxNode"></param>
+        /// <param name="typeNode"></param>
+        /// <param name="slideLayoutSpNode"></param>
+        /// <param name="slideMasterSpNode"></param>
+        /// <returns></returns>
+        public object GenShape(DocumentFormat.OpenXml.Presentation.Shape element, SlidePart slidePart, SlideMaster slideMaster,
+           Dictionary<string, string> colors, int index, HiTeachCC.Model.PowerPoint.Position position,
+           Style slideLayoutStyle,
+           Style slideMasterStyle, XmlNode idNode, XmlNode nameNode, XmlNode idxNode, XmlNode typeNode, XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode)
+        {
+            XmlDocument doc = new XmlDocument();
+            doc.LoadXml(element.OuterXml);
+            XmlNode shapeType = doc.SelectSingleNode("//p:spPr/a:prstGeom/@prst", PowerPointHelper.GetXmlnsManager(doc.NameTable));
+            if (shapeType != null)
+            {
+               //常规图形
 
+            }
+            else
+            {
+                shapeType = doc.SelectSingleNode("//p:spPr/a:custGeom", PowerPointHelper.GetXmlnsManager(doc.NameTable));
+                if (shapeType != null)
+                {
+                    //自定义图形 画线 轨迹
+                }
+                else {
+                    //都不是的图形 如页眉 页脚
+                }
+            }
+            return null;
+        }
+        /// <summary>
+        /// 获取位置信息
+        /// </summary>
+        /// <param name="transform2D"></param>
+        /// <returns></returns>
         private static HiTeachCC.Model.PowerPoint.Position GetPositionByTransform2D(Transform2D transform2D)
         {
             HiTeachCC.Model.PowerPoint.Position spPosition = new HiTeachCC.Model.PowerPoint.Position();
@@ -203,29 +321,110 @@ namespace HiTeachCC.Service.PowerPoint.Implement
             spPosition.Cy = transform2D.Extents.Cy == null ? 0 : transform2D.Extents.Cy.Value;
             return spPosition;
         }
-
-        public string ProcessPicNode(DocumentFormat.OpenXml.Presentation.Picture element, SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> colors, int index, HiTeachCC.Model.PowerPoint.Position position)
+        /// <summary>
+        /// 处理图片
+        /// </summary>
+        /// <param name="element"></param>
+        /// <param name="slidePart"></param>
+        /// <param name="slideMaster"></param>
+        /// <param name="colors"></param>
+        /// <param name="index"></param>
+        /// <param name="position"></param>
+        /// <param name="slideLayoutStyle"></param>
+        /// <param name="slideMasterStyle"></param>
+        /// <returns></returns>
+        public string ProcessPicNode(DocumentFormat.OpenXml.Presentation.Picture element,
+            SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> colors, int index,
+            HiTeachCC.Model.PowerPoint.Position position,
+            Style slideLayoutStyle,
+            Style slideMasterStyle)
         {
             return null;
         }
-        public string ProcessMcNode(DocumentFormat.OpenXml.AlternateContent element, SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> colors, int index, HiTeachCC.Model.PowerPoint.Position position)
+
+        /// <summary>
+        /// 处理包含公式等的信息
+        /// </summary>
+        /// <param name="element"></param>
+        /// <param name="slidePart"></param>
+        /// <param name="slideMaster"></param>
+        /// <param name="colors"></param>
+        /// <param name="index"></param>
+        /// <param name="position"></param>
+        /// <param name="slideLayoutStyle"></param>
+        /// <param name="slideMasterStyle"></param>
+        /// <returns></returns>
+        public string ProcessMcNode(DocumentFormat.OpenXml.AlternateContent element, SlidePart slidePart,
+            SlideMaster slideMaster, Dictionary<string, string> colors,
+            int index, HiTeachCC.Model.PowerPoint.Position position,
+            Style slideLayoutStyle,
+            Style slideMasterStyle)
         {
             return null;
         }
-        public string ProcessGraphicFrameNode(DocumentFormat.OpenXml.Presentation.GraphicFrame element, SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> colors, int index, HiTeachCC.Model.PowerPoint.Position position)
+        /// <summary>
+        /// 处理复杂图形的
+        /// </summary>
+        /// <param name="element"></param>
+        /// <param name="slidePart"></param>
+        /// <param name="slideMaster"></param>
+        /// <param name="colors"></param>
+        /// <param name="index"></param>
+        /// <param name="position"></param>
+        /// <param name="slideLayoutStyle"></param>
+        /// <param name="slideMasterStyle"></param>
+        /// <returns></returns>
+        public string ProcessGraphicFrameNode(DocumentFormat.OpenXml.Presentation.GraphicFrame element,
+            SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> colors,
+            int index, HiTeachCC.Model.PowerPoint.Position position,
+            Style slideLayoutStyle,
+            Style slideMasterStyle)
         {
             return null;
         }
-        public string ProcessGrpSpNode(DocumentFormat.OpenXml.Presentation.GroupShape element, SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> colors, int index, HiTeachCC.Model.PowerPoint.Position position)
+        /// <summary>
+        /// 处理组合图形
+        /// </summary>
+        /// <param name="element"></param>
+        /// <param name="slidePart"></param>
+        /// <param name="slideMaster"></param>
+        /// <param name="colors"></param>
+        /// <param name="index"></param>
+        /// <param name="position"></param>
+        /// <param name="slideLayoutStyle"></param>
+        /// <param name="slideMasterStyle"></param>
+        /// <returns></returns>
+        public string ProcessGrpSpNode(DocumentFormat.OpenXml.Presentation.GroupShape element, SlidePart slidePart,
+            SlideMaster slideMaster, Dictionary<string, string> colors, int index,
+            HiTeachCC.Model.PowerPoint.Position position,
+            Style slideLayoutStyle,
+            Style slideMasterStyle)
         {
             var shapes = from shap in element.Descendants<DocumentFormat.OpenXml.Presentation.Shape>() select shap;
             foreach (var shape in shapes)
             {
-                string s = ProcessNodesInSlide(shape, slidePart, slideMaster, colors, index, position);
+                string s = ProcessNodesInSlide(shape, slidePart, slideMaster, colors, index, position, slideLayoutStyle, slideMasterStyle);
             }
             return null;
         }
-        public string ProcessCxnSpNode(DocumentFormat.OpenXml.Presentation.ConnectionShape element, SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> colors, int index, HiTeachCC.Model.PowerPoint.Position position)
+
+        /// <summary>
+        /// 处理连接线的信息
+        /// </summary>
+        /// <param name="element"></param>
+        /// <param name="slidePart"></param>
+        /// <param name="slideMaster"></param>
+        /// <param name="colors"></param>
+        /// <param name="index"></param>
+        /// <param name="position"></param>
+        /// <param name="slideLayoutStyle"></param>
+        /// <param name="slideMasterStyle"></param>
+        /// <returns></returns>
+        public string ProcessCxnSpNode(DocumentFormat.OpenXml.Presentation.ConnectionShape element,
+            SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> colors,
+            int index, HiTeachCC.Model.PowerPoint.Position position,
+            Style slideLayoutStyle,
+            Style slideMasterStyle)
         {
             return null;
         }

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

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