using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Drawing; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Presentation; using HiTeachCC.Model.PowerPoint; using HiTeachCC.Service.Core.Implement; using HiTeachCC.Service.PowerPoint.Interface; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Xml; using ColorMap = DocumentFormat.OpenXml.Presentation.ColorMap; using Paragraph = HiTeachCC.Model.PowerPoint.Paragraph; using Shape = HiTeachCC.Model.PowerPoint.Shape; using Text = HiTeachCC.Model.PowerPoint.Text; using Theme = DocumentFormat.OpenXml.Drawing.Theme; namespace HiTeachCC.Service.PowerPoint.Implement { public class PowerPointService : BaseService, IPowerPointService { const double inchpixel = 96.00, inchpt = 72.00, pxBase = 914400.00, ptBase = 12700; const double rotBase = 60000.00; public Dictionary> styleTable = new Dictionary>(); /// /// 加载PPTX文件 /// /// /// public Pptx LoadPresentation(Stream presentationStream) { using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationStream, 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 = ""; 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) { // Get a Presentation object from the PresentationPart object. Presentation presentation = presentationPart.Presentation; int pageSize = 0; var slideMasterParts = presentationPart.SlideMasterParts; ColorMap colorMap = null; SlideMaster slideMaster = null; Theme theme = null; foreach (var slideMasterPart in slideMasterParts) { if (colorMap != null && theme != null) { break; } slideMaster = slideMasterPart.SlideMaster; colorMap = slideMasterPart.SlideMaster.ColorMap; theme = slideMasterPart.ThemePart.Theme; } Dictionary slideMasterColors = PowerPointHelper.DoColorMap(null, colorMap, theme); //获取PPT 一页大小 double x = presentation.SlideSize.Cx * inchpixel / pxBase; double y = presentation.SlideSize.Cy * inchpixel / pxBase; List slides = new List(); string slideMasterXml = slideMaster.OuterXml; Style slideMasterTables = PowerPointHelper.IndexNodes(slideMasterXml); XmlDocument SlideMasterTextStyles= PowerPointHelper.GetSlideMasterTextStyles(slideMasterXml); if (presentation.SlideIdList != null) { // presentation.SlideIdList.OrderBy(x=>x.); // Get the title of each slide in the slide order. // 获取的是几页PPT数量 foreach (var slideId in presentation.SlideIdList.Elements()) { // HiTeachCC.Model.PowerPoint.Slide slide = new HiTeachCC.Model.PowerPoint.Slide(); // 获取这一页 PPT 的id string id = slideId.RelationshipId; SlidePart slidePart = presentationPart.GetPartById(slideId.RelationshipId) as SlidePart; if (slidePart.Uri.ToString().Equals("/ppt/slides/slide10.xml")) { string a = ""; } //获取当前页 PPT 的所有元素 // slide.Items = GetSlideElement(slidePart, theme, colorMap); //slide.Xml = slidePart.Slide.OuterXml; HiTeachCC.Model.PowerPoint.Slide slide = GetSlideElement(slidePart, slideMaster, slideMasterColors, theme, slideMasterTables , SlideMasterTextStyles , pageSize); slides.Add(slide); pageSize++; } } Pptx info = new Pptx { Slides = slides, Width = x, Height = y, PageSize = pageSize, Thumbnail = base64 }; return info; } return null; } } /// /// 处理图形非可视化信息 /// /// /// /// /// /// /// public HiTeachCC.Model.PowerPoint.Slide GetSlideElement(SlidePart slidePart, SlideMaster slideMaster, Dictionary slideMasterColors, Theme theme, Style slideMasterTables, XmlDocument SlideMasterTextStyles , int pageSize) { Model.PowerPoint.Slide slide = new Model.PowerPoint.Slide() { index = pageSize }; //用Layout colorMap覆盖 master ColorMap slideMasterColors = PowerPointHelper.GetLayoutOrMasterColors(slidePart, slideMasterColors, theme); //slidePart.SlideLayoutPart; string bgColor = PowerPointHelper.GetSlideBackgroundFill(slidePart, slideMaster, slideMasterColors, theme); string slideLayoutXml = slidePart.SlideLayoutPart.SlideLayout.OuterXml; var slideLayoutTables = PowerPointHelper.IndexNodes(slideLayoutXml); var shapeTrees = from shap in slidePart.Slide.Descendants() select shap; if (shapeTrees.Count() > 0 && shapeTrees.First().ChildElements.Count > 0) { OpenXmlElementList openXmlElements = shapeTrees.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 ? false : transformGroup.HorizontalFlip.Value; position.FlipV = transformGroup.VerticalFlip == null ? false : transformGroup.VerticalFlip.Value; 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; } slide.Items.Add( ProcessNodesInSlide(element, slidePart, slideMaster, slideMasterColors, index, position, slideLayoutTables, slideMasterTables , SlideMasterTextStyles,theme)); index++; } } return slide; } /// /// 单个元素分类 /// /// /// /// /// /// /// /// /// /// public object ProcessNodesInSlide(OpenXmlElement element, SlidePart slidePart, SlideMaster slideMaster, Dictionary colorMaps, int index, HiTeachCC.Model.PowerPoint.Position position, Style slideLayoutTables, Style slideMasterTables , XmlDocument SlideMasterTextStyles, Theme theme) { if (element is DocumentFormat.OpenXml.Presentation.Picture pic)//p:pic 图片 { return ProcessPicNode(pic, slidePart, slideMaster, colorMaps, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme); // pptElement = PictureConvert(picture, theme, colorMap, slidePart, index); } else if (element is DocumentFormat.OpenXml.AlternateContent mc)//mc:alternatecontent 公式等 { return ProcessMcNode(mc, slidePart, slideMaster, colorMaps, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme); /// pptElement = AlternateContentConvert(content, theme, colorMap, slidePart, index); } else if (element is DocumentFormat.OpenXml.Presentation.GraphicFrame graphicFrame)//p:graphicFrame Chart, Diagram, Table { return ProcessGraphicFrameNode(graphicFrame, slidePart, slideMaster, colorMaps, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme); /// pptElement = GraphicFrameConvert(graphicFrame, theme, colorMap, index); } else if (element is DocumentFormat.OpenXml.Presentation.GroupShape grpSp)//p:grpSp 组合图形 { return ProcessGrpSpNode(grpSp, slidePart, slideMaster, colorMaps, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme); /// pptElement = GroupShapeConvert(groupShape, theme, colorMap, index); } else if (element is DocumentFormat.OpenXml.Presentation.ConnectionShape cxnSp) // p:cxnSp 连接线 { return ProcessCxnSpNode(cxnSp, slidePart, slideMaster, colorMaps, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme); /// pptElement = ConnectionShapeConvert(connectionShape, theme, colorMap, index); } else if(element is DocumentFormat.OpenXml.Presentation.Shape sp)//p:sp 形状 { // pptElement = ShapeConvert(shape, theme, colorMap, index); return ProcessSpNode(sp, slidePart, slideMaster, colorMaps, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme); } return element.OuterXml; } /// /// 处理Shape的样式 位置信息 /// /// /// /// /// /// /// /// /// /// public object ProcessSpNode(DocumentFormat.OpenXml.Presentation.Shape element, SlidePart slidePart, SlideMaster slideMaster, Dictionary colors, int index, HiTeachCC.Model.PowerPoint.Position position, Style slideLayoutTables, Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme) { XmlDocument doc = new XmlDocument(); 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 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 slideMasterSpNode 为空时产生的位置 横竖排版 空指针问题 //slideLayoutSpNode = slideLayoutTables.TypeTable; //slideMasterSpNode = slideMasterTables.TypeTable; doc.LoadXml(slideLayoutTables.TypeTable.OuterXml); XmlNodeList types = doc.SelectNodes("//xmlDatas/xmlData", PowerPointHelper.GetXmlnsManager(doc.NameTable)); if (types != null) { int size = types.Count; for (int i = 0; i < size; i++) { XmlNode node = types.Item(i); doc.LoadXml(node.OuterXml); XmlNode id = doc.SelectSingleNode("./xmlData/@id", PowerPointHelper.GetXmlnsManager(doc.NameTable)); if (id.Value.Equals(typeNode.Value)) { XmlDocument nodeDoc = new XmlDocument(); nodeDoc.LoadXml(types.Item(i).OuterXml); slideLayoutSpNode = nodeDoc; break; } } } doc.LoadXml(slideMasterTables.TypeTable.OuterXml); types = doc.SelectNodes("//xmlDatas/xmlData", PowerPointHelper.GetXmlnsManager(doc.NameTable)); if (types != null) { int size = types.Count; for (int i = 0; i < size; i++) { XmlNode node = types.Item(i); doc.LoadXml(node.OuterXml); XmlNode id = doc.SelectSingleNode("./xmlData/@id", PowerPointHelper.GetXmlnsManager(doc.NameTable)); if (id.Value.Equals(typeNode.Value)) { XmlDocument nodeDoc = new XmlDocument(); nodeDoc.LoadXml(types.Item(i).OuterXml); slideMasterSpNode = nodeDoc; break; } } } } else { if (idxNode != null) { //slideLayoutSpNode = slideLayoutTables.IdxTable; //slideMasterSpNode = slideMasterTables.IdxTable; doc.LoadXml(slideLayoutTables.IdxTable.OuterXml); XmlNodeList types = doc.SelectNodes("//xmlDatas/xmlData", PowerPointHelper.GetXmlnsManager(doc.NameTable)); if (types != null) { int size = types.Count; for (int i = 0; i < size; i++) { XmlNode node = types.Item(i); doc.LoadXml(node.OuterXml); XmlNode id = doc.SelectSingleNode("./xmlData/@id", PowerPointHelper.GetXmlnsManager(doc.NameTable)); if (id.Value.Equals(idxNode.Value)) { XmlDocument nodeDoc = new XmlDocument(); nodeDoc.LoadXml(types.Item(i).OuterXml); slideLayoutSpNode = nodeDoc; break; } } } doc.LoadXml(slideMasterTables.IdxTable.OuterXml); types = doc.SelectNodes("//xmlDatas/xmlData", PowerPointHelper.GetXmlnsManager(doc.NameTable)); if (types != null) { int size = types.Count; for (int i = 0; i < size; i++) { XmlNode node = types.Item(i); doc.LoadXml(node.OuterXml); XmlNode id = doc.SelectSingleNode("./xmlData/@id", PowerPointHelper.GetXmlnsManager(doc.NameTable)); if (id.Value.Equals(idxNode.Value)) { XmlDocument nodeDoc = new XmlDocument(); nodeDoc.LoadXml(types.Item(i).OuterXml); slideMasterSpNode = nodeDoc; break; } } } } } if (typeNode == null ) { if (slideLayoutSpNode != null) { typeNode = slideLayoutSpNode.SelectSingleNode("//p:nvSpPr/p:nvPr/p:ph/@type", PowerPointHelper.GetXmlnsManager(slideLayoutSpNode.NameTable)); } //getTextByPathList(slideLayoutSpNode, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "type"]); if (typeNode == null) { if (slideMasterSpNode != null) { typeNode = slideMasterSpNode.SelectSingleNode("//p:nvSpPr/p:nvPr/p:ph/@type", PowerPointHelper.GetXmlnsManager(slideMasterSpNode.NameTable)); } // typeNode = getTextByPathList(slideMasterSpNode, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "type"]); } } object s= GenShape(element, slidePart, slideMaster, colors, index, position, slideLayoutTables, slideMasterTables, idNode, nameNode, idxNode, typeNode, slideLayoutSpNode, slideMasterSpNode , slideMasterTextStyles , theme); return s; } /// /// 处理图形的具体信息 /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// public object GenShape(DocumentFormat.OpenXml.Presentation.Shape element, SlidePart slidePart, SlideMaster slideMaster, Dictionary 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) { HiTeachCC.Model.PowerPoint.Shape shape = new HiTeachCC.Model.PowerPoint.Shape(); HiTeachCC.Model.PowerPoint.Position spPosition = null; if (element.ShapeProperties != null) { Transform2D transform2D = element.ShapeProperties.Transform2D; if (transform2D != null) { spPosition = PowerPointHelper.GetPositionByTransform2D(transform2D); } } DocumentFormat.OpenXml.Presentation.NonVisualShapeProperties nonVisualShapeProperties = element.NonVisualShapeProperties; XmlDocument doc = new XmlDocument(); doc.LoadXml(element.OuterXml); XmlNode shapeType = doc.SelectSingleNode("//p:spPr/a:prstGeom/@prst", PowerPointHelper.GetXmlnsManager(doc.NameTable)); if (shapeType != null) { //常规图形 HiTeachCC.Model.PowerPoint.Position shapePosition = PowerPointHelper.GetPosition(element.OuterXml, slideLayoutSpNode, slideMasterSpNode); Border border = PowerPointHelper.GetBorder(element.OuterXml, true, colors); HiTeachCC.Model.PowerPoint.Fill fill = PowerPointHelper.GetShapeFill(element.OuterXml, colors); var headEndTypeNode = doc.SelectSingleNode("//p:spPr/a:ln/a:headEnd/@type", PowerPointHelper.GetXmlnsManager(doc.NameTable)); var tailEndTypeNode = doc.SelectSingleNode("//p:spPr/a:ln/a:tailEnd/@type", PowerPointHelper.GetXmlnsManager(doc.NameTable)); PowerPointHelper.GenPPTXShape(shapeType); shape.Position = shapePosition; shape.Paragraph = GenTextBody(element.OuterXml, slideLayoutSpNode, slideMasterSpNode, typeNode, slideLayoutTables, slideMasterTables, slideMasterTextStyles, theme, slidePart ,colors); shape.Fill = fill; shape.Border = border; shape.Type = "shape"; shape.ShapeType = shapeType.Value; return shape; } else { shapeType = doc.SelectSingleNode("//p:spPr/a:custGeom", PowerPointHelper.GetXmlnsManager(doc.NameTable)); if (shapeType != null) { //自定义图形 画线 轨迹 //常规图形 HiTeachCC.Model.PowerPoint.Position shapePosition = PowerPointHelper.GetPosition(element.OuterXml, slideLayoutSpNode, slideMasterSpNode); Border border = PowerPointHelper.GetBorder(element.OuterXml, true, colors); HiTeachCC.Model.PowerPoint.Fill fill = PowerPointHelper.GetShapeFill(element.OuterXml, colors); var headEndTypeNode = doc.SelectSingleNode("//p:spPr/a:ln/a:headEnd/@type", PowerPointHelper.GetXmlnsManager(doc.NameTable)); var tailEndTypeNode = doc.SelectSingleNode("//p:spPr/a:ln/a:tailEnd/@type", PowerPointHelper.GetXmlnsManager(doc.NameTable)); PowerPointHelper.GenPPTXShape(shapeType); shape.Position = shapePosition; shape.Paragraph = GenTextBody(element.OuterXml, slideLayoutSpNode, slideMasterSpNode, typeNode, slideLayoutTables, slideMasterTables, slideMasterTextStyles, theme, slidePart, colors); shape.Fill = fill; shape.Border = border; shape.Type = "shape"; shape.ShapeType = "custom"; return shape; } else { string align = PowerPointHelper.GetVerticalAlign(element, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles); HiTeachCC.Model.PowerPoint.Position shapePosition = PowerPointHelper.GetPosition(element.OuterXml,slideLayoutSpNode,slideMasterSpNode); Border border = PowerPointHelper.GetBorder(element.OuterXml, true, colors); HiTeachCC.Model.PowerPoint.Fill fill = PowerPointHelper.GetShapeFill(element.OuterXml,colors); shape.Position = shapePosition; shape.Paragraph = GenTextBody(element.OuterXml, slideLayoutSpNode, slideMasterSpNode, typeNode, slideLayoutTables, slideMasterTables, slideMasterTextStyles, theme, slidePart,colors); shape.Fill = fill; shape.Border = border; shape.Type = "shape"; shape.ShapeType = "rect"; return shape; } } //return null; } public List GenTextBody(string nodeXml, XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode, XmlNode typeNode , Style slideLayoutTables, Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme , SlidePart slidePart,Dictionary colors) { List paragraphs = new List(); XmlDocument doc = new XmlDocument(); doc.LoadXml(nodeXml); XmlNodeList pNodes = doc.SelectNodes("//p:txBody/child::* ",PowerPointHelper. GetXmlnsManager(doc.NameTable)); //XmlNodeList plvlNodes = doc.SelectNodes("//p:txBody/a:p/a:pPr/@lvl", PowerPointHelper.GetXmlnsManager(doc.NameTable)); //bool hasBuChar = false; //if (plvlNodes != null && plvlNodes.Count > 0) { // hasBuChar = true; //} if (pNodes != null) { int size = pNodes.Count; for (int i = 0; i < size; i++) { XmlNode pNode = pNodes.Item(i); if (!pNode.Name.Equals("a:p") ) { continue; } XmlDocument pXmlNode = new XmlDocument(); pXmlNode.LoadXml(pNode.OuterXml); //XmlDocument docNode = new XmlDocument(); //docNode.LoadXml(pNode.OuterXml); string HorizontalAlign= PowerPointHelper.GetHorizontalAlign(pXmlNode , slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles); Paragraph paragraph = new Paragraph(); ParagraphStyle paragraphStyle = new ParagraphStyle { Alignment = HorizontalAlign }; XmlNodeList pPrNodes = pXmlNode.SelectNodes("//a:pPr", PowerPointHelper.GetXmlnsManager(pXmlNode.NameTable)); BuChar buChar= PowerPointHelper.GenBuChar(pXmlNode, slideLayoutTables , slideMasterTables, slideMasterTextStyles , typeNode); paragraph.BuChar = buChar; paragraph.ParagraphStyle = paragraphStyle; XmlNodeList rNodes = pXmlNode.SelectNodes("//a:r", PowerPointHelper.GetXmlnsManager(pXmlNode.NameTable)); if (null == rNodes) { XmlDocument rNode = new XmlDocument(); rNode.LoadXml(pNode.OuterXml); paragraph.Texts.Add(GenSpanElement(rNode, slideLayoutSpNode, slideMasterSpNode,typeNode,slideMasterTextStyles, theme, slidePart ,colors) ); } else { int rsize = rNodes.Count; for (int ri = 0; ri < rsize; ri++) { XmlDocument rNode = new XmlDocument() ; rNode.LoadXml(rNodes.Item(ri).OuterXml); paragraph.Texts.Add(GenSpanElement(rNode, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles,theme , slidePart ,colors)); } } paragraphs.Add(paragraph); } } return paragraphs; } public Text GenSpanElement(XmlDocument nodeXml, XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode, XmlNode typeNode, XmlDocument slideMasterTextStyles, Theme theme, SlidePart slidePart ,Dictionary colors) { XmlNode tNode = nodeXml.SelectSingleNode("//a:t", PowerPointHelper.GetXmlnsManager(nodeXml.NameTable)); /* var text = node["a:t"]; if (typeof text !== 'string') { text = getTextByPathList(node, ["a:fld", "a:t"]); if (typeof text !== 'string') { text = " "; //debug("XXX: " + JSON.stringify(node)); } } */ string color= PowerPointHelper.GetFontColor(nodeXml,typeNode,slideMasterTextStyles , colors); int font_size = PowerPointHelper.GetFontSize(nodeXml,slideLayoutSpNode,slideMasterSpNode,typeNode, slideMasterTextStyles); string font_family = PowerPointHelper.GetFontType(nodeXml, typeNode, slideMasterTextStyles, theme); string font_weight = PowerPointHelper.GetFontBold(nodeXml,typeNode,slideMasterTextStyles); string font_style = PowerPointHelper.GetFontItalic(nodeXml,typeNode,slideMasterTextStyles); string text_decoration = PowerPointHelper.GetFontDecoration(nodeXml,typeNode,slideMasterTextStyles); string vertical_align = PowerPointHelper.GetTextVerticalAlign(nodeXml,typeNode,slideMasterTextStyles); FontStyle fontStyle = new FontStyle { Color = color, Size = font_size, Type = font_family, Bold = font_weight, Italic = font_style, Decoration = text_decoration, VerticalAlign = vertical_align }; string styleText = "color:"+color+ ";font-size:"+ font_size + ";font-family:" + font_family + ";font-weight:" + font_weight + ";font-style:" + font_style + ";text-decoration:" + text_decoration + ";vertical-align:" + vertical_align; string cssName = ""; if (styleTable.TryGetValue(styleText, out Dictionary css)) { cssName = css["name"]; } else { cssName = "_css_" + (styleTable.Keys.Count + 1); styleTable.TryAdd(styleText, new Dictionary { { "name", cssName } , { "text" ,styleText} }); } Text text = new Text { Content=tNode.InnerText ,FontStyle=fontStyle}; XmlNode linkID = nodeXml.SelectSingleNode("//a:rPr/a:hlinkClick/@r:id", PowerPointHelper.GetXmlnsManager(nodeXml.NameTable)); if (linkID != null) { List< DocumentFormat.OpenXml.Packaging.HyperlinkRelationship > hyperlinkRelationships = slidePart.HyperlinkRelationships.ToList(); bool flag = true ; foreach (var HyperlinkRelationship in hyperlinkRelationships){ if (HyperlinkRelationship.Id.Equals(linkID.Value)) { text.Href = HyperlinkRelationship.Uri.ToString(); flag = false; break; } } if (flag) { text.Href = "#"; } } else { text.Href = null; } return text; } /// /// 处理图片 /// /// /// /// /// /// /// /// /// /// public string ProcessPicNode(DocumentFormat.OpenXml.Presentation.Picture element, SlidePart slidePart, SlideMaster slideMaster, Dictionary colors, int index, HiTeachCC.Model.PowerPoint.Position position, Style slideLayoutTables, Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme) { return null; } /// /// 处理包含公式等的信息 /// /// /// /// /// /// /// /// /// /// public string ProcessMcNode(DocumentFormat.OpenXml.AlternateContent element, SlidePart slidePart, SlideMaster slideMaster, Dictionary colors, int index, HiTeachCC.Model.PowerPoint.Position position, Style slideLayoutTables, Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme) { return null; } /// /// 处理复杂图形的 /// /// /// /// /// /// /// /// /// /// public string ProcessGraphicFrameNode(DocumentFormat.OpenXml.Presentation.GraphicFrame element, SlidePart slidePart, SlideMaster slideMaster, Dictionary colors, int index, HiTeachCC.Model.PowerPoint.Position position, Style slideLayoutTables, Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme) { return null; } /// /// 处理组合图形 /// /// /// /// /// /// /// /// /// /// public object ProcessGrpSpNode(DocumentFormat.OpenXml.Presentation.GroupShape element, SlidePart slidePart, SlideMaster slideMaster, Dictionary colors, int index, HiTeachCC.Model.PowerPoint.Position position, Style slideLayoutTables, Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme) { var shapes = from shap in element.Descendants() select shap; foreach (var shape in shapes) { object s = ProcessNodesInSlide(shape, slidePart, slideMaster, colors, index, position, slideLayoutTables, slideMasterTables , slideMasterTextStyles,theme); } return null; } /// /// 处理连接线的信息 /// /// /// /// /// /// /// /// /// /// public string ProcessCxnSpNode(DocumentFormat.OpenXml.Presentation.ConnectionShape element, SlidePart slidePart, SlideMaster slideMaster, Dictionary colors, int index, HiTeachCC.Model.PowerPoint.Position position, Style slideLayoutTables, Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme) { return null; } } }