using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Drawing;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Presentation;
using HiTeachCC.Model.PowerPoint;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;
using System.Xml.XPath;
using TEAMModelOS.SDK.Context.Constant;
using TEAMModelOS.SDK.Context.Exception;
using TEAMModelOS.SDK.Helper.Common.ColorHelper;
using TEAMModelOS.SDK.Helper.Common.StringHelper;
using TEAMModelOS.SDK.Helper.Security.ShaHash;
using TEAMModelOS.SDK.Module.AzureBlob.Container;
using TEAMModelOS.SDK.Module.AzureBlob.Interfaces;
using ColorMap = DocumentFormat.OpenXml.Presentation.ColorMap;
using Theme = DocumentFormat.OpenXml.Drawing.Theme;
namespace HiTeachCC.Service.PowerPoint.Implement
{
public static class PowerPointHelper
{
public static XmlNamespaceManager xmlnsManager ;
public static XmlNode GetTextByPath(this XmlDocument document , string expression) {
return document.SelectSingleNode(expression , xmlnsManager);
}
public static XmlNode GetTextByPath(this XmlNode node, string expression)
{
return node.SelectSingleNode(expression, xmlnsManager);
}
public static XmlNodeList GetTextByPathList(this XmlDocument document, string expression)
{
return document.SelectNodes(expression, xmlnsManager);
}
public static XmlNodeList GetTextByPathList(this XmlNode node, string expression)
{
return node.SelectNodes(expression, xmlnsManager);
}
static PowerPointHelper()
{
xmlnsManager = new XmlNamespaceManager(new NameTable());
xmlnsManager.AddNamespace("p", "http://schemas.openxmlformats.org/presentationml/2006/main");
xmlnsManager.AddNamespace("a", "http://schemas.openxmlformats.org/drawingml/2006/main");
xmlnsManager.AddNamespace("xsl", "http://www.w3.org/1999/XSL/Transform");
xmlnsManager.AddNamespace("fo", "http://www.w3.org/1999/XSL/Format");
xmlnsManager.AddNamespace("app", "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties");
xmlnsManager.AddNamespace("cp", "http://schemas.openxmlformats.org/package/2006/metadata/core-properties");
xmlnsManager.AddNamespace("dc", "http://purl.org/dc/elements/1.1/");
xmlnsManager.AddNamespace("dcterms", "http://purl.org/dc/terms/");
xmlnsManager.AddNamespace("dcmitype", "http://purl.org/dc/dcmitype/");
xmlnsManager.AddNamespace("rel", "http://schemas.openxmlformats.org/package/2006/relationships");
xmlnsManager.AddNamespace("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships");
xmlnsManager.AddNamespace("cus", "http://schemas.openxmlformats.org/officeDocument/2006/custom-properties");
xmlnsManager.AddNamespace("vt", "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes");
xmlnsManager.AddNamespace("pic", "http://schemas.openxmlformats.org/drawingml/2006/picture");
xmlnsManager.AddNamespace("dsp", "http://schemas.microsoft.com/office/drawing/2008/diagram");
xmlnsManager.AddNamespace("dgm", "http://schemas.openxmlformats.org/drawingml/2006/diagram");
xmlnsManager.AddNamespace("a14", "http://schemas.microsoft.com/office/drawing/2010/main");
xmlnsManager.AddNamespace("m", "http://schemas.openxmlformats.org/officeDocument/2006/math");
xmlnsManager.AddNamespace("mc", "http://schemas.openxmlformats.org/markup-compatibility/2006");
xmlnsManager.AddNamespace("p14", "http://schemas.microsoft.com/office/powerpoint/2010/main");
xmlnsManager.AddNamespace("pkg", "http://schemas.microsoft.com/office/2006/xmlPackage");
xmlnsManager.AddNamespace("p15", "http://schemas.microsoft.com/office/powerpoint/2012/main");
xmlnsManager.AddNamespace("a16", "http://schemas.microsoft.com/office/drawing/2014/main");
xmlnsManager.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
xmlnsManager.AddNamespace("c", "http://schemas.openxmlformats.org/drawingml/2006/chart");
xmlnsManager.AddNamespace("c14", "http://schemas.microsoft.com/office/drawing/2007/8/2/chart");
xmlnsManager.AddNamespace("c16", "http://schemas.microsoft.com/office/drawing/2014/chart");
xmlnsManager.AddNamespace("cs", "http://schemas.microsoft.com/office/drawing/2012/chartStyle");
xmlnsManager.AddNamespace("thm15", "http://schemas.microsoft.com/office/thememl/2012/main");
xmlnsManager.AddNamespace("fn", "http://www.w3.org/2005/xpath-functions");
}
public static void GenPPTXShape(XmlNode shapeType)
{
string svgPath = "";
switch (shapeType.Value)
{
//线形标注 1(带边框和强调线)
case "accentBorderCallout1": break;
//线形标注 2(带边框和强调线)
case "accentBorderCallout2": break;
//线形标注 3(带边框和强调线)
case "accentBorderCallout3": break;
//线形标注 1(带强调线)
case "accentCallout1": break;
//线形标注 2(带强调线)
case "accentCallout2": break;
//线形标注 3(带强调线)
case "accentCallout3": break;
//动作按钮后退或前一项
case "actionButtonBackPrevious": break;
//动作按钮开始
case "actionButtonBeginning": break;
//按钮自定义
case "actionButtonBlank": break;
//动作按钮文档
case "actionButtonDocument": break;
//动作按钮 结束
case "actionButtonEnd": break;
//动作按钮前进下一项
case "actionButtonForwardNext": break;
// 动作按钮帮助
case "actionButtonHelp": break;
// 动作按钮 第一张
case "actionButtonHome": break;
// 动作按钮 信息
case "actionButtonInformation": break;
//动作按钮 视频
case "actionButtonMovie": break;
//动作按钮返回
case "actionButtonReturn": break;
//动作按钮 音频
case "actionButtonSound": break;
//弧形 圆弧 弧线
case "arc": break;
//棱台 TODO
case "bevel": break;
// 空心弧 TODO
case "blockArc": break;
//线形标注 1
case "borderCallout1": break;
//线形标注 2
case "borderCallout2": break;
//线形标注 3
case "borderCallout3": break;
//大括号 对 {}
case "bracePair": break;
//括号 对()
case "bracketPair": break;
//callout1线形标注 1(无边框)
case "callout1": break;
//callout1线形标注 2(无边框)
case "callout2": break;
//callout1线形标注 3(无边框)
case "callout3": break;
// 圆柱型 TODO暂不解析
case "can": break;
// 符号 +
case "chartPlus": break;
//符号 *
case "chartStar": break;
//符号x
case "chartX": break;
//燕尾形 长:3:1 左边缺一个单位的三角形 右边多一个单位三角形
case "chevron": break;
//弦形
case "chord": break;
// 云形 宽高比例拉伸
case "cloud": break;
//云形标注
case "cloudCallout": break;
// L 形
case "corner": break;
//角形 标签 github 角形
case "cornerTabs": break;
//立方体 TODO
case "cube": break;
//十边形
case "decagon": break;
////斜纹 斜梯形
case "diagStripe": break;
//菱形
case "diamond": break;
//十二边形
case "dodecagon": break;
//同心圆 TODO
case "donut": break;
//双波形
case "doubleWave": break;
//下箭头标注
case "downArrowCallout": break;
//前凸弯带形
case "ellipseRibbon": break;
//上凸弯带形 8
case "ellipseRibbon2": break;
//可选过程 圆角矩形
case "flowChartAlternateProcess": break;
//对照 长宽2:1 两个等腰三角形 上下尖对尖
case "flowChartCollate": break;
//接点 圆形
case "flowChartConnector": break;
//决策 菱形
case "flowChartDecision": break;
//延期正方形右侧多个半圆
case "flowChartDelay": break;
//显示 正方形 左侧1/4高度等腰三角形 1/4右侧弧形
case "flowChartDisplay": break;
//文档 矩形 下面部分波浪
case "flowChartDocument": break;
//摘录 正方形里面的等腰三角形 向上
case "flowChartExtract": break;
//数据 平行四边形
case "flowChartInputOutput": break;
//内部贮存 左上角横竖各一条线
case "flowChartInternalStorage": break;
//磁盘 圆柱体 向上 宽高 2:1 压扁
case "flowChartMagneticDisk": break;
//直接访问存储器 圆柱体 平躺 宽高 2:1 拉长
case "flowChartMagneticDrum": break;
//顺序访问存储器 圆形 小猪佩奇 下面多个矩形
case "flowChartMagneticTape": break;
//手动输入 矩形 上面部分向左倾斜一点 倾斜高度四分之一
case "flowChartManualInput": break;
//手动操作 倒等腰梯形
case "flowChartManualOperation": break;
//合并 正方形里面的等腰三角形 向下
case "flowChartMerge": break;
// 多文档 3个矩形 下面部分波浪 叠加
case "flowChartMultidocument": break;
//flowChartOfflineStorage 离线存储
case "flowChartOfflineStorage": break;
//离页连接符 正方形 左下角右下角各缺角一边高度为四分之一,一边长为一半的的三角形
case "flowChartOffpageConnector": break;
//存储数据 矩形 左侧多个半圆 右侧缺半圆
case "flowChartOnlineStorage": break;
//或者 圆形经过圆形 两条横竖交叉的直线
case "flowChartOr": break;
//预定义过程 矩形 左右部分各有一条竖线
case "flowChartPredefinedProcess": break;
//准备 六边形 上下被压缩变长2倍边
case "flowChartPreparation": break;
//流程图 矩形
case "flowChartProcess": break;
//卡片 矩形右上角剪角最小宽度的1/4的三角形
case "flowChartPunchedCard": break;
//资料带 波浪形
case "flowChartPunchedTape": break;
// 排序 两个等腰三角形 背对背 长宽2:1
case "flowChartSort": break;
//汇总连接 圆形经过圆形 两条斜交叉的直线
case "flowChartSummingJunction": break;
//终止 最小边半径圆角矩形
case "flowChartTerminator": break;
//折角
case "folderCorner": break;
// 图文框框
case "frame": break;
//漏斗
case "funnel": break;
//齿轮六角
case "gear6": break;
//齿轮9角
case "gear9": break;
// 半闭框
case "halfFrame": break;
//心形 宽高拉伸
case "heart": break;
////七边形
case "heptagon": break;
//六边形1060704 *96/914400=111.36
case "hexagon": break;
//五边形 长高 2:1 矩形加右侧1一个宽的三角形
case "homePlate": break;
//横卷形
case "horizontalScroll": break;
//爆炸形1
case "irregularSeal1": break;
//爆炸形2
case "irregularSeal2": break;
//左箭头
case "leftArrow": break;
//左箭头标注
case "leftArrowCallout": break;
//左大括号{
case "leftBrace": break;
//左括号(
case "leftBracket": break;
//左右箭头标注
case "leftRightArrowCallout": break;
//左右凸出带
case "leftRightRibbon": break;
// 闪电 宽高拉伸
case "lightningBolt": break;
case "lineInv": break;
//除号
case "mathDivide": break;
//等号
case "mathEqual": break;
//减号
case "mathMinus": break;
//乘号
case "mathMultiply": break;
//不等号
case "mathNotEqual": break;
//加号
case "mathPlus": break;
//新月形
case "moon": break;
//非等腰梯形
case "nonIsoscelesTrapezoid": break;
//禁止吸烟
case "noSmoking": break;
// 八边形
case "octagon": break;
//平行四边形
case "parallelogram": break;
//正五边形 宽高决定形变
case "pentagon": break;
////饼图 21600000 16200000 默认16200000 ---> 0
case "pie": break;
//扇形边 扇形
case "pieWedge": break;
//缺角圆角矩形
case "plaque": break;
//缺角 圆角标签
case "plaqueTabs": break;
//十字形
case "plus": break;
// 十字箭头标注
case "quadArrowCallout": break;
//矩形
case "rect":
svgPath = "";
break;
//前凸带形
case "ribbon": break;
//上凸带形
case "ribbon2": break;
//右箭头标注
case "rightArrowCallout": break;
//右大括号}
case "rightBrace": break;
//右括号)
case "rightBracket": break;
//单圆角矩形 右上角圆角缺角 0-50000 = 50% 最小宽度的 百分比作为缺角
case "round1Rect": break;
// 对角圆角矩形 左上角 右下角 圆角缺角0-50000 = 50% 最小宽度的 百分比作为缺角 右上角 左下角 圆角缺角0-50000 = 50% 最小宽度的 百分比作为缺角
case "round2DiagRect": break;
//同侧圆角矩形
case "round2SameRect": break;
//直角三角形 宽高决定形变
case "rtTriangle": break;
//笑脸
case "smileyFace": break;
//剪去单角的矩形 右上角 0-50000 = 50% 最小宽度的 百分比作为缺角
case "snip1Rect": break;
//剪去对角的矩形
case "snip2DiagRect": break;
//剪去同侧角的矩形
case "snip2SameRect": break;
//单圆角矩形
case "snipRoundRect": break;
//方形制表符 不解析
case "squareTabs": break;
// 十角星
case "star10": break;
// 12角星
case "star12": break;
// 16角星
case "star16": break;
// 24角星
case "star24": break;
// 32角星
case "star32": break;
// 4角星
case "star4": break;
// 5角星
case "star5": break;
// 6角星
case "star6": break;
// 7角星
case "star7": break;
// 8角星
case "star8": break;
// 太阳
case "sun": break;
//泪滴型
case "teardrop": break;
//等腰梯形
case "trapezoid": break;
//上箭头标注
case "upArrowCallout": break;
//上下箭头标注
case "upDownArrowCallout": break;
//竖卷形
case "verticalScroll": break;
//波浪形
case "wave": break;
//椭圆形标注
case "wedgeEllipseCallout": break;
// 矩形标注
case "wedgeRectCallout": break;
// 圆角矩形标注
case "wedgeRoundRectCallout": break;
// //椭圆或者圆形
case "ellipse":
svgPath = " ";
break;
// 圆角矩形
case "roundRect": break;
case "bentConnector2": break;
//直接连接符 线
case "line":
svgPath = " ";
break;
//直接箭头连接符
case "straightConnector1": break;
//肘形连接符
// < a:tailEnd type = "triangle" />
case "bentConnector3": break;
//肘形箭头连接符
// case "bentConnector4": break;
//肘形双箭头连接符
// case "bentConnector5": break;
// case "curvedConnector2": break;
//曲线连接符
case "curvedConnector3": break;
// case "curvedConnector4": break;
// case "curvedConnector5": break;
//右箭头
case "rightArrow": break;
//下箭头
case "downArrow": break;
//圆角右箭头
case "bentArrow": break;
//直角上箭头
case "bentUpArrow": break;
//虚尾箭头
case "stripedRightArrow": break;
//十字箭头 TODO
case "quadArrow": break;
//环形箭头
case "circularArrow": break;
case "swooshArrow": break;
// //左右箭头
case "leftRightArrow": break;
//丁字箭头
case "leftRightUpArrow": break;
//直角双向箭头 向左 向上
case "leftUpArrow": break;
//左环形箭头
case "leftCircularArrow": break;
//燕尾形箭头
case "notchedRightArrow": break;
//上弧形箭头 弧形向上 箭头右下
case "curvedDownArrow": break;
//右弧形箭头 弧形向右 箭头向左下
case "curvedLeftArrow": break;
//左弧形箭头 弧形向左 箭头向右下
case "curvedRightArrow": break;
//下弧形箭头 弧形向下 箭头右上
case "curvedUpArrow": break;
//上下箭头
case "upDownArrow": break;
//上箭头
case "upArrow": break;
//手杖形箭头 向右调头
case "uturnArrow": break;
//左右圆箭头
case "leftRightCircularArrow": break;
//三角形
case "triangle": break;
default: break;
}
}
public static string GetFontColor(XmlDocument nodeXml, XmlNode typeNode, XmlDocument slideMasterTextStyles, Dictionary colors)
{
var color = nodeXml.SelectSingleNode("//a:rPr/a:solidFill/a:srgbClr/@val", xmlnsManager);
if (color == null && typeNode != null)
{
if (typeNode.Value.Equals("title") || typeNode.Value.Equals("subTitle") || typeNode.Value.Equals("ctrTitle"))
{
color = slideMasterTextStyles.SelectSingleNode("//p:titleStyle/a:lvl1pPr/a:defRPr/a:solidFill/a:schemeClr/@val", xmlnsManager);
}
if (typeNode.Value.Equals("body"))
{
color = slideMasterTextStyles.SelectSingleNode("//p:bodyStyle/a:lvl1pPr/a:defRPr/a:solidFill/a:schemeClr/@val", xmlnsManager);
}
//if (typeNode.Value.Equals("dt") || typeNode.Value.Equals("sldNum"))
//{
// color = 12;
//}
}
if (color == null && typeNode == null)
{
color = slideMasterTextStyles.SelectSingleNode("//p:otherStyle/a:lvl1pPr/a:defRPr/a:solidFill/a:schemeClr/@val", xmlnsManager);
}
if (color != null)
{
if (colors.TryGetValue(color.Value, out string colr))
{
return colr;
}
else { return "000000"; }
}
else { return "000000"; }
}
public static int GetFontSize(XmlDocument nodeXml, XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode, XmlNode typeNode, XmlDocument slideMasterTextStyles)
{
int fontSize = 0;
XmlNode szNode = nodeXml.SelectSingleNode("//a:rPr/@sz", xmlnsManager);
if (szNode == null)
{
if (slideLayoutSpNode != null)
{
szNode = slideLayoutSpNode.SelectSingleNode("//p:txBody/a:lstStyle/a:lvl1pPr/a:defRPr/@sz", xmlnsManager);
}
}
if (szNode == null && typeNode != null)
{
if (typeNode.Value.Equals("title") || typeNode.Value.Equals("subTitle") || typeNode.Value.Equals("ctrTitle"))
{
szNode = slideMasterTextStyles.SelectSingleNode("//p:titleStyle/a:lvl1pPr/a:defRPr/@sz", xmlnsManager);
}
if (typeNode.Value.Equals("body"))
{
szNode = slideMasterTextStyles.SelectSingleNode("//p:bodyStyle/a:lvl1pPr/a:defRPr/@sz", xmlnsManager);
}
//if (typeNode.Value.Equals("dt") || typeNode.Value.Equals("sldNum"))
//{
// fontSize = 12;
//}
}
if (szNode == null && typeNode == null)
{
szNode = slideMasterTextStyles.SelectSingleNode("//p:otherStyle/a:lvl1pPr/a:defRPr/@sz", xmlnsManager);
}
if (szNode != null)
{
fontSize = int.Parse(szNode.Value) / 100;
}
XmlNode baseline = nodeXml.SelectSingleNode("//a:rPr/@baseline", xmlnsManager);
if (baseline != null)
{
fontSize -= 10;
}
return fontSize;
//font-size
}
public static string GetFontType(XmlDocument nodeXml, XmlNode typeNode, XmlDocument slideMasterTextStyles, Theme theme)
{
XmlNode typeface = nodeXml.SelectSingleNode("//a:rPr/a:latin/@typeface",xmlnsManager);
if (typeface == null)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(theme.OuterXml);
typeface = doc.SelectSingleNode("//a:theme/a:themeElements/a:fontScheme/a:majorFont/a:latin/@typeface", xmlnsManager);
}
if (typeface != null)
{
return typeface.Value;
}
else
{
return "";
}
//font-family
}
public static string GetFontBold(XmlDocument nodeXml, XmlNode typeNode, XmlDocument slideMasterTextStyles)
{
var FontBold = nodeXml.SelectSingleNode("a:rPr/@b",xmlnsManager);
if (FontBold != null)
{
if (FontBold.Value.Equals("1"))
{
return "bold";
}
else
{
return "initial";
}
}
else
{
return "initial";
}
//font-weight
}
public static string GetFontItalic(XmlDocument nodeXml, XmlNode typeNode, XmlDocument slideMasterTextStyles)
{
var FontBold = nodeXml.SelectSingleNode("a:rPr/@i",xmlnsManager);
if (FontBold != null)
{
if (FontBold.Value.Equals("1"))
{
return "italic";
}
else
{
return "normal";
}
}
else
{
return "normal";
}
//font-style
}
public static string GetFontDecoration(XmlDocument nodeXml, XmlNode typeNode, XmlDocument slideMasterTextStyles)
{
var FontBold = nodeXml.SelectSingleNode("a:rPr/@u",xmlnsManager);
if (FontBold != null)
{
if (FontBold.Value.Equals("sng"))
{
return "underline";
}
else
{
return "initial";
}
}
else
{
return "initial";
}
//text-decoration
}
public static string GetTextVerticalAlign(XmlDocument nodeXml, XmlNode typeNode, XmlDocument slideMasterTextStyles)
{
var baseline = nodeXml.SelectSingleNode("a:rPr/@baseline",xmlnsManager);
if (baseline != null)
{
return int.Parse(baseline.Value) / 1000 + "%";
}
else
{
return "baseline";
}
//vertical-align
}
///
/// 解析形状的填充色
///
///
///
///
public static Model.PowerPoint.Fill GetShapeFill(string nodeXml, Dictionary colors)
{
// 1. presentationML
// p:spPr [a:noFill, solidFill, gradFill, blipFill, pattFill, grpFill]
// From slide
XmlDocument doc = new XmlDocument();
doc.LoadXml(nodeXml);
XmlNode nofillNode = doc.SelectSingleNode("//p:spPr/a:noFill", xmlnsManager);
if (nofillNode != null)
{
return new Model.PowerPoint.Fill() { Type = 0, };
}
Model.PowerPoint.Fill fill = new Model.PowerPoint.Fill();
string fillColor = null;
XmlNode fillNode = doc.SelectSingleNode("//p:spPr/a:solidFill/a:srgbClr/@val", xmlnsManager);
if (fillNode == null)
{
fillNode = doc.SelectSingleNode("//p:spPr/a:solidFill/a:schemeClr/@val", xmlnsManager);
}
if (fillNode == null)
{
fillNode = doc.SelectSingleNode("//p:style/a:fillRef/a:schemeClr/@val", xmlnsManager);
}
if (fillNode != null)
{
if (colors.TryGetValue(fillNode.Value, out string color))
{
fillColor = color;
}
else
{
fillColor = fillNode.Value;
}
var node = doc.SelectSingleNode("//p:spPr/a:solidFill/a:schemeClr | //p:style/a:fillRef/a:schemeClr", xmlnsManager);
if (node != null && node.HasChildNodes)
{
//调和颜色
fillColor = ColorToning(node.OuterXml, fillColor);
}
//调和颜色
}
return new Model.PowerPoint.Fill { Type =1, Color = fillColor };
}
///
/// 获取边框样式
///
///
///
public static Border GetBorder(string nodeXml, bool isCxnSp, Dictionary colorMaps)
{
//边框宽度
int borderWidth =0;
if (isCxnSp) {
borderWidth = 1;
}
XmlDocument doc = new XmlDocument();
doc.LoadXml(nodeXml);
XmlNode borderw = doc.SelectSingleNode("//p:spPr/a:ln/@w", xmlnsManager);
if (borderw != null)
{
borderWidth = int.Parse(borderw.Value) / 12700;
}
//边框颜色
string borderColor = null;
XmlNode borderc = doc.SelectSingleNode("//p:spPr/a:ln/a:solidFill/a:srgbClr/@val", xmlnsManager);
if (borderc == null)
{
borderc = doc.SelectSingleNode("//p:spPr/a:ln/a:solidFill/a:schemeClr/@val", xmlnsManager);
}
if (borderc == null)
{
borderc = doc.SelectSingleNode("//p:style/a:lnRef/a:schemeClr/@val", xmlnsManager);
}
if (borderc != null)
{
if (colorMaps.TryGetValue(borderc.Value, out string color))
{
borderColor = color;
}
else
{
borderColor = borderc.Value;
}
var node = doc.SelectSingleNode("//p:style/a:lnRef/a:schemeClr | //p:spPr/a:ln/a:solidFill/a:schemeClr", xmlnsManager);
if (node != null && node.HasChildNodes)
{
//调和颜色
borderColor = ColorToning(node.OuterXml, borderColor);
}
}
//边框类型
XmlNode borderT = doc.SelectSingleNode("//p:spPr/a:ln/a:prstDash/@val", xmlnsManager);
var strokeDasharray = "0";
var borderType = "";
if (borderT != null)
{
switch (borderT.Value)
{
case "solid":
borderType += "solid";
strokeDasharray = "0";
break;
case "dash":
borderType += "dashed";
strokeDasharray = "20";
break;
case "dashDot":
borderType += "dashed";
strokeDasharray = "5, 5, 1, 5";
break;
case "dot":
borderType += "dotted";
strokeDasharray = "1, 5";
break;
case "lgDash":
borderType += "dashed";
strokeDasharray = "10, 5";
break;
case "lgDashDotDot":
borderType += "dashed";
strokeDasharray = "10, 5, 1, 5, 1, 5";
break;
case "sysDash":
borderType += "dashed";
strokeDasharray = "5, 2";
break;
case "sysDashDot":
borderType += "dashed";
strokeDasharray = "5, 2, 1, 5";
break;
case "sysDashDotDot":
borderType += "dashed";
strokeDasharray = "5, 2, 1, 5, 1, 5";
break;
case "sysDot":
borderType += "dotted";
strokeDasharray = "2, 5";
break;
case null:
//console.log(borderType);
default:
break;
//console.warn(borderType);
//cssText += "#000 solid";
}
}
if (isCxnSp)
{
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 };
}
}
}
///
/// 调色补充 Shade Tint LumMod LumOff 等
///
///
///
///
public static string ColorToning(string nodeXml, string colorHex)
{
TEAMModelOS.SDK.Helper.Common.ColorHelper.ColorConverter converter = new TEAMModelOS.SDK.Helper.Common.ColorHelper.ColorConverter();
XmlDocument doc = new XmlDocument();
doc.LoadXml(nodeXml);
XmlNode lumMod = doc.SelectSingleNode("//a:lumMod/@val", xmlnsManager);
if (lumMod != null)
{
colorHex = converter.SetLuminanceMod(colorHex, double.Parse(lumMod.Value));
}
XmlNode lumOff = doc.SelectSingleNode("//a:lumOff/@val", xmlnsManager);
if (lumOff != null)
{
colorHex = converter.SetLuminanceOff(colorHex, double.Parse(lumOff.Value));
}
XmlNode satMod = doc.SelectSingleNode("//a:satMod/@val", xmlnsManager);
if (satMod != null)
{
colorHex = converter.SetSaturationMod(colorHex, double.Parse(satMod.Value));
}
XmlNode satOff = doc.SelectSingleNode("//a:satOff/@val", xmlnsManager);
if (satOff != null)
{
colorHex = converter.SetSaturationOff(colorHex, double.Parse(satOff.Value));
}
XmlNode hueOff = doc.SelectSingleNode("//a:hueOff/@val", xmlnsManager);
if (hueOff != null)
{
colorHex = converter.SetHueOff(colorHex, double.Parse(hueOff.Value));
}
XmlNode hueMod = doc.SelectSingleNode("//a:hueMod/@val", xmlnsManager);
if (hueMod != null)
{
colorHex = converter.SetHueMod(colorHex, double.Parse(hueMod.Value));
}
XmlNode alphaOff = doc.SelectSingleNode("//a:alphaOff/@val", xmlnsManager);
if (alphaOff != null)
{
// Color color= ColorTranslator.FromHtml("#" + colorHex);
// color = Color.FromArgb(byte.Parse(int.Parse(alpha.Value)/100000+""),color.R,color.G,color.B);
}
XmlNode shade = doc.SelectSingleNode("//a:shade/@val", xmlnsManager);
if (shade != null)
{
colorHex = converter.SetShade(colorHex, double.Parse(shade.Value));
}
XmlNode tint = doc.SelectSingleNode("//a:tint/@val", xmlnsManager);
if (tint != null)
{
colorHex = converter.SetTint(colorHex, double.Parse(tint.Value));
}
XmlNode alpha = doc.SelectSingleNode("//a:alpha/@val", xmlnsManager);
if (alpha != null)
{
// Color color= ColorTranslator.FromHtml("#" + colorHex);
// color = Color.FromArgb(byte.Parse(int.Parse(alpha.Value)/100000+""),color.R,color.G,color.B);
}
return colorHex;
}
public static Dictionary GetLayoutOrMasterColors(SlidePart slidePart, Dictionary slideMasterColors, Theme theme)
{
OverrideColorMapping colorMap = slidePart.SlideLayoutPart.SlideLayout.ColorMapOverride.OverrideColorMapping;
Dictionary Colors = new Dictionary();
if (colorMap != null)
{
Colors = DoColorMap(colorMap, null, theme);
}
else
{
Colors = slideMasterColors;
}
return Colors;
}
///
/// 根据 node layout master获取位置
///
///
///
///
///
public static HiTeachCC.Model.PowerPoint.Position GetPosition(string nodeXml, XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(nodeXml);
XmlNode xfrm = doc.SelectSingleNode("//a:xfrm", xmlnsManager);
if (xfrm == null)
{
xfrm = slideLayoutSpNode.SelectSingleNode("//a:xfrm", xmlnsManager);
if (xfrm == null)
{
xfrm = slideMasterSpNode.SelectSingleNode("//a:xfrm",xmlnsManager);
}
}
if (xfrm != null)
{
Transform2D transform2D = new Transform2D(xfrm.OuterXml);
return GetPositionByTransform2D(transform2D);
}
return new Model.PowerPoint.Position();
}
public static BuChar GenBuChar(XmlDocument nodeXml, Style slideLayoutTables,
Style slideMasterTables, XmlDocument SlideMasterTextStyles, XmlNode typeNode, bool hasBuChar)
{
// todo
//需要完善slideMaster1.xml 中含有a:buChar 的情况
//XmlDocument doc = new XmlDocument();
//doc.LoadXml(nodeXml);
BuChar bchar = new BuChar();
// XmlNode pPr = nodeXml.SelectSingleNode("//a:pPr",xmlnsManager);
int lvl = 0;
XmlNode lvlNode = nodeXml.SelectSingleNode("//a:pPr/@lvl",xmlnsManager);
if (lvlNode != null)
{
lvl = int.Parse(lvlNode.Value);
}
var buCharNode = nodeXml.SelectSingleNode("//a:pPr/a:buChar/@char",xmlnsManager);
if (buCharNode != null)
{
XmlNode buFontNode = nodeXml.SelectSingleNode("//a:pPr/a:buFont",xmlnsManager);
if (buFontNode != null)
{
var marginLeft = 328600 * 96 / 914400 * lvl;
var marginRight = 0;
var typeface = "";
XmlNode marLNode = nodeXml.SelectSingleNode("//a:pPr/@marL",xmlnsManager);
if (marLNode != null)
{
marginLeft = int.Parse(marLNode.Value) * 96 / 914400;
}
XmlNode pitchFamilyNode = nodeXml.SelectSingleNode("//a:pPr/a:buFont/@pitchFamily",xmlnsManager);
if (pitchFamilyNode != null)
{
marginRight = int.Parse(pitchFamilyNode.Value);
}
XmlNode typefaceNode = nodeXml.SelectSingleNode("//a:pPr/a:buFont/@typeface",xmlnsManager);
if (typefaceNode != null)
{
typeface = typefaceNode.Value;
}
bchar = new BuChar { MarginLeft = marginLeft, MarginRiht = marginRight, Typeface = typeface, Buchar = buCharNode.Value };
}
else
{
int marginLeft = 328600 * 96 / 914400 * lvl;
int marginRight = 0;
bchar = new BuChar { MarginLeft = marginLeft, MarginRiht = marginRight, Typeface = "", Buchar = buCharNode.Value };
}
}
else
{
int marginLeft = 328600 * 96 / 914400 * lvl;
int marginRight = 0;
bchar = new BuChar { MarginLeft = marginLeft, MarginRiht = marginRight, Typeface = "", Buchar = "" };
}
if (string.IsNullOrEmpty(bchar.Buchar) && typeNode != null && typeNode.Value.Equals("body"))
{
string bucharPath = "//p:bodyStyle/a:lvl" + (lvl + 1) + "pPr/a:buChar/@char";
XmlNode buchar = SlideMasterTextStyles.SelectSingleNode(bucharPath,xmlnsManager);
if (buchar != null)
{
bchar.Buchar = buchar.Value;
}
}
if (string.IsNullOrEmpty(bchar.Typeface) && typeNode != null && typeNode.Value.Equals("body"))
{
string facePath = "//p:bodyStyle/a:lvl" + (lvl + 1) + "pPr/a:buFont/@typeface";
XmlNode face = SlideMasterTextStyles.SelectSingleNode(facePath,xmlnsManager);
if (face != null)
{
bchar.Typeface = face.Value;
}
}
if (bchar.FontSize == 0 && typeNode != null && (typeNode.Value.Equals("body") || typeNode.Value.Equals("sldNum")))
{
string sizePath = "//p:bodyStyle/a:lvl" + (lvl + 1) + "pPr/a:defRPr/@sz";
XmlNode size = SlideMasterTextStyles.SelectSingleNode(sizePath,xmlnsManager);
if (sizePath != null)
{
bchar.FontSize = int.Parse(size.Value) / 100;
}
}
if (hasBuChar)
{
string sizePath = "//p:bodyStyle/a:lvl" + (lvl + 1) + "pPr/a:defRPr/@sz";
XmlNode size = SlideMasterTextStyles.SelectSingleNode(sizePath,xmlnsManager);
if (sizePath != null)
{
bchar.FontSize = int.Parse(size.Value) / 100;
}
string facePath = "//p:bodyStyle/a:lvl" + (lvl + 1) + "pPr/a:buFont/@typeface";
XmlNode face = SlideMasterTextStyles.SelectSingleNode(facePath,xmlnsManager);
if (face != null)
{
bchar.Typeface = face.Value;
}
string bucharPath = "//p:bodyStyle/a:lvl" + (lvl + 1) + "pPr/a:buChar/@char";
XmlNode buchar = SlideMasterTextStyles.SelectSingleNode(bucharPath,xmlnsManager);
if (buchar != null)
{
bchar.Buchar = buchar.Value;
}
}
if (string.IsNullOrEmpty(bchar.Buchar))
{
return null;
}
return bchar;
}
///
/// 获取垂直排版
///
///
///
///
///
///
///
public static string GetHorizontalAlign(XmlDocument nodeXml,
XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode,
XmlNode typeNode, XmlDocument slideMasterTextStyles)
{
//XmlDocument doc = new XmlDocument();
//doc.LoadXml(nodeXml);
XmlNode algn = nodeXml.SelectSingleNode("//a:pPr/@algn",xmlnsManager);
if (algn == null)
{
if (slideLayoutSpNode != null)
{
algn = slideLayoutSpNode.SelectSingleNode("//p:txBody/a:p/a:pPr/@algn", xmlnsManager);
}
if (algn == null && slideMasterSpNode != null)
{
algn = slideMasterSpNode.SelectSingleNode("//p:txBody/a:p/a:pPr/@algn",xmlnsManager);
}
if (algn == null && typeNode != null)
{
switch (typeNode.Value)
{
case "title":
case "subTitle":
case "ctrTitle":
//doc.LoadXml(slideMasterStyle.TypeTable.OuterXml);
algn = slideMasterTextStyles.SelectSingleNode("//p:titleStyle/a:lvl1pPr/@algn",xmlnsManager);
break;
case "body":
algn = slideMasterTextStyles.SelectSingleNode("//p:bodyStyle/a:lvl1pPr/@algn",xmlnsManager);
break;
default:
// doc.LoadXml(slideMasterStyle.TypeTable.OuterXml);
algn = slideMasterTextStyles.SelectSingleNode("//p:otherStyle/a:lvl1pPr/@algn",xmlnsManager);
break;
}
}
}
if (algn == null)
{
if (typeNode == null)
{
return "h-left";
}
if (typeNode.Value.Equals("title") || typeNode.Value.Equals("subTitle") || typeNode.Value.Equals("ctrTitle"))
{
return "h-mid";
}
else if (typeNode.Value == "sldNum")
{
return "h-right";
}
else if (typeNode.Value.Equals("body")) { return "h-left"; }
}
return algn.Value.Equals("ctr") ? "h-mid" : algn.Value.Equals("r") ? "h-right" : "h-left";
}
///
/// 获取水平排版
/// 上中下对齐 X, ,
///
///
///
///
///
public static string GetVerticalAlign(string xmlNode,
XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode,
XmlNode typeNode, XmlDocument slideMasterTextStyles)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlNode);
XmlNode anchor = doc.SelectSingleNode("//p:txBody/a:bodyPr/@anchor", xmlnsManager);
if (anchor == null)
{
if (slideLayoutSpNode != null)
{
anchor = slideLayoutSpNode.SelectSingleNode("//p:txBody/a:bodyPr/@anchor", xmlnsManager);
}
if (anchor == null && slideMasterSpNode != null)
{
anchor = slideMasterSpNode.SelectSingleNode("//p:txBody/a:bodyPr/@anchor",xmlnsManager);
}
}
if (anchor != null)
{
return anchor.Value.Equals("ctr") ? "v-mid" : anchor.Value.Equals("b") ? "v-down" : "v-up";
}
else
{
return "v-up";
}
}
///
/// 获取位置信息
///
///
///
public static HiTeachCC.Model.PowerPoint.Position GetPositionByTransform2D(Transform2D transform2D)
{
HiTeachCC.Model.PowerPoint.Position spPosition = new HiTeachCC.Model.PowerPoint.Position();
spPosition.Rot = transform2D.Rotation == null ? 0 : transform2D.Rotation.Value;
spPosition.FlipH = transform2D.HorizontalFlip == null ? 0 : transform2D.HorizontalFlip.Value == true ? 1 : 0;
spPosition.FlipV = transform2D.VerticalFlip == null ? 0 : transform2D.VerticalFlip.Value == true ? 1 : 0;
spPosition.X = transform2D.Offset.X == null ? 0 : transform2D.Offset.X.Value;
spPosition.Y = transform2D.Offset.Y == null ? 0 : transform2D.Offset.Y.Value;
spPosition.Cx = transform2D.Extents.Cx == null ? 0 : transform2D.Extents.Cx.Value;
spPosition.Cy = transform2D.Extents.Cy == null ? 0 : transform2D.Extents.Cy.Value;
return spPosition;
}
public static XmlDocument GetSlideMasterTextStyles(string xml)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
XmlNode txStyles = doc.SelectSingleNode("//p:txStyles", xmlnsManager);
doc.LoadXml(txStyles.OuterXml);
return doc;
}
///
/// 根据slideLayout 或 slideMaster 获取 id idx type
///
///
///
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::*", xmlnsManager);
XmlDocument idTable = new XmlDocument();
//添加根节点
XmlElement idElement = idTable.CreateElement("xmlDatas");
idTable.AppendChild(idElement);
XmlDocument idxTable = new XmlDocument();
//添加根节点
XmlElement idxElement = idxTable.CreateElement("xmlDatas");
idxTable.AppendChild(idxElement);
XmlDocument typeTable = new XmlDocument();
//添加根节点
XmlElement typeElement = typeTable.CreateElement("xmlDatas");
typeTable.AppendChild(typeElement);
if (spTreeNodes != null)
{
int size = spTreeNodes.Count;
for (int i = 0; i < size; i++)
{
XmlNode spnode = spTreeNodes.Item(i);
if (spnode.Name.Equals("p:nvGrpSpPr") || spnode.Name.Equals("p:grpSpPr"))
{
continue;
}
if (spnode.LocalName.Equals("nvGrpSpPr") || spnode.LocalName.Equals("grpSpPr"))
{
continue;
}
XmlDocument docNode = new XmlDocument();
docNode.LoadXml(spnode.OuterXml);
XmlNode id = spnode.SelectSingleNode("./p:nvSpPr/p:cNvPr/@id", xmlnsManager);
XmlNode idx = spnode.SelectSingleNode("./p:nvSpPr/p:nvPr/p:ph/@idx", xmlnsManager);
XmlNode type = spnode.SelectSingleNode("./p:nvSpPr/p:nvPr/p:ph/@type", xmlnsManager);
var cnode = spnode.ChildNodes;
StringBuilder builder = new StringBuilder();
for (int m = 0; m < cnode.Count; m++)
{
var cn = cnode.Item(m);
builder.Append(cn.OuterXml);
}
if (id != null)
{
XmlDocument docx = new XmlDocument();
string str = "" + builder.ToString() + "";
docx.LoadXml(str);
//XmlDocument idXmlNode = new XmlDocument();
//idXmlNode.LoadXml(idElement.OuterXml);
XmlNode importNode = idElement.OwnerDocument.ImportNode(docx.DocumentElement, true);
idElement.AppendChild(importNode);
}
if (idx != null)
{
XmlDocument docx = new XmlDocument();
string str = "" + builder.ToString() + "";
docx.LoadXml(str);
//XmlDocument idxXmlNode = new XmlDocument();
//idxXmlNode.LoadXml(idElement.OuterXml);
XmlNode importNode = idxElement.OwnerDocument.ImportNode(docx.DocumentElement, true);
idxElement.AppendChild(importNode);
}
if (type != null)
{
XmlDocument docx = new XmlDocument();
string str = "" + builder.ToString() + "";
docx.LoadXml(str);
//XmlDocument typeXmlNode = new XmlDocument();
//typeXmlNode.LoadXml(idElement.OuterXml);
XmlNode importNode = typeElement.OwnerDocument.ImportNode(docx.DocumentElement, true);
typeElement.AppendChild(importNode);
}
}
}
return new HiTeachCC.Model.PowerPoint.Style { IdTable = idTable, IdxTable = idxTable, TypeTable = typeTable };
}
public static Model.PowerPoint.Fill GetSlideBackgroundFill(SlidePart slidePart, SlideMaster slideMaster, Dictionary colors, Theme theme)
{
Model.PowerPoint.Fill fill = null ;
XmlDocument doc = new XmlDocument();
string SlideXml = slidePart.Slide.OuterXml;
doc.LoadXml(SlideXml);
/*
* blipFill (图片填充)BlipFill
effectDag (效果容器)EffectDag
effectLst (效果容器)EffectList
extLst (扩展名列表)ExtensionList
gradFill (渐变填充)GradientFill
grpFill (组填充)
noFill (无填充)NoFill
pattFill (图案填充)PatternFill
compositeElementFill (纯色填充)SolidFill
phClr 颜色占位
块引用 该方案颜色值设置为占位符颜色(该值phClr)。
此值显示在填充,线条,效果和背景样式中,并指示这些设置应用于适用于给定样式的主题颜色。
这允许相同的填充,线条和效果样式填充OfficeArt图库中显示的主题颜色。
http://msdn.microsoft.com/en-us/library/cc964302(v=office.12).aspx
*/
//使用xPath选择需要的节点
XmlNode node_sld = doc.SelectSingleNode("//p:sld/p:cSld/p:bg/p:bgPr/a:solidFill", xmlnsManager);
if (node_sld != null)
{
SolidFill compositeElement = new SolidFill(node_sld.OuterXml);
string colorHex = GetBgFill(colors,
compositeElement.RgbColorModelPercentage,
compositeElement.RgbColorModelHex,
compositeElement.HslColor,
compositeElement.SystemColor,
compositeElement.SchemeColor,
compositeElement.PresetColor);
new Model.PowerPoint.Fill { Type=1,Color=colorHex};
return fill;
}
node_sld = doc.SelectSingleNode("//p:sld/p:cSld/p:bg/p:bgPr/a:blipFill", xmlnsManager);
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;
Dictionary styleColors = new Dictionary();
if (colorMap != null)
{
styleColors = DoColorMap(colorMap, null, theme);
}
else
{
styleColors = colors;
}
doc.LoadXml(SlideLayoutXml);
XmlNode node_sldLayout = doc.SelectSingleNode("//p:sldLayout/p:cSld/p:bg/p:bgPr/a:solidFill", xmlnsManager);
if (node_sldLayout != null)
{
SolidFill compositeElement = new SolidFill(node_sldLayout.OuterXml);
string colorHex = GetBgFill(styleColors,
compositeElement.RgbColorModelPercentage,
compositeElement.RgbColorModelHex,
compositeElement.HslColor,
compositeElement.SystemColor,
compositeElement.SchemeColor,
compositeElement.PresetColor);
new Model.PowerPoint.Fill { Type = 1, Color = colorHex };
return fill;
}
node_sldLayout = doc.SelectSingleNode("//p:sldLayout/p:cSld/p:bg/p:bgRef", xmlnsManager);
if (node_sldLayout != null)
{
BackgroundStyleReference compositeElement = new BackgroundStyleReference(node_sldLayout.OuterXml);
string colorHex = GetBgFill(styleColors, compositeElement.RgbColorModelPercentage,
compositeElement.RgbColorModelHex,
compositeElement.HslColor,
compositeElement.SystemColor,
compositeElement.SchemeColor,
compositeElement.PresetColor);
new Model.PowerPoint.Fill { Type = 1, Color = colorHex };
return fill;
}
string slideMasterXml = slideMaster.OuterXml;
doc.LoadXml(slideMasterXml);
XmlNode node_sldMaster = doc.SelectSingleNode("//p:sldMaster/p:cSld/p:bg/p:bgPr/a:solidFill", xmlnsManager);
if (node_sldMaster != null)
{
SolidFill compositeElement = new SolidFill(node_sldMaster.OuterXml);
string colorHex = GetBgFill(colors, compositeElement.RgbColorModelPercentage,
compositeElement.RgbColorModelHex,
compositeElement.HslColor,
compositeElement.SystemColor,
compositeElement.SchemeColor,
compositeElement.PresetColor);
new Model.PowerPoint.Fill { Type = 1, Color = colorHex };
return fill;
}
node_sldMaster = doc.SelectSingleNode("//p:sldMaster/p:cSld/p:bg/p:bgRef", xmlnsManager);
if (node_sldMaster != null)
{
BackgroundStyleReference compositeElement = new BackgroundStyleReference(node_sldMaster.OuterXml);
string colorHex = GetBgFill(colors, compositeElement.RgbColorModelPercentage,
compositeElement.RgbColorModelHex,
compositeElement.HslColor,
compositeElement.SystemColor,
compositeElement.SchemeColor,
compositeElement.PresetColor);
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", xmlnsManager);
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", xmlnsManager);
FillStyle fillStyle = new FillStyle();
if (fillRect_node != null)
{
XmlNode left = doc.SelectSingleNode("//a:stretch/a:fillRect/@l", xmlnsManager);
XmlNode top = doc.SelectSingleNode("//a:stretch/a:fillRect/@t", xmlnsManager);
XmlNode right = doc.SelectSingleNode("//a:stretch/a:fillRect/@r", xmlnsManager);
XmlNode bottom = doc.SelectSingleNode("//a:stretch/a:fillRect/@b", xmlnsManager);
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 fillStyle;
}
public static Dictionary DoColorMap(OverrideColorMapping overrideColorMapping, ColorMap colorMap, Theme theme)
{
string[] colors = { "accent1", "accent2", "accent3", "accent4", "accent5", "accent6",
"lt1", "lt2", "tx1", "tx2", "dk1","dk2","hlink","folHlink","bg1","bg2" };
DocumentFormat.OpenXml.Drawing.ColorScheme colorScheme = theme.ThemeElements.ColorScheme;
Dictionary pairs = new Dictionary();
Dictionary colorDict = new Dictionary();
if (overrideColorMapping != null)
{
colorDict.Add("Text1", overrideColorMapping.Text1);
colorDict.Add("Text2", overrideColorMapping.Text2);
colorDict.Add("Background1", overrideColorMapping.Background1);
colorDict.Add("Background2", overrideColorMapping.Background2);
}
else
{
if (colorMap != null)
{
colorDict.Add("Text1", colorMap.Text1);
colorDict.Add("Text2", colorMap.Text2);
colorDict.Add("Background1", colorMap.Background1);
colorDict.Add("Background2", colorMap.Background2);
}
}
foreach (var col in colors)
{
pairs.Add(col, PowerPointHelper.ColorForThemeClr(col, colorScheme, colorDict));
}
return pairs;
}
private static string GetBgFill(Dictionary colors,
RgbColorModelPercentage RgbColorModelPercentage,
RgbColorModelHex RgbColorModelHex,
DocumentFormat.OpenXml.Drawing.HslColor HslColor,
SystemColor SystemColor,
SchemeColor SchemeColor,
PresetColor PresetColor)
{
var colorHex = "#FFF";
if (RgbColorModelPercentage != null)
{
int r = RgbColorModelPercentage.RedPortion.Value;
int g = RgbColorModelPercentage.GreenPortion.Value;
int b = RgbColorModelPercentage.BluePortion.Value;
colorHex = "#" + ColorTranslator.ToHtml(Color.FromArgb(r, g, b));
}
if (RgbColorModelHex != null)
{
colorHex = "#" + RgbColorModelHex.Val;
}
if (HslColor != null)
{
ColorHSL colorHSL = new ColorHSL { H = HslColor.HueValue.Value, S = HslColor.SatValue.Value, L = HslColor.LumValue.Value };
ColorRGB rbg = ColorHelper.HslToRgb(colorHSL);
colorHex = "#" + ColorTranslator.ToHtml(Color.FromArgb(rbg.R, rbg.G, rbg.B));
}
if (SystemColor != null)
{
ColorTranslator.ToHtml(Color.Red);
if (colors.TryGetValue(SystemColor.Val, out string clr))
{
colorHex = "#" + clr;
}
}
if (SchemeColor != null)
{
if (colors.TryGetValue(SchemeColor.Val, out string clr))
{
colorHex = "#" + clr;
if (SchemeColor.ChildElements != null && SchemeColor.ChildElements.Count > 0)
{
colorHex = "#" + ColorToning(SchemeColor.OuterXml, colorHex.Replace("#", ""));
}
}
}
if (PresetColor != null)
{
colorHex = PresetColor.Val.ToString().Replace("2010", "");
System.Drawing.Color color = System.Drawing.Color.FromName(colorHex);
colorHex = ColorTranslator.ToHtml(color);
}
return colorHex;
}
///
/// 在主题Theme中获取颜色
///
///
///
///
public static string ColorForThemeClr(string scv, DocumentFormat.OpenXml.Drawing.ColorScheme colorScheme, Dictionary colorMap)
{
string colorStr = "";
if (scv.Equals("tx1"))
{
if (colorMap.TryGetValue("Text1", out string Text1))
colorStr = ColorForThemeClr(Text1, colorScheme, colorMap);
return colorStr;
}
else if (scv.Equals("bg1"))
{
if (colorMap.TryGetValue("Background1", out string Background1))
colorStr = ColorForThemeClr(Background1, colorScheme, colorMap);
return colorStr;
}
else if (scv.Equals("bg2"))
{
if (colorMap.TryGetValue("Background2", out string Background2))
colorStr = ColorForThemeClr(Background2, colorScheme, colorMap);
return colorStr;
}
else if (scv.Equals("tx2"))
{
if (colorMap.TryGetValue("Text2", out string Text2))
colorStr = ColorForThemeClr(Text2, colorScheme, colorMap);
return colorStr;
}
else if (scv.Equals("dk1"))
{
DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Dark1Color.ChildElements.First();
if (sysColor != null)
{
return sysColor.LastColor;
}
DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Dark1Color.ChildElements.First();
if (rgbColor != null)
{
return rgbColor.Val;
}
return colorStr;
}
else if (scv.Equals("dk2"))
{
DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Dark2Color.ChildElements.First();
if (sysColor != null)
{
return sysColor.LastColor;
}
DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Dark2Color.ChildElements.First();
if (rgbColor != null)
{
return rgbColor.Val;
}
return colorStr;
}
else if (scv.Equals("accent1"))
{
DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Accent1Color.ChildElements.First();
if (sysColor != null)
{
return sysColor.LastColor;
}
DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Accent1Color.ChildElements.First();
if (rgbColor != null)
{
return rgbColor.Val;
}
return colorStr;
}
else if (scv.Equals("accent2"))
{
DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Accent2Color.ChildElements.First();
if (sysColor != null)
{
return sysColor.LastColor;
}
DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Accent2Color.ChildElements.First();
if (rgbColor != null)
{
return rgbColor.Val;
}
return colorStr;
}
else if (scv.Equals("accent3"))
{
DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Accent3Color.ChildElements.First();
if (sysColor != null)
{
return sysColor.LastColor;
}
DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Accent3Color.ChildElements.First();
if (rgbColor != null)
{
return rgbColor.Val;
}
return colorStr;
}
else if (scv.Equals("accent4"))
{
DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Accent4Color.ChildElements.First();
if (sysColor != null)
{
return sysColor.LastColor;
}
DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Accent4Color.ChildElements.First();
if (rgbColor != null)
{
return rgbColor.Val;
}
return colorStr;
}
else if (scv.Equals("accent5"))
{
DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Accent5Color.ChildElements.First();
if (sysColor != null)
{
return sysColor.LastColor;
}
DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Accent5Color.ChildElements.First();
if (rgbColor != null)
{
return rgbColor.Val;
}
return colorStr;
}
else if (scv.Equals("accent6"))
{
DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Accent6Color.ChildElements.First();
if (sysColor != null)
{
return sysColor.LastColor;
}
DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Accent6Color.ChildElements.First();
if (rgbColor != null)
{
return rgbColor.Val;
}
return colorStr;
}
else if (scv.Equals("lt1"))
{
DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Light1Color.ChildElements.First();
if (sysColor != null)
{
return sysColor.LastColor;
}
DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Light1Color.ChildElements.First();
if (rgbColor != null)
{
return rgbColor.Val;
}
return colorStr;
}
else if (scv.Equals("lt2"))
{
DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Light2Color.ChildElements.First();
if (sysColor != null)
{
return sysColor.LastColor;
}
DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Light2Color.ChildElements.First();
if (rgbColor != null)
{
return rgbColor.Val;
}
return colorStr;
}
else if (scv.Equals("hlink"))
{
DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Hyperlink.ChildElements.First();
if (sysColor != null)
{
return sysColor.LastColor;
}
DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Hyperlink.ChildElements.First();
if (rgbColor != null)
{
return rgbColor.Val;
}
return colorStr;
}
else if (scv.Equals("folHlink"))
{
DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.FollowedHyperlinkColor.ChildElements.First();
if (sysColor != null)
{
return sysColor.LastColor;
}
DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.FollowedHyperlinkColor.ChildElements.First();
if (rgbColor != null)
{
return rgbColor.Val;
}
return colorStr;
}
return colorStr;
}
}
}