PowerPointHelper.cs 78 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805
  1. using DocumentFormat.OpenXml;
  2. using DocumentFormat.OpenXml.Drawing;
  3. using DocumentFormat.OpenXml.Packaging;
  4. using DocumentFormat.OpenXml.Presentation;
  5. using HiTeachCC.Model.PowerPoint;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Drawing;
  9. using System.IO;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. using System.Xml;
  14. using System.Xml.Linq;
  15. using System.Xml.XPath;
  16. using TEAMModelOS.SDK.Context.Constant;
  17. using TEAMModelOS.SDK.Context.Exception;
  18. using TEAMModelOS.SDK.Helper.Common.ColorHelper;
  19. using TEAMModelOS.SDK.Helper.Common.StringHelper;
  20. using TEAMModelOS.SDK.Helper.Security.ShaHash;
  21. using TEAMModelOS.SDK.Module.AzureBlob.Container;
  22. using TEAMModelOS.SDK.Module.AzureBlob.Interfaces;
  23. using ColorMap = DocumentFormat.OpenXml.Presentation.ColorMap;
  24. using Theme = DocumentFormat.OpenXml.Drawing.Theme;
  25. namespace HiTeachCC.Service.PowerPoint.Implement
  26. {
  27. public static class PowerPointHelper
  28. {
  29. public static XmlNamespaceManager xmlnsManager ;
  30. public static XmlNode GetTextByPath(this XmlDocument document , string expression) {
  31. return document.SelectSingleNode(expression , xmlnsManager);
  32. }
  33. public static XmlNode GetTextByPath(this XmlNode node, string expression)
  34. {
  35. return node.SelectSingleNode(expression, xmlnsManager);
  36. }
  37. public static XmlNodeList GetTextByPathList(this XmlDocument document, string expression)
  38. {
  39. return document.SelectNodes(expression, xmlnsManager);
  40. }
  41. public static XmlNodeList GetTextByPathList(this XmlNode node, string expression)
  42. {
  43. return node.SelectNodes(expression, xmlnsManager);
  44. }
  45. static PowerPointHelper()
  46. {
  47. xmlnsManager = new XmlNamespaceManager(new NameTable());
  48. xmlnsManager.AddNamespace("p", "http://schemas.openxmlformats.org/presentationml/2006/main");
  49. xmlnsManager.AddNamespace("a", "http://schemas.openxmlformats.org/drawingml/2006/main");
  50. xmlnsManager.AddNamespace("xsl", "http://www.w3.org/1999/XSL/Transform");
  51. xmlnsManager.AddNamespace("fo", "http://www.w3.org/1999/XSL/Format");
  52. xmlnsManager.AddNamespace("app", "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties");
  53. xmlnsManager.AddNamespace("cp", "http://schemas.openxmlformats.org/package/2006/metadata/core-properties");
  54. xmlnsManager.AddNamespace("dc", "http://purl.org/dc/elements/1.1/");
  55. xmlnsManager.AddNamespace("dcterms", "http://purl.org/dc/terms/");
  56. xmlnsManager.AddNamespace("dcmitype", "http://purl.org/dc/dcmitype/");
  57. xmlnsManager.AddNamespace("rel", "http://schemas.openxmlformats.org/package/2006/relationships");
  58. xmlnsManager.AddNamespace("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships");
  59. xmlnsManager.AddNamespace("cus", "http://schemas.openxmlformats.org/officeDocument/2006/custom-properties");
  60. xmlnsManager.AddNamespace("vt", "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes");
  61. xmlnsManager.AddNamespace("pic", "http://schemas.openxmlformats.org/drawingml/2006/picture");
  62. xmlnsManager.AddNamespace("dsp", "http://schemas.microsoft.com/office/drawing/2008/diagram");
  63. xmlnsManager.AddNamespace("dgm", "http://schemas.openxmlformats.org/drawingml/2006/diagram");
  64. xmlnsManager.AddNamespace("a14", "http://schemas.microsoft.com/office/drawing/2010/main");
  65. xmlnsManager.AddNamespace("m", "http://schemas.openxmlformats.org/officeDocument/2006/math");
  66. xmlnsManager.AddNamespace("mc", "http://schemas.openxmlformats.org/markup-compatibility/2006");
  67. xmlnsManager.AddNamespace("p14", "http://schemas.microsoft.com/office/powerpoint/2010/main");
  68. xmlnsManager.AddNamespace("pkg", "http://schemas.microsoft.com/office/2006/xmlPackage");
  69. xmlnsManager.AddNamespace("p15", "http://schemas.microsoft.com/office/powerpoint/2012/main");
  70. xmlnsManager.AddNamespace("a16", "http://schemas.microsoft.com/office/drawing/2014/main");
  71. xmlnsManager.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
  72. xmlnsManager.AddNamespace("c", "http://schemas.openxmlformats.org/drawingml/2006/chart");
  73. xmlnsManager.AddNamespace("c14", "http://schemas.microsoft.com/office/drawing/2007/8/2/chart");
  74. xmlnsManager.AddNamespace("c16", "http://schemas.microsoft.com/office/drawing/2014/chart");
  75. xmlnsManager.AddNamespace("cs", "http://schemas.microsoft.com/office/drawing/2012/chartStyle");
  76. xmlnsManager.AddNamespace("thm15", "http://schemas.microsoft.com/office/thememl/2012/main");
  77. xmlnsManager.AddNamespace("fn", "http://www.w3.org/2005/xpath-functions");
  78. }
  79. public static async Task<AzureBlobModel>SaveBase64ToBolob(string data, string contentType ,string FolderName ,string fileName , IAzureBlobDBRepository azureBlobDBRepository ) {
  80. string fileExt ;
  81. if (ContentTypeDict.extdict.TryGetValue(contentType, out string ext))
  82. {
  83. fileExt = ext;
  84. }
  85. else
  86. {
  87. //解决多种扩展名不能获取的
  88. string[] sp = contentType.Split("/");
  89. fileExt = sp[sp.Length - 1];
  90. sp = fileExt.Split("+");
  91. fileExt = "." + sp[sp.Length - 1];
  92. }
  93. //data:image/jpeg;base64,
  94. try {
  95. if (string.IsNullOrEmpty(fileName))
  96. {
  97. Stream stream = new MemoryStream(Convert.FromBase64String(data));
  98. string shaCode = ShaHashHelper.GetSHA1(stream);
  99. fileName = shaCode + fileExt;
  100. }
  101. else {
  102. if (fileName.Split(".").Length == 1) {
  103. fileName += fileExt;
  104. }
  105. }
  106. Stream streamBlob = new MemoryStream(Convert.FromBase64String(data));
  107. AzureBlobModel model = await azureBlobDBRepository.UploadFileByFolder(streamBlob, FolderName + "/imgs", fileName, "pptx", false);
  108. return model;
  109. } catch (Exception x) {
  110. throw new BizException(x.Message); }
  111. }
  112. public static void GenPPTXShape(XmlNode shapeType)
  113. {
  114. string svgPath = "";
  115. switch (shapeType.Value)
  116. {
  117. //线形标注 1(带边框和强调线)
  118. case "accentBorderCallout1": break;
  119. //线形标注 2(带边框和强调线)
  120. case "accentBorderCallout2": break;
  121. //线形标注 3(带边框和强调线)
  122. case "accentBorderCallout3": break;
  123. //线形标注 1(带强调线)
  124. case "accentCallout1": break;
  125. //线形标注 2(带强调线)
  126. case "accentCallout2": break;
  127. //线形标注 3(带强调线)
  128. case "accentCallout3": break;
  129. //动作按钮后退或前一项
  130. case "actionButtonBackPrevious": break;
  131. //动作按钮开始
  132. case "actionButtonBeginning": break;
  133. //按钮自定义
  134. case "actionButtonBlank": break;
  135. //动作按钮文档
  136. case "actionButtonDocument": break;
  137. //动作按钮 结束
  138. case "actionButtonEnd": break;
  139. //动作按钮前进下一项
  140. case "actionButtonForwardNext": break;
  141. // 动作按钮帮助
  142. case "actionButtonHelp": break;
  143. // 动作按钮 第一张
  144. case "actionButtonHome": break;
  145. // 动作按钮 信息
  146. case "actionButtonInformation": break;
  147. //动作按钮 视频
  148. case "actionButtonMovie": break;
  149. //动作按钮返回
  150. case "actionButtonReturn": break;
  151. //动作按钮 音频
  152. case "actionButtonSound": break;
  153. //弧形 圆弧 弧线
  154. case "arc": break;
  155. //棱台 TODO
  156. case "bevel": break;
  157. // 空心弧 TODO
  158. case "blockArc": break;
  159. //线形标注 1
  160. case "borderCallout1": break;
  161. //线形标注 2
  162. case "borderCallout2": break;
  163. //线形标注 3
  164. case "borderCallout3": break;
  165. //大括号 对 {}
  166. case "bracePair": break;
  167. //括号 对()
  168. case "bracketPair": break;
  169. //callout1线形标注 1(无边框)
  170. case "callout1": break;
  171. //callout1线形标注 2(无边框)
  172. case "callout2": break;
  173. //callout1线形标注 3(无边框)
  174. case "callout3": break;
  175. // 圆柱型 TODO暂不解析
  176. case "can": break;
  177. // 符号 +
  178. case "chartPlus": break;
  179. //符号 *
  180. case "chartStar": break;
  181. //符号x
  182. case "chartX": break;
  183. //燕尾形 长:3:1 左边缺一个单位的三角形 右边多一个单位三角形
  184. case "chevron": break;
  185. //弦形
  186. case "chord": break;
  187. // 云形 宽高比例拉伸
  188. case "cloud": break;
  189. //云形标注
  190. case "cloudCallout": break;
  191. // L 形
  192. case "corner": break;
  193. //角形 标签 github 角形
  194. case "cornerTabs": break;
  195. //立方体 TODO
  196. case "cube": break;
  197. //十边形
  198. case "decagon": break;
  199. ////斜纹 斜梯形
  200. case "diagStripe": break;
  201. //菱形
  202. case "diamond": break;
  203. //十二边形
  204. case "dodecagon": break;
  205. //同心圆 TODO
  206. case "donut": break;
  207. //双波形
  208. case "doubleWave": break;
  209. //下箭头标注
  210. case "downArrowCallout": break;
  211. //前凸弯带形
  212. case "ellipseRibbon": break;
  213. //上凸弯带形 8
  214. case "ellipseRibbon2": break;
  215. //可选过程 圆角矩形
  216. case "flowChartAlternateProcess": break;
  217. //对照 长宽2:1 两个等腰三角形 上下尖对尖
  218. case "flowChartCollate": break;
  219. //接点 圆形
  220. case "flowChartConnector": break;
  221. //决策 菱形
  222. case "flowChartDecision": break;
  223. //延期正方形右侧多个半圆
  224. case "flowChartDelay": break;
  225. //显示 正方形 左侧1/4高度等腰三角形 1/4右侧弧形
  226. case "flowChartDisplay": break;
  227. //文档 矩形 下面部分波浪
  228. case "flowChartDocument": break;
  229. //摘录 正方形里面的等腰三角形 向上
  230. case "flowChartExtract": break;
  231. //数据 平行四边形
  232. case "flowChartInputOutput": break;
  233. //内部贮存 左上角横竖各一条线
  234. case "flowChartInternalStorage": break;
  235. //磁盘 圆柱体 向上 宽高 2:1 压扁
  236. case "flowChartMagneticDisk": break;
  237. //直接访问存储器 圆柱体 平躺 宽高 2:1 拉长
  238. case "flowChartMagneticDrum": break;
  239. //顺序访问存储器 圆形 小猪佩奇 下面多个矩形
  240. case "flowChartMagneticTape": break;
  241. //手动输入 矩形 上面部分向左倾斜一点 倾斜高度四分之一
  242. case "flowChartManualInput": break;
  243. //手动操作 倒等腰梯形
  244. case "flowChartManualOperation": break;
  245. //合并 正方形里面的等腰三角形 向下
  246. case "flowChartMerge": break;
  247. // 多文档 3个矩形 下面部分波浪 叠加
  248. case "flowChartMultidocument": break;
  249. //flowChartOfflineStorage 离线存储
  250. case "flowChartOfflineStorage": break;
  251. //离页连接符 正方形 左下角右下角各缺角一边高度为四分之一,一边长为一半的的三角形
  252. case "flowChartOffpageConnector": break;
  253. //存储数据 矩形 左侧多个半圆 右侧缺半圆
  254. case "flowChartOnlineStorage": break;
  255. //或者 圆形经过圆形 两条横竖交叉的直线
  256. case "flowChartOr": break;
  257. //预定义过程 矩形 左右部分各有一条竖线
  258. case "flowChartPredefinedProcess": break;
  259. //准备 六边形 上下被压缩变长2倍边
  260. case "flowChartPreparation": break;
  261. //流程图 矩形
  262. case "flowChartProcess": break;
  263. //卡片 矩形右上角剪角最小宽度的1/4的三角形
  264. case "flowChartPunchedCard": break;
  265. //资料带 波浪形
  266. case "flowChartPunchedTape": break;
  267. // 排序 两个等腰三角形 背对背 长宽2:1
  268. case "flowChartSort": break;
  269. //汇总连接 圆形经过圆形 两条斜交叉的直线
  270. case "flowChartSummingJunction": break;
  271. //终止 最小边半径圆角矩形
  272. case "flowChartTerminator": break;
  273. //折角
  274. case "folderCorner": break;
  275. // 图文框框
  276. case "frame": break;
  277. //漏斗
  278. case "funnel": break;
  279. //齿轮六角
  280. case "gear6": break;
  281. //齿轮9角
  282. case "gear9": break;
  283. // 半闭框
  284. case "halfFrame": break;
  285. //心形 宽高拉伸
  286. case "heart": break;
  287. ////七边形
  288. case "heptagon": break;
  289. //六边形1060704 *96/914400=111.36
  290. case "hexagon": break;
  291. //五边形 长高 2:1 矩形加右侧1一个宽的三角形
  292. case "homePlate": break;
  293. //横卷形
  294. case "horizontalScroll": break;
  295. //爆炸形1
  296. case "irregularSeal1": break;
  297. //爆炸形2
  298. case "irregularSeal2": break;
  299. //左箭头
  300. case "leftArrow": break;
  301. //左箭头标注
  302. case "leftArrowCallout": break;
  303. //左大括号{
  304. case "leftBrace": break;
  305. //左括号(
  306. case "leftBracket": break;
  307. //左右箭头标注
  308. case "leftRightArrowCallout": break;
  309. //左右凸出带
  310. case "leftRightRibbon": break;
  311. // 闪电 宽高拉伸
  312. case "lightningBolt": break;
  313. case "lineInv": break;
  314. //除号
  315. case "mathDivide": break;
  316. //等号
  317. case "mathEqual": break;
  318. //减号
  319. case "mathMinus": break;
  320. //乘号
  321. case "mathMultiply": break;
  322. //不等号
  323. case "mathNotEqual": break;
  324. //加号
  325. case "mathPlus": break;
  326. //新月形
  327. case "moon": break;
  328. //非等腰梯形
  329. case "nonIsoscelesTrapezoid": break;
  330. //禁止吸烟
  331. case "noSmoking": break;
  332. // 八边形
  333. case "octagon": break;
  334. //平行四边形
  335. case "parallelogram": break;
  336. //正五边形 宽高决定形变
  337. case "pentagon": break;
  338. ////饼图 21600000 16200000 默认16200000 ---> 0
  339. case "pie": break;
  340. //扇形边 扇形
  341. case "pieWedge": break;
  342. //缺角圆角矩形
  343. case "plaque": break;
  344. //缺角 圆角标签
  345. case "plaqueTabs": break;
  346. //十字形
  347. case "plus": break;
  348. // 十字箭头标注
  349. case "quadArrowCallout": break;
  350. //矩形
  351. case "rect":
  352. svgPath = "<rect rx=\"37.5\" ry=\"37.5\" width=\"150\" height=\"150\" style=\"fill:red;\" />";
  353. break;
  354. //前凸带形
  355. case "ribbon": break;
  356. //上凸带形
  357. case "ribbon2": break;
  358. //右箭头标注
  359. case "rightArrowCallout": break;
  360. //右大括号}
  361. case "rightBrace": break;
  362. //右括号)
  363. case "rightBracket": break;
  364. //单圆角矩形 右上角圆角缺角 0-50000 = 50% 最小宽度的 百分比作为缺角
  365. case "round1Rect": break;
  366. // 对角圆角矩形 左上角 右下角 圆角缺角0-50000 = 50% 最小宽度的 百分比作为缺角 右上角 左下角 圆角缺角0-50000 = 50% 最小宽度的 百分比作为缺角
  367. case "round2DiagRect": break;
  368. //同侧圆角矩形
  369. case "round2SameRect": break;
  370. //直角三角形 宽高决定形变
  371. case "rtTriangle": break;
  372. //笑脸
  373. case "smileyFace": break;
  374. //剪去单角的矩形 右上角 0-50000 = 50% 最小宽度的 百分比作为缺角
  375. case "snip1Rect": break;
  376. //剪去对角的矩形
  377. case "snip2DiagRect": break;
  378. //剪去同侧角的矩形
  379. case "snip2SameRect": break;
  380. //单圆角矩形
  381. case "snipRoundRect": break;
  382. //方形制表符 不解析
  383. case "squareTabs": break;
  384. // 十角星
  385. case "star10": break;
  386. // 12角星
  387. case "star12": break;
  388. // 16角星
  389. case "star16": break;
  390. // 24角星
  391. case "star24": break;
  392. // 32角星
  393. case "star32": break;
  394. // 4角星
  395. case "star4": break;
  396. // 5角星
  397. case "star5": break;
  398. // 6角星
  399. case "star6": break;
  400. // 7角星
  401. case "star7": break;
  402. // 8角星
  403. case "star8": break;
  404. // 太阳
  405. case "sun": break;
  406. //泪滴型
  407. case "teardrop": break;
  408. //等腰梯形
  409. case "trapezoid": break;
  410. //上箭头标注
  411. case "upArrowCallout": break;
  412. //上下箭头标注
  413. case "upDownArrowCallout": break;
  414. //竖卷形
  415. case "verticalScroll": break;
  416. //波浪形
  417. case "wave": break;
  418. //椭圆形标注
  419. case "wedgeEllipseCallout": break;
  420. // 矩形标注
  421. case "wedgeRectCallout": break;
  422. // 圆角矩形标注
  423. case "wedgeRoundRectCallout": break;
  424. // //椭圆或者圆形
  425. case "ellipse":
  426. svgPath = " <circle cx=\"100\" cy=\"50\" r=\"40\" stroke=\"black\" stroke-width=\"2\" fill=\"red\" />";
  427. break;
  428. // 圆角矩形
  429. case "roundRect": break;
  430. case "bentConnector2": break;
  431. //直接连接符 线
  432. case "line":
  433. svgPath = " <line x1=\"0\" y1=\"0\" x2=\"200\" y2=\"200\" style=\"stroke:blue;stroke-width:1\" />";
  434. break;
  435. //直接箭头连接符
  436. case "straightConnector1": break;
  437. //肘形连接符<a:headEnd type="triangle"/>
  438. // < a:tailEnd type = "triangle" />
  439. case "bentConnector3": break;
  440. //肘形箭头连接符
  441. // case "bentConnector4": break;
  442. //肘形双箭头连接符
  443. // case "bentConnector5": break;
  444. // case "curvedConnector2": break;
  445. //曲线连接符
  446. case "curvedConnector3": break;
  447. // case "curvedConnector4": break;
  448. // case "curvedConnector5": break;
  449. //右箭头
  450. case "rightArrow": break;
  451. //下箭头
  452. case "downArrow": break;
  453. //圆角右箭头
  454. case "bentArrow": break;
  455. //直角上箭头
  456. case "bentUpArrow": break;
  457. //虚尾箭头
  458. case "stripedRightArrow": break;
  459. //十字箭头 TODO
  460. case "quadArrow": break;
  461. //环形箭头
  462. case "circularArrow": break;
  463. case "swooshArrow": break;
  464. // //左右箭头
  465. case "leftRightArrow": break;
  466. //丁字箭头
  467. case "leftRightUpArrow": break;
  468. //直角双向箭头 向左 向上
  469. case "leftUpArrow": break;
  470. //左环形箭头
  471. case "leftCircularArrow": break;
  472. //燕尾形箭头
  473. case "notchedRightArrow": break;
  474. //上弧形箭头 弧形向上 箭头右下
  475. case "curvedDownArrow": break;
  476. //右弧形箭头 弧形向右 箭头向左下
  477. case "curvedLeftArrow": break;
  478. //左弧形箭头 弧形向左 箭头向右下
  479. case "curvedRightArrow": break;
  480. //下弧形箭头 弧形向下 箭头右上
  481. case "curvedUpArrow": break;
  482. //上下箭头
  483. case "upDownArrow": break;
  484. //上箭头
  485. case "upArrow": break;
  486. //手杖形箭头 向右调头
  487. case "uturnArrow": break;
  488. //左右圆箭头
  489. case "leftRightCircularArrow": break;
  490. //三角形
  491. case "triangle": break;
  492. default: break;
  493. }
  494. }
  495. public static string GetFontColor(XmlDocument nodeXml, XmlNode typeNode, XmlDocument slideMasterTextStyles, Dictionary<string, string> colors)
  496. {
  497. var color = nodeXml.SelectSingleNode("//a:rPr/a:solidFill/a:srgbClr/@val", xmlnsManager);
  498. if (color == null && typeNode != null)
  499. {
  500. if (typeNode.Value.Equals("title") || typeNode.Value.Equals("subTitle") || typeNode.Value.Equals("ctrTitle"))
  501. {
  502. color = slideMasterTextStyles.SelectSingleNode("//p:titleStyle/a:lvl1pPr/a:defRPr/a:solidFill/a:schemeClr/@val", xmlnsManager);
  503. }
  504. if (typeNode.Value.Equals("body"))
  505. {
  506. color = slideMasterTextStyles.SelectSingleNode("//p:bodyStyle/a:lvl1pPr/a:defRPr/a:solidFill/a:schemeClr/@val", xmlnsManager);
  507. }
  508. //if (typeNode.Value.Equals("dt") || typeNode.Value.Equals("sldNum"))
  509. //{
  510. // color = 12;
  511. //}
  512. }
  513. if (color == null && typeNode == null)
  514. {
  515. color = slideMasterTextStyles.SelectSingleNode("//p:otherStyle/a:lvl1pPr/a:defRPr/a:solidFill/a:schemeClr/@val", xmlnsManager);
  516. }
  517. if (color != null)
  518. {
  519. if (colors.TryGetValue(color.Value, out string colr))
  520. {
  521. return colr;
  522. }
  523. else { return "000000"; }
  524. }
  525. else { return "000000"; }
  526. }
  527. public static int GetFontSize(XmlDocument nodeXml, XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode, XmlNode typeNode, XmlDocument slideMasterTextStyles)
  528. {
  529. int fontSize = 0;
  530. XmlNode szNode = nodeXml.SelectSingleNode("//a:rPr/@sz", xmlnsManager);
  531. if (szNode == null)
  532. {
  533. if (slideLayoutSpNode != null)
  534. {
  535. szNode = slideLayoutSpNode.SelectSingleNode("//p:txBody/a:lstStyle/a:lvl1pPr/a:defRPr/@sz", xmlnsManager);
  536. }
  537. }
  538. if (szNode == null && typeNode != null)
  539. {
  540. if (typeNode.Value.Equals("title") || typeNode.Value.Equals("subTitle") || typeNode.Value.Equals("ctrTitle"))
  541. {
  542. szNode = slideMasterTextStyles.SelectSingleNode("//p:titleStyle/a:lvl1pPr/a:defRPr/@sz", xmlnsManager);
  543. }
  544. if (typeNode.Value.Equals("body"))
  545. {
  546. szNode = slideMasterTextStyles.SelectSingleNode("//p:bodyStyle/a:lvl1pPr/a:defRPr/@sz", xmlnsManager);
  547. }
  548. //if (typeNode.Value.Equals("dt") || typeNode.Value.Equals("sldNum"))
  549. //{
  550. // fontSize = 12;
  551. //}
  552. }
  553. if (szNode == null && typeNode == null)
  554. {
  555. szNode = slideMasterTextStyles.SelectSingleNode("//p:otherStyle/a:lvl1pPr/a:defRPr/@sz", xmlnsManager);
  556. }
  557. if (szNode != null)
  558. {
  559. fontSize = int.Parse(szNode.Value) / 100;
  560. }
  561. XmlNode baseline = nodeXml.SelectSingleNode("//a:rPr/@baseline", xmlnsManager);
  562. if (baseline != null)
  563. {
  564. fontSize -= 10;
  565. }
  566. return fontSize;
  567. //font-size
  568. }
  569. public static string GetFontType(XmlDocument nodeXml, XmlNode typeNode, XmlDocument slideMasterTextStyles, Theme theme)
  570. {
  571. XmlNode typeface = nodeXml.SelectSingleNode("//a:rPr/a:latin/@typeface",xmlnsManager);
  572. if (typeface == null)
  573. {
  574. XmlDocument doc = new XmlDocument();
  575. doc.LoadXml(theme.OuterXml);
  576. typeface = doc.SelectSingleNode("//a:theme/a:themeElements/a:fontScheme/a:majorFont/a:latin/@typeface", xmlnsManager);
  577. }
  578. if (typeface != null)
  579. {
  580. return typeface.Value;
  581. }
  582. else
  583. {
  584. return "";
  585. }
  586. //font-family
  587. }
  588. public static string GetFontBold(XmlDocument nodeXml, XmlNode typeNode, XmlDocument slideMasterTextStyles)
  589. {
  590. var FontBold = nodeXml.SelectSingleNode("a:rPr/@b",xmlnsManager);
  591. if (FontBold != null)
  592. {
  593. if (FontBold.Value.Equals("1"))
  594. {
  595. return "bold";
  596. }
  597. else
  598. {
  599. return "initial";
  600. }
  601. }
  602. else
  603. {
  604. return "initial";
  605. }
  606. //font-weight
  607. }
  608. public static string GetFontItalic(XmlDocument nodeXml, XmlNode typeNode, XmlDocument slideMasterTextStyles)
  609. {
  610. var FontBold = nodeXml.SelectSingleNode("a:rPr/@i",xmlnsManager);
  611. if (FontBold != null)
  612. {
  613. if (FontBold.Value.Equals("1"))
  614. {
  615. return "italic";
  616. }
  617. else
  618. {
  619. return "normal";
  620. }
  621. }
  622. else
  623. {
  624. return "normal";
  625. }
  626. //font-style
  627. }
  628. public static string GetFontDecoration(XmlDocument nodeXml, XmlNode typeNode, XmlDocument slideMasterTextStyles)
  629. {
  630. var FontBold = nodeXml.SelectSingleNode("a:rPr/@u",xmlnsManager);
  631. if (FontBold != null)
  632. {
  633. if (FontBold.Value.Equals("sng"))
  634. {
  635. return "underline";
  636. }
  637. else
  638. {
  639. return "initial";
  640. }
  641. }
  642. else
  643. {
  644. return "initial";
  645. }
  646. //text-decoration
  647. }
  648. public static string GetTextVerticalAlign(XmlDocument nodeXml, XmlNode typeNode, XmlDocument slideMasterTextStyles)
  649. {
  650. var baseline = nodeXml.SelectSingleNode("a:rPr/@baseline",xmlnsManager);
  651. if (baseline != null)
  652. {
  653. return int.Parse(baseline.Value) / 1000 + "%";
  654. }
  655. else
  656. {
  657. return "baseline";
  658. }
  659. //vertical-align
  660. }
  661. /// <summary>
  662. /// 解析形状的填充色
  663. /// </summary>
  664. /// <param name="nodeXml"></param>
  665. /// <param name="colors"></param>
  666. /// <returns></returns>
  667. public static Model.PowerPoint.Fill GetShapeFill(string nodeXml, Dictionary<string, string> colors)
  668. {
  669. // 1. presentationML
  670. // p:spPr [a:noFill, solidFill, gradFill, blipFill, pattFill, grpFill]
  671. // From slide
  672. XmlDocument doc = new XmlDocument();
  673. doc.LoadXml(nodeXml);
  674. XmlNode nofillNode = doc.SelectSingleNode("//p:spPr/a:noFill", xmlnsManager);
  675. if (nofillNode != null)
  676. {
  677. return new Model.PowerPoint.Fill() { Type = 0, };
  678. }
  679. Model.PowerPoint.Fill fill = new Model.PowerPoint.Fill();
  680. string fillColor = null;
  681. XmlNode fillNode = doc.SelectSingleNode("//p:spPr/a:solidFill/a:srgbClr/@val", xmlnsManager);
  682. if (fillNode == null)
  683. {
  684. fillNode = doc.SelectSingleNode("//p:spPr/a:solidFill/a:schemeClr/@val", xmlnsManager);
  685. }
  686. if (fillNode == null)
  687. {
  688. fillNode = doc.SelectSingleNode("//p:style/a:fillRef/a:schemeClr/@val", xmlnsManager);
  689. }
  690. if (fillNode != null)
  691. {
  692. if (colors.TryGetValue(fillNode.Value, out string color))
  693. {
  694. fillColor = color;
  695. }
  696. else
  697. {
  698. fillColor = fillNode.Value;
  699. }
  700. var node = doc.SelectSingleNode("//p:spPr/a:solidFill/a:schemeClr | //p:style/a:fillRef/a:schemeClr", xmlnsManager);
  701. if (node != null && node.HasChildNodes)
  702. {
  703. //调和颜色
  704. fillColor = ColorToning(node.OuterXml, fillColor);
  705. }
  706. //调和颜色
  707. }
  708. return new Model.PowerPoint.Fill { Type =1, Color = fillColor };
  709. }
  710. /// <summary>
  711. /// 获取边框样式
  712. /// </summary>
  713. /// <param name="nodeXml"></param>
  714. /// <param name="isSvg"></param>
  715. public static Border GetBorder(string nodeXml, bool isCxnSp, Dictionary<string, string> colorMaps)
  716. {
  717. //边框宽度
  718. int borderWidth =0;
  719. if (isCxnSp) {
  720. borderWidth = 1;
  721. }
  722. XmlDocument doc = new XmlDocument();
  723. doc.LoadXml(nodeXml);
  724. XmlNode borderw = doc.SelectSingleNode("//p:spPr/a:ln/@w", xmlnsManager);
  725. if (borderw != null)
  726. {
  727. borderWidth = int.Parse(borderw.Value) / 12700;
  728. }
  729. //边框颜色
  730. string borderColor = null;
  731. XmlNode borderc = doc.SelectSingleNode("//p:spPr/a:ln/a:solidFill/a:srgbClr/@val", xmlnsManager);
  732. if (borderc == null)
  733. {
  734. borderc = doc.SelectSingleNode("//p:spPr/a:ln/a:solidFill/a:schemeClr/@val", xmlnsManager);
  735. }
  736. if (borderc == null)
  737. {
  738. borderc = doc.SelectSingleNode("//p:style/a:lnRef/a:schemeClr/@val", xmlnsManager);
  739. }
  740. if (borderc != null)
  741. {
  742. if (colorMaps.TryGetValue(borderc.Value, out string color))
  743. {
  744. borderColor = color;
  745. }
  746. else
  747. {
  748. borderColor = borderc.Value;
  749. }
  750. var node = doc.SelectSingleNode("//p:style/a:lnRef/a:schemeClr | //p:spPr/a:ln/a:solidFill/a:schemeClr", xmlnsManager);
  751. if (node != null && node.HasChildNodes)
  752. {
  753. //调和颜色
  754. borderColor = ColorToning(node.OuterXml, borderColor);
  755. }
  756. }
  757. //边框类型
  758. XmlNode borderT = doc.SelectSingleNode("//p:spPr/a:ln/a:prstDash/@val", xmlnsManager);
  759. var strokeDasharray = "0";
  760. var borderType = "";
  761. if (borderT != null)
  762. {
  763. switch (borderT.Value)
  764. {
  765. case "solid":
  766. borderType += "solid";
  767. strokeDasharray = "0";
  768. break;
  769. case "dash":
  770. borderType += "dashed";
  771. strokeDasharray = "20";
  772. break;
  773. case "dashDot":
  774. borderType += "dashed";
  775. strokeDasharray = "5, 5, 1, 5";
  776. break;
  777. case "dot":
  778. borderType += "dotted";
  779. strokeDasharray = "1, 5";
  780. break;
  781. case "lgDash":
  782. borderType += "dashed";
  783. strokeDasharray = "10, 5";
  784. break;
  785. case "lgDashDotDot":
  786. borderType += "dashed";
  787. strokeDasharray = "10, 5, 1, 5, 1, 5";
  788. break;
  789. case "sysDash":
  790. borderType += "dashed";
  791. strokeDasharray = "5, 2";
  792. break;
  793. case "sysDashDot":
  794. borderType += "dashed";
  795. strokeDasharray = "5, 2, 1, 5";
  796. break;
  797. case "sysDashDotDot":
  798. borderType += "dashed";
  799. strokeDasharray = "5, 2, 1, 5, 1, 5";
  800. break;
  801. case "sysDot":
  802. borderType += "dotted";
  803. strokeDasharray = "2, 5";
  804. break;
  805. case null:
  806. //console.log(borderType);
  807. default:
  808. break;
  809. //console.warn(borderType);
  810. //cssText += "#000 solid";
  811. }
  812. }
  813. if (isCxnSp)
  814. {
  815. borderWidth = borderWidth == 0 ? 1 : borderWidth;
  816. return new Border { Width = borderWidth, Color = borderColor, Type = borderType, Stroke = strokeDasharray };
  817. }
  818. else {
  819. if (string.IsNullOrEmpty(borderType) )
  820. {
  821. if (borderWidth == 0)
  822. {
  823. return new Border { Width = 0, Color = borderColor, Type = borderType, Stroke = strokeDasharray };
  824. }
  825. else {
  826. return new Border { Width = borderWidth, Color = borderColor, Type = "solid", Stroke = "0" };
  827. }
  828. }
  829. else
  830. {
  831. borderWidth = borderWidth == 0 ? 1 : borderWidth;
  832. return new Border { Width = borderWidth, Color = borderColor, Type = borderType, Stroke = strokeDasharray };
  833. }
  834. }
  835. }
  836. /// <summary>
  837. /// 调色补充 Shade Tint LumMod LumOff 等
  838. /// </summary>
  839. /// <param name="xml"></param>
  840. /// <param name="color"></param>
  841. /// <returns></returns>
  842. public static string ColorToning(string nodeXml, string colorHex)
  843. {
  844. TEAMModelOS.SDK.Helper.Common.ColorHelper.ColorConverter converter = new TEAMModelOS.SDK.Helper.Common.ColorHelper.ColorConverter();
  845. XmlDocument doc = new XmlDocument();
  846. doc.LoadXml(nodeXml);
  847. XmlNode lumMod = doc.SelectSingleNode("//a:lumMod/@val", xmlnsManager);
  848. if (lumMod != null)
  849. {
  850. colorHex = converter.SetLuminanceMod(colorHex, double.Parse(lumMod.Value));
  851. }
  852. XmlNode lumOff = doc.SelectSingleNode("//a:lumOff/@val", xmlnsManager);
  853. if (lumOff != null)
  854. {
  855. colorHex = converter.SetLuminanceOff(colorHex, double.Parse(lumOff.Value));
  856. }
  857. XmlNode satMod = doc.SelectSingleNode("//a:satMod/@val", xmlnsManager);
  858. if (satMod != null)
  859. {
  860. colorHex = converter.SetSaturationMod(colorHex, double.Parse(satMod.Value));
  861. }
  862. XmlNode satOff = doc.SelectSingleNode("//a:satOff/@val", xmlnsManager);
  863. if (satOff != null)
  864. {
  865. colorHex = converter.SetSaturationOff(colorHex, double.Parse(satOff.Value));
  866. }
  867. XmlNode hueOff = doc.SelectSingleNode("//a:hueOff/@val", xmlnsManager);
  868. if (hueOff != null)
  869. {
  870. colorHex = converter.SetHueOff(colorHex, double.Parse(hueOff.Value));
  871. }
  872. XmlNode hueMod = doc.SelectSingleNode("//a:hueMod/@val", xmlnsManager);
  873. if (hueMod != null)
  874. {
  875. colorHex = converter.SetHueMod(colorHex, double.Parse(hueMod.Value));
  876. }
  877. XmlNode alphaOff = doc.SelectSingleNode("//a:alphaOff/@val", xmlnsManager);
  878. if (alphaOff != null)
  879. {
  880. // Color color= ColorTranslator.FromHtml("#" + colorHex);
  881. // color = Color.FromArgb(byte.Parse(int.Parse(alpha.Value)/100000+""),color.R,color.G,color.B);
  882. }
  883. XmlNode shade = doc.SelectSingleNode("//a:shade/@val", xmlnsManager);
  884. if (shade != null)
  885. {
  886. colorHex = converter.SetShade(colorHex, double.Parse(shade.Value));
  887. }
  888. XmlNode tint = doc.SelectSingleNode("//a:tint/@val", xmlnsManager);
  889. if (tint != null)
  890. {
  891. colorHex = converter.SetTint(colorHex, double.Parse(tint.Value));
  892. }
  893. XmlNode alpha = doc.SelectSingleNode("//a:alpha/@val", xmlnsManager);
  894. if (alpha != null)
  895. {
  896. // Color color= ColorTranslator.FromHtml("#" + colorHex);
  897. // color = Color.FromArgb(byte.Parse(int.Parse(alpha.Value)/100000+""),color.R,color.G,color.B);
  898. }
  899. return colorHex;
  900. }
  901. public static Dictionary<string, string> GetLayoutOrMasterColors(SlidePart slidePart, Dictionary<string, string> slideMasterColors, Theme theme)
  902. {
  903. OverrideColorMapping colorMap = slidePart.SlideLayoutPart.SlideLayout.ColorMapOverride.OverrideColorMapping;
  904. Dictionary<string, string> Colors = new Dictionary<string, string>();
  905. if (colorMap != null)
  906. {
  907. Colors = DoColorMap(colorMap, null, theme);
  908. }
  909. else
  910. {
  911. Colors = slideMasterColors;
  912. }
  913. return Colors;
  914. }
  915. /// <summary>
  916. /// 根据 node layout master获取位置
  917. /// </summary>
  918. /// <param name="nodeXml"></param>
  919. /// <param name="slideLayoutSpNode"></param>
  920. /// <param name="slideMasterSpNode"></param>
  921. /// <returns></returns>
  922. public static HiTeachCC.Model.PowerPoint.Position GetPosition(string nodeXml, XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode)
  923. {
  924. XmlDocument doc = new XmlDocument();
  925. doc.LoadXml(nodeXml);
  926. XmlNode xfrm = doc.SelectSingleNode("//a:xfrm", xmlnsManager);
  927. if (xfrm == null)
  928. {
  929. xfrm = slideLayoutSpNode.SelectSingleNode("//a:xfrm", xmlnsManager);
  930. if (xfrm == null)
  931. {
  932. xfrm = slideMasterSpNode.SelectSingleNode("//a:xfrm",xmlnsManager);
  933. }
  934. }
  935. if (xfrm != null)
  936. {
  937. Transform2D transform2D = new Transform2D(xfrm.OuterXml);
  938. return GetPositionByTransform2D(transform2D);
  939. }
  940. return new Model.PowerPoint.Position();
  941. }
  942. public static BuChar GenBuChar(XmlDocument nodeXml, Style slideLayoutTables,
  943. Style slideMasterTables, XmlDocument SlideMasterTextStyles, XmlNode typeNode, bool hasBuChar)
  944. {
  945. // todo
  946. //需要完善slideMaster1.xml 中含有a:buChar 的情况
  947. //XmlDocument doc = new XmlDocument();
  948. //doc.LoadXml(nodeXml);
  949. BuChar bchar = new BuChar();
  950. // XmlNode pPr = nodeXml.SelectSingleNode("//a:pPr",xmlnsManager);
  951. int lvl = 0;
  952. XmlNode lvlNode = nodeXml.SelectSingleNode("//a:pPr/@lvl",xmlnsManager);
  953. if (lvlNode != null)
  954. {
  955. lvl = int.Parse(lvlNode.Value);
  956. }
  957. var buCharNode = nodeXml.SelectSingleNode("//a:pPr/a:buChar/@char",xmlnsManager);
  958. if (buCharNode != null)
  959. {
  960. XmlNode buFontNode = nodeXml.SelectSingleNode("//a:pPr/a:buFont",xmlnsManager);
  961. if (buFontNode != null)
  962. {
  963. var marginLeft = 328600 * 96 / 914400 * lvl;
  964. var marginRight = 0;
  965. var typeface = "";
  966. XmlNode marLNode = nodeXml.SelectSingleNode("//a:pPr/@marL",xmlnsManager);
  967. if (marLNode != null)
  968. {
  969. marginLeft = int.Parse(marLNode.Value) * 96 / 914400;
  970. }
  971. XmlNode pitchFamilyNode = nodeXml.SelectSingleNode("//a:pPr/a:buFont/@pitchFamily",xmlnsManager);
  972. if (pitchFamilyNode != null)
  973. {
  974. marginRight = int.Parse(pitchFamilyNode.Value);
  975. }
  976. XmlNode typefaceNode = nodeXml.SelectSingleNode("//a:pPr/a:buFont/@typeface",xmlnsManager);
  977. if (typefaceNode != null)
  978. {
  979. typeface = typefaceNode.Value;
  980. }
  981. bchar = new BuChar { MarginLeft = marginLeft, MarginRiht = marginRight, Typeface = typeface, Buchar = buCharNode.Value };
  982. }
  983. else
  984. {
  985. int marginLeft = 328600 * 96 / 914400 * lvl;
  986. int marginRight = 0;
  987. bchar = new BuChar { MarginLeft = marginLeft, MarginRiht = marginRight, Typeface = "", Buchar = buCharNode.Value };
  988. }
  989. }
  990. else
  991. {
  992. int marginLeft = 328600 * 96 / 914400 * lvl;
  993. int marginRight = 0;
  994. bchar = new BuChar { MarginLeft = marginLeft, MarginRiht = marginRight, Typeface = "", Buchar = "" };
  995. }
  996. if (string.IsNullOrEmpty(bchar.Buchar) && typeNode != null && typeNode.Value.Equals("body"))
  997. {
  998. string bucharPath = "//p:bodyStyle/a:lvl" + (lvl + 1) + "pPr/a:buChar/@char";
  999. XmlNode buchar = SlideMasterTextStyles.SelectSingleNode(bucharPath,xmlnsManager);
  1000. if (buchar != null)
  1001. {
  1002. bchar.Buchar = buchar.Value;
  1003. }
  1004. }
  1005. if (string.IsNullOrEmpty(bchar.Typeface) && typeNode != null && typeNode.Value.Equals("body"))
  1006. {
  1007. string facePath = "//p:bodyStyle/a:lvl" + (lvl + 1) + "pPr/a:buFont/@typeface";
  1008. XmlNode face = SlideMasterTextStyles.SelectSingleNode(facePath,xmlnsManager);
  1009. if (face != null)
  1010. {
  1011. bchar.Typeface = face.Value;
  1012. }
  1013. }
  1014. if (bchar.FontSize == 0 && typeNode != null && (typeNode.Value.Equals("body") || typeNode.Value.Equals("sldNum")))
  1015. {
  1016. string sizePath = "//p:bodyStyle/a:lvl" + (lvl + 1) + "pPr/a:defRPr/@sz";
  1017. XmlNode size = SlideMasterTextStyles.SelectSingleNode(sizePath,xmlnsManager);
  1018. if (sizePath != null)
  1019. {
  1020. bchar.FontSize = int.Parse(size.Value) / 100;
  1021. }
  1022. }
  1023. if (hasBuChar)
  1024. {
  1025. string sizePath = "//p:bodyStyle/a:lvl" + (lvl + 1) + "pPr/a:defRPr/@sz";
  1026. XmlNode size = SlideMasterTextStyles.SelectSingleNode(sizePath,xmlnsManager);
  1027. if (sizePath != null)
  1028. {
  1029. bchar.FontSize = int.Parse(size.Value) / 100;
  1030. }
  1031. string facePath = "//p:bodyStyle/a:lvl" + (lvl + 1) + "pPr/a:buFont/@typeface";
  1032. XmlNode face = SlideMasterTextStyles.SelectSingleNode(facePath,xmlnsManager);
  1033. if (face != null)
  1034. {
  1035. bchar.Typeface = face.Value;
  1036. }
  1037. string bucharPath = "//p:bodyStyle/a:lvl" + (lvl + 1) + "pPr/a:buChar/@char";
  1038. XmlNode buchar = SlideMasterTextStyles.SelectSingleNode(bucharPath,xmlnsManager);
  1039. if (buchar != null)
  1040. {
  1041. bchar.Buchar = buchar.Value;
  1042. }
  1043. }
  1044. if (string.IsNullOrEmpty(bchar.Buchar))
  1045. {
  1046. return null;
  1047. }
  1048. return bchar;
  1049. }
  1050. /// <summary>
  1051. /// 获取垂直排版
  1052. /// </summary>
  1053. /// <param name="element"></param>
  1054. /// <param name="slideLayoutSpNode"></param>
  1055. /// <param name="slideMasterSpNode"></param>
  1056. /// <param name="typeNode"></param>
  1057. /// <param name="slideMasterStyle"></param>
  1058. /// <returns></returns>
  1059. public static string GetHorizontalAlign(XmlDocument nodeXml,
  1060. XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode,
  1061. XmlNode typeNode, XmlDocument slideMasterTextStyles)
  1062. {
  1063. //XmlDocument doc = new XmlDocument();
  1064. //doc.LoadXml(nodeXml);
  1065. XmlNode algn = nodeXml.SelectSingleNode("//a:pPr/@algn",xmlnsManager);
  1066. if (algn == null)
  1067. {
  1068. if (slideLayoutSpNode != null)
  1069. {
  1070. algn = slideLayoutSpNode.SelectSingleNode("//p:txBody/a:p/a:pPr/@algn", xmlnsManager);
  1071. }
  1072. if (algn == null && slideMasterSpNode != null)
  1073. {
  1074. algn = slideMasterSpNode.SelectSingleNode("//p:txBody/a:p/a:pPr/@algn",xmlnsManager);
  1075. }
  1076. if (algn == null && typeNode != null)
  1077. {
  1078. switch (typeNode.Value)
  1079. {
  1080. case "title":
  1081. case "subTitle":
  1082. case "ctrTitle":
  1083. //doc.LoadXml(slideMasterStyle.TypeTable.OuterXml);
  1084. algn = slideMasterTextStyles.SelectSingleNode("//p:titleStyle/a:lvl1pPr/@algn",xmlnsManager);
  1085. break;
  1086. case "body":
  1087. algn = slideMasterTextStyles.SelectSingleNode("//p:bodyStyle/a:lvl1pPr/@algn",xmlnsManager);
  1088. break;
  1089. default:
  1090. // doc.LoadXml(slideMasterStyle.TypeTable.OuterXml);
  1091. algn = slideMasterTextStyles.SelectSingleNode("//p:otherStyle/a:lvl1pPr/@algn",xmlnsManager);
  1092. break;
  1093. }
  1094. }
  1095. }
  1096. if (algn == null)
  1097. {
  1098. if (typeNode == null)
  1099. {
  1100. return "h-left";
  1101. }
  1102. if (typeNode.Value.Equals("title") || typeNode.Value.Equals("subTitle") || typeNode.Value.Equals("ctrTitle"))
  1103. {
  1104. return "h-mid";
  1105. }
  1106. else if (typeNode.Value == "sldNum")
  1107. {
  1108. return "h-right";
  1109. }
  1110. else if (typeNode.Value.Equals("body")) { return "h-left"; }
  1111. }
  1112. return algn.Value.Equals("ctr") ? "h-mid" : algn.Value.Equals("r") ? "h-right" : "h-left";
  1113. }
  1114. /// <summary>
  1115. /// 获取水平排版
  1116. /// 上中下对齐 X, <a:bodyPr anchor="ctr">, <a:bodyPr anchor="b">
  1117. /// </summary>
  1118. /// <param name="element"></param>
  1119. /// <param name="slideLayoutSpNode"></param>
  1120. /// <param name="slideMasterSpNode"></param>
  1121. /// <param name="typeNode"></param>
  1122. public static string GetVerticalAlign(string xmlNode,
  1123. XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode,
  1124. XmlNode typeNode, XmlDocument slideMasterTextStyles)
  1125. {
  1126. XmlDocument doc = new XmlDocument();
  1127. doc.LoadXml(xmlNode);
  1128. XmlNode anchor = doc.SelectSingleNode("//p:txBody/a:bodyPr/@anchor", xmlnsManager);
  1129. if (anchor == null)
  1130. {
  1131. if (slideLayoutSpNode != null)
  1132. {
  1133. anchor = slideLayoutSpNode.SelectSingleNode("//p:txBody/a:bodyPr/@anchor", xmlnsManager);
  1134. }
  1135. if (anchor == null && slideMasterSpNode != null)
  1136. {
  1137. anchor = slideMasterSpNode.SelectSingleNode("//p:txBody/a:bodyPr/@anchor",xmlnsManager);
  1138. }
  1139. }
  1140. if (anchor != null)
  1141. {
  1142. return anchor.Value.Equals("ctr") ? "v-mid" : anchor.Value.Equals("b") ? "v-down" : "v-up";
  1143. }
  1144. else
  1145. {
  1146. return "v-up";
  1147. }
  1148. }
  1149. /// <summary>
  1150. /// 获取位置信息
  1151. /// </summary>
  1152. /// <param name="transform2D"></param>
  1153. /// <returns></returns>
  1154. public static HiTeachCC.Model.PowerPoint.Position GetPositionByTransform2D(Transform2D transform2D)
  1155. {
  1156. HiTeachCC.Model.PowerPoint.Position spPosition = new HiTeachCC.Model.PowerPoint.Position();
  1157. spPosition.Rot = transform2D.Rotation == null ? 0 : transform2D.Rotation.Value;
  1158. spPosition.FlipH = transform2D.HorizontalFlip == null ? 0 : transform2D.HorizontalFlip.Value == true ? 1 : 0;
  1159. spPosition.FlipV = transform2D.VerticalFlip == null ? 0 : transform2D.VerticalFlip.Value == true ? 1 : 0;
  1160. spPosition.X = transform2D.Offset.X == null ? 0 : transform2D.Offset.X.Value;
  1161. spPosition.Y = transform2D.Offset.Y == null ? 0 : transform2D.Offset.Y.Value;
  1162. spPosition.Cx = transform2D.Extents.Cx == null ? 0 : transform2D.Extents.Cx.Value;
  1163. spPosition.Cy = transform2D.Extents.Cy == null ? 0 : transform2D.Extents.Cy.Value;
  1164. return spPosition;
  1165. }
  1166. public static XmlDocument GetSlideMasterTextStyles(string xml)
  1167. {
  1168. XmlDocument doc = new XmlDocument();
  1169. doc.LoadXml(xml);
  1170. XmlNode txStyles = doc.SelectSingleNode("//p:txStyles", xmlnsManager);
  1171. doc.LoadXml(txStyles.OuterXml);
  1172. return doc;
  1173. }
  1174. /// <summary>
  1175. /// 根据slideLayout 或 slideMaster 获取 id idx type
  1176. /// </summary>
  1177. /// <param name="xml"></param>
  1178. /// <returns></returns>
  1179. public static HiTeachCC.Model.PowerPoint.Style IndexNodes(string xml)
  1180. {
  1181. XmlDocument doc = new XmlDocument();
  1182. doc.LoadXml(xml);
  1183. XmlNodeList spTreeNodes = doc.SelectNodes("//p:cSld/p:spTree/child::*", xmlnsManager);
  1184. XmlDocument idTable = new XmlDocument();
  1185. //添加根节点
  1186. XmlElement idElement = idTable.CreateElement("xmlDatas");
  1187. idTable.AppendChild(idElement);
  1188. XmlDocument idxTable = new XmlDocument();
  1189. //添加根节点
  1190. XmlElement idxElement = idxTable.CreateElement("xmlDatas");
  1191. idxTable.AppendChild(idxElement);
  1192. XmlDocument typeTable = new XmlDocument();
  1193. //添加根节点
  1194. XmlElement typeElement = typeTable.CreateElement("xmlDatas");
  1195. typeTable.AppendChild(typeElement);
  1196. if (spTreeNodes != null)
  1197. {
  1198. int size = spTreeNodes.Count;
  1199. for (int i = 0; i < size; i++)
  1200. {
  1201. XmlNode spnode = spTreeNodes.Item(i);
  1202. if (spnode.Name.Equals("p:nvGrpSpPr") || spnode.Name.Equals("p:grpSpPr"))
  1203. {
  1204. continue;
  1205. }
  1206. if (spnode.LocalName.Equals("nvGrpSpPr") || spnode.LocalName.Equals("grpSpPr"))
  1207. {
  1208. continue;
  1209. }
  1210. XmlDocument docNode = new XmlDocument();
  1211. docNode.LoadXml(spnode.OuterXml);
  1212. XmlNode id = spnode.SelectSingleNode("./p:nvSpPr/p:cNvPr/@id", xmlnsManager);
  1213. XmlNode idx = spnode.SelectSingleNode("./p:nvSpPr/p:nvPr/p:ph/@idx", xmlnsManager);
  1214. XmlNode type = spnode.SelectSingleNode("./p:nvSpPr/p:nvPr/p:ph/@type", xmlnsManager);
  1215. var cnode = spnode.ChildNodes;
  1216. StringBuilder builder = new StringBuilder();
  1217. for (int m = 0; m < cnode.Count; m++)
  1218. {
  1219. var cn = cnode.Item(m);
  1220. builder.Append(cn.OuterXml);
  1221. }
  1222. if (id != null)
  1223. {
  1224. XmlDocument docx = new XmlDocument();
  1225. string str = "<xmlData id=\"" + id.Value + "\">" + builder.ToString() + "</xmlData>";
  1226. docx.LoadXml(str);
  1227. //XmlDocument idXmlNode = new XmlDocument();
  1228. //idXmlNode.LoadXml(idElement.OuterXml);
  1229. XmlNode importNode = idElement.OwnerDocument.ImportNode(docx.DocumentElement, true);
  1230. idElement.AppendChild(importNode);
  1231. }
  1232. if (idx != null)
  1233. {
  1234. XmlDocument docx = new XmlDocument();
  1235. string str = "<xmlData id=\"" + idx.Value + "\">" + builder.ToString() + "</xmlData>";
  1236. docx.LoadXml(str);
  1237. //XmlDocument idxXmlNode = new XmlDocument();
  1238. //idxXmlNode.LoadXml(idElement.OuterXml);
  1239. XmlNode importNode = idxElement.OwnerDocument.ImportNode(docx.DocumentElement, true);
  1240. idxElement.AppendChild(importNode);
  1241. }
  1242. if (type != null)
  1243. {
  1244. XmlDocument docx = new XmlDocument();
  1245. string str = "<xmlData id=\"" + type.Value + "\">" + builder.ToString() + "</xmlData>";
  1246. docx.LoadXml(str);
  1247. //XmlDocument typeXmlNode = new XmlDocument();
  1248. //typeXmlNode.LoadXml(idElement.OuterXml);
  1249. XmlNode importNode = typeElement.OwnerDocument.ImportNode(docx.DocumentElement, true);
  1250. typeElement.AppendChild(importNode);
  1251. }
  1252. }
  1253. }
  1254. return new HiTeachCC.Model.PowerPoint.Style { IdTable = idTable, IdxTable = idxTable, TypeTable = typeTable };
  1255. }
  1256. public static Model.PowerPoint.Fill GetSlideBackgroundFill(SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> colors, Theme theme)
  1257. {
  1258. Model.PowerPoint.Fill fill = null ;
  1259. XmlDocument doc = new XmlDocument();
  1260. string SlideXml = slidePart.Slide.OuterXml;
  1261. doc.LoadXml(SlideXml);
  1262. /*
  1263. * blipFill (图片填充)BlipFill
  1264. effectDag (效果容器)EffectDag
  1265. effectLst (效果容器)EffectList
  1266. extLst (扩展名列表)ExtensionList
  1267. gradFill (渐变填充)GradientFill
  1268. grpFill (组填充)
  1269. noFill (无填充)NoFill
  1270. pattFill (图案填充)PatternFill
  1271. compositeElementFill (纯色填充)SolidFill
  1272. phClr 颜色占位
  1273. 块引用 该方案颜色值设置为占位符颜色(该值phClr)。
  1274. 此值显示在填充,线条,效果和背景样式中,并指示这些设置应用于适用于给定样式的主题颜色。
  1275. 这允许相同的填充,线条和效果样式填充OfficeArt图库中显示的主题颜色。
  1276. http://msdn.microsoft.com/en-us/library/cc964302(v=office.12).aspx
  1277. */
  1278. //使用xPath选择需要的节点
  1279. XmlNode node_sld = doc.SelectSingleNode("//p:sld/p:cSld/p:bg/p:bgPr/a:solidFill", xmlnsManager);
  1280. if (node_sld != null)
  1281. {
  1282. SolidFill compositeElement = new SolidFill(node_sld.OuterXml);
  1283. string colorHex = GetBgFill(colors,
  1284. compositeElement.RgbColorModelPercentage,
  1285. compositeElement.RgbColorModelHex,
  1286. compositeElement.HslColor,
  1287. compositeElement.SystemColor,
  1288. compositeElement.SchemeColor,
  1289. compositeElement.PresetColor);
  1290. new Model.PowerPoint.Fill { Type=1,Color=colorHex};
  1291. return fill;
  1292. }
  1293. node_sld = doc.SelectSingleNode("//p:sld/p:cSld/p:bg/p:bgPr/a:blipFill", xmlnsManager);
  1294. if (node_sld != null)
  1295. {
  1296. DocumentFormat.OpenXml.Drawing.BlipFill blipFill = new DocumentFormat.OpenXml.Drawing.BlipFill(node_sld.OuterXml);
  1297. var imageRid = blipFill.Blip.Embed.Value;
  1298. IdPartPair idParie = slidePart.Parts.Where(x => x.RelationshipId == imageRid).FirstOrDefault();
  1299. ImagePart imagePart = (ImagePart)idParie.OpenXmlPart;
  1300. var contentType = imagePart.ContentType;
  1301. string base64 = "";
  1302. using (var stream = imagePart.GetStream())
  1303. {
  1304. byte[] buffer = new byte[stream.Length];
  1305. stream.Read(buffer, 0, buffer.Length);
  1306. stream.Close();
  1307. base64 = System.Convert.ToBase64String(buffer);
  1308. base64 = "data:" + contentType + ";base64," + base64;
  1309. }
  1310. string a = node_sld.OuterXml;
  1311. doc.LoadXml(slideMaster.OuterXml);
  1312. FillStyle fillStyle = GetFillStyle(doc);
  1313. fill = new Model.PowerPoint.Fill { Type = 3, Image = base64, FillStyle = fillStyle };
  1314. return fill;
  1315. }
  1316. string SlideLayoutXml = slidePart.SlideLayoutPart.SlideLayout.OuterXml;
  1317. OverrideColorMapping colorMap = slidePart.SlideLayoutPart.SlideLayout.ColorMapOverride.OverrideColorMapping;
  1318. Dictionary<string, string> styleColors = new Dictionary<string, string>();
  1319. if (colorMap != null)
  1320. {
  1321. styleColors = DoColorMap(colorMap, null, theme);
  1322. }
  1323. else
  1324. {
  1325. styleColors = colors;
  1326. }
  1327. doc.LoadXml(SlideLayoutXml);
  1328. XmlNode node_sldLayout = doc.SelectSingleNode("//p:sldLayout/p:cSld/p:bg/p:bgPr/a:solidFill", xmlnsManager);
  1329. if (node_sldLayout != null)
  1330. {
  1331. SolidFill compositeElement = new SolidFill(node_sldLayout.OuterXml);
  1332. string colorHex = GetBgFill(styleColors,
  1333. compositeElement.RgbColorModelPercentage,
  1334. compositeElement.RgbColorModelHex,
  1335. compositeElement.HslColor,
  1336. compositeElement.SystemColor,
  1337. compositeElement.SchemeColor,
  1338. compositeElement.PresetColor);
  1339. new Model.PowerPoint.Fill { Type = 1, Color = colorHex };
  1340. return fill;
  1341. }
  1342. node_sldLayout = doc.SelectSingleNode("//p:sldLayout/p:cSld/p:bg/p:bgRef", xmlnsManager);
  1343. if (node_sldLayout != null)
  1344. {
  1345. BackgroundStyleReference compositeElement = new BackgroundStyleReference(node_sldLayout.OuterXml);
  1346. string colorHex = GetBgFill(styleColors, compositeElement.RgbColorModelPercentage,
  1347. compositeElement.RgbColorModelHex,
  1348. compositeElement.HslColor,
  1349. compositeElement.SystemColor,
  1350. compositeElement.SchemeColor,
  1351. compositeElement.PresetColor);
  1352. new Model.PowerPoint.Fill { Type = 1, Color = colorHex };
  1353. return fill;
  1354. }
  1355. string slideMasterXml = slideMaster.OuterXml;
  1356. doc.LoadXml(slideMasterXml);
  1357. XmlNode node_sldMaster = doc.SelectSingleNode("//p:sldMaster/p:cSld/p:bg/p:bgPr/a:solidFill", xmlnsManager);
  1358. if (node_sldMaster != null)
  1359. {
  1360. SolidFill compositeElement = new SolidFill(node_sldMaster.OuterXml);
  1361. string colorHex = GetBgFill(colors, compositeElement.RgbColorModelPercentage,
  1362. compositeElement.RgbColorModelHex,
  1363. compositeElement.HslColor,
  1364. compositeElement.SystemColor,
  1365. compositeElement.SchemeColor,
  1366. compositeElement.PresetColor);
  1367. new Model.PowerPoint.Fill { Type = 1, Color = colorHex };
  1368. return fill;
  1369. }
  1370. node_sldMaster = doc.SelectSingleNode("//p:sldMaster/p:cSld/p:bg/p:bgRef", xmlnsManager);
  1371. if (node_sldMaster != null)
  1372. {
  1373. BackgroundStyleReference compositeElement = new BackgroundStyleReference(node_sldMaster.OuterXml);
  1374. string colorHex = GetBgFill(colors, compositeElement.RgbColorModelPercentage,
  1375. compositeElement.RgbColorModelHex,
  1376. compositeElement.HslColor,
  1377. compositeElement.SystemColor,
  1378. compositeElement.SchemeColor,
  1379. compositeElement.PresetColor);
  1380. new Model.PowerPoint.Fill { Type = 1, Color = colorHex };
  1381. return fill;
  1382. }
  1383. doc.LoadXml(slideMaster.OuterXml);
  1384. node_sld = doc.SelectSingleNode("//p:sldMaster/p:cSld/p:bg/p:bgPr/a:blipFill", xmlnsManager);
  1385. if (node_sld != null)
  1386. {
  1387. var imgpart = slideMaster.SlideMasterPart.ImageParts;
  1388. if (imgpart != null)
  1389. {
  1390. string bg64 = "";
  1391. imgpart.ToList().ForEach(yy =>
  1392. {
  1393. var bgct = yy.ContentType;
  1394. using (var stream = yy.GetStream())
  1395. {
  1396. byte[] buffer = new byte[stream.Length];
  1397. stream.Read(buffer, 0, buffer.Length);
  1398. stream.Close();
  1399. bg64 = System.Convert.ToBase64String(buffer);
  1400. bg64 = "data:" + bgct + ";base64," + bg64;
  1401. }
  1402. });
  1403. string a = node_sld.OuterXml;
  1404. doc.LoadXml(slideMaster.OuterXml);
  1405. FillStyle fillStyle = GetFillStyle( doc);
  1406. fill = new Model.PowerPoint.Fill { Type = 3, Image = bg64, FillStyle = fillStyle };
  1407. return fill;
  1408. }
  1409. }
  1410. //if (fill == null) {
  1411. //}
  1412. return null ;
  1413. }
  1414. private static FillStyle GetFillStyle(XmlDocument doc)
  1415. {
  1416. XmlNode fillRect_node = doc.SelectSingleNode("//a:stretch/a:fillRect", xmlnsManager);
  1417. FillStyle fillStyle = new FillStyle();
  1418. if (fillRect_node != null)
  1419. {
  1420. XmlNode left = doc.SelectSingleNode("//a:stretch/a:fillRect/@l", xmlnsManager);
  1421. XmlNode top = doc.SelectSingleNode("//a:stretch/a:fillRect/@t", xmlnsManager);
  1422. XmlNode right = doc.SelectSingleNode("//a:stretch/a:fillRect/@r", xmlnsManager);
  1423. XmlNode bottom = doc.SelectSingleNode("//a:stretch/a:fillRect/@b", xmlnsManager);
  1424. if (left != null)
  1425. {
  1426. fillStyle.Left = int.Parse(left.Value);
  1427. }
  1428. if (top != null)
  1429. {
  1430. fillStyle.Top = int.Parse(top.Value);
  1431. }
  1432. if (right != null)
  1433. {
  1434. fillStyle.Right = int.Parse(right.Value);
  1435. }
  1436. if (bottom != null)
  1437. {
  1438. fillStyle.Bottom = int.Parse(bottom.Value);
  1439. }
  1440. }
  1441. return fillStyle;
  1442. }
  1443. public static Dictionary<string, string> DoColorMap(OverrideColorMapping overrideColorMapping, ColorMap colorMap, Theme theme)
  1444. {
  1445. string[] colors = { "accent1", "accent2", "accent3", "accent4", "accent5", "accent6",
  1446. "lt1", "lt2", "tx1", "tx2", "dk1","dk2","hlink","folHlink","bg1","bg2" };
  1447. DocumentFormat.OpenXml.Drawing.ColorScheme colorScheme = theme.ThemeElements.ColorScheme;
  1448. Dictionary<string, string> pairs = new Dictionary<string, string>();
  1449. Dictionary<string, string> colorDict = new Dictionary<string, string>();
  1450. if (overrideColorMapping != null)
  1451. {
  1452. colorDict.Add("Text1", overrideColorMapping.Text1);
  1453. colorDict.Add("Text2", overrideColorMapping.Text2);
  1454. colorDict.Add("Background1", overrideColorMapping.Background1);
  1455. colorDict.Add("Background2", overrideColorMapping.Background2);
  1456. }
  1457. else
  1458. {
  1459. if (colorMap != null)
  1460. {
  1461. colorDict.Add("Text1", colorMap.Text1);
  1462. colorDict.Add("Text2", colorMap.Text2);
  1463. colorDict.Add("Background1", colorMap.Background1);
  1464. colorDict.Add("Background2", colorMap.Background2);
  1465. }
  1466. }
  1467. foreach (var col in colors)
  1468. {
  1469. pairs.Add(col, PowerPointHelper.ColorForThemeClr(col, colorScheme, colorDict));
  1470. }
  1471. return pairs;
  1472. }
  1473. private static string GetBgFill(Dictionary<string, string> colors,
  1474. RgbColorModelPercentage RgbColorModelPercentage,
  1475. RgbColorModelHex RgbColorModelHex,
  1476. DocumentFormat.OpenXml.Drawing.HslColor HslColor,
  1477. SystemColor SystemColor,
  1478. SchemeColor SchemeColor,
  1479. PresetColor PresetColor)
  1480. {
  1481. var colorHex = "#FFF";
  1482. if (RgbColorModelPercentage != null)
  1483. {
  1484. int r = RgbColorModelPercentage.RedPortion.Value;
  1485. int g = RgbColorModelPercentage.GreenPortion.Value;
  1486. int b = RgbColorModelPercentage.BluePortion.Value;
  1487. colorHex = "#" + ColorTranslator.ToHtml(Color.FromArgb(r, g, b));
  1488. }
  1489. if (RgbColorModelHex != null)
  1490. {
  1491. colorHex = "#" + RgbColorModelHex.Val;
  1492. }
  1493. if (HslColor != null)
  1494. {
  1495. ColorHSL colorHSL = new ColorHSL { H = HslColor.HueValue.Value, S = HslColor.SatValue.Value, L = HslColor.LumValue.Value };
  1496. ColorRGB rbg = ColorHelper.HslToRgb(colorHSL);
  1497. colorHex = "#" + ColorTranslator.ToHtml(Color.FromArgb(rbg.R, rbg.G, rbg.B));
  1498. }
  1499. if (SystemColor != null)
  1500. {
  1501. if (colors.TryGetValue(SystemColor.Val, out string clr))
  1502. {
  1503. colorHex = "#" + clr;
  1504. }
  1505. }
  1506. if (SchemeColor != null)
  1507. {
  1508. if (colors.TryGetValue(SchemeColor.Val, out string clr))
  1509. {
  1510. colorHex = "#" + clr;
  1511. if (SchemeColor.ChildElements != null && SchemeColor.ChildElements.Count > 0)
  1512. {
  1513. colorHex = "#" + ColorToning(SchemeColor.OuterXml, colorHex.Replace("#", ""));
  1514. }
  1515. }
  1516. }
  1517. if (PresetColor != null)
  1518. {
  1519. colorHex = PresetColor.Val.ToString().Replace("2010", "");
  1520. System.Drawing.Color color = System.Drawing.Color.FromName(colorHex);
  1521. colorHex = ColorTranslator.ToHtml(color);
  1522. }
  1523. return colorHex;
  1524. }
  1525. /// <summary>
  1526. /// 在主题Theme中获取颜色
  1527. /// </summary>
  1528. /// <param name="scv"></param>
  1529. /// <param name="theme"></param>
  1530. /// <returns></returns>
  1531. public static string ColorForThemeClr(string scv, DocumentFormat.OpenXml.Drawing.ColorScheme colorScheme, Dictionary<string, string> colorMap)
  1532. {
  1533. string colorStr = "";
  1534. if (scv.Equals("tx1"))
  1535. {
  1536. if (colorMap.TryGetValue("Text1", out string Text1))
  1537. colorStr = ColorForThemeClr(Text1, colorScheme, colorMap);
  1538. return colorStr;
  1539. }
  1540. else if (scv.Equals("bg1"))
  1541. {
  1542. if (colorMap.TryGetValue("Background1", out string Background1))
  1543. colorStr = ColorForThemeClr(Background1, colorScheme, colorMap);
  1544. return colorStr;
  1545. }
  1546. else if (scv.Equals("bg2"))
  1547. {
  1548. if (colorMap.TryGetValue("Background2", out string Background2))
  1549. colorStr = ColorForThemeClr(Background2, colorScheme, colorMap);
  1550. return colorStr;
  1551. }
  1552. else if (scv.Equals("tx2"))
  1553. {
  1554. if (colorMap.TryGetValue("Text2", out string Text2))
  1555. colorStr = ColorForThemeClr(Text2, colorScheme, colorMap);
  1556. return colorStr;
  1557. }
  1558. else if (scv.Equals("dk1"))
  1559. {
  1560. DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Dark1Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.SystemColor>();
  1561. if (sysColor != null)
  1562. {
  1563. return sysColor.LastColor;
  1564. }
  1565. DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Dark1Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.RgbColorModelHex>();
  1566. if (rgbColor != null)
  1567. {
  1568. return rgbColor.Val;
  1569. }
  1570. return colorStr;
  1571. }
  1572. else if (scv.Equals("dk2"))
  1573. {
  1574. DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Dark2Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.SystemColor>();
  1575. if (sysColor != null)
  1576. {
  1577. return sysColor.LastColor;
  1578. }
  1579. DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Dark2Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.RgbColorModelHex>();
  1580. if (rgbColor != null)
  1581. {
  1582. return rgbColor.Val;
  1583. }
  1584. return colorStr;
  1585. }
  1586. else if (scv.Equals("accent1"))
  1587. {
  1588. DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Accent1Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.SystemColor>();
  1589. if (sysColor != null)
  1590. {
  1591. return sysColor.LastColor;
  1592. }
  1593. DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Accent1Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.RgbColorModelHex>();
  1594. if (rgbColor != null)
  1595. {
  1596. return rgbColor.Val;
  1597. }
  1598. return colorStr;
  1599. }
  1600. else if (scv.Equals("accent2"))
  1601. {
  1602. DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Accent2Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.SystemColor>();
  1603. if (sysColor != null)
  1604. {
  1605. return sysColor.LastColor;
  1606. }
  1607. DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Accent2Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.RgbColorModelHex>();
  1608. if (rgbColor != null)
  1609. {
  1610. return rgbColor.Val;
  1611. }
  1612. return colorStr;
  1613. }
  1614. else if (scv.Equals("accent3"))
  1615. {
  1616. DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Accent3Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.SystemColor>();
  1617. if (sysColor != null)
  1618. {
  1619. return sysColor.LastColor;
  1620. }
  1621. DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Accent3Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.RgbColorModelHex>();
  1622. if (rgbColor != null)
  1623. {
  1624. return rgbColor.Val;
  1625. }
  1626. return colorStr;
  1627. }
  1628. else if (scv.Equals("accent4"))
  1629. {
  1630. DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Accent4Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.SystemColor>();
  1631. if (sysColor != null)
  1632. {
  1633. return sysColor.LastColor;
  1634. }
  1635. DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Accent4Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.RgbColorModelHex>();
  1636. if (rgbColor != null)
  1637. {
  1638. return rgbColor.Val;
  1639. }
  1640. return colorStr;
  1641. }
  1642. else if (scv.Equals("accent5"))
  1643. {
  1644. DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Accent5Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.SystemColor>();
  1645. if (sysColor != null)
  1646. {
  1647. return sysColor.LastColor;
  1648. }
  1649. DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Accent5Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.RgbColorModelHex>();
  1650. if (rgbColor != null)
  1651. {
  1652. return rgbColor.Val;
  1653. }
  1654. return colorStr;
  1655. }
  1656. else if (scv.Equals("accent6"))
  1657. {
  1658. DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Accent6Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.SystemColor>();
  1659. if (sysColor != null)
  1660. {
  1661. return sysColor.LastColor;
  1662. }
  1663. DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Accent6Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.RgbColorModelHex>();
  1664. if (rgbColor != null)
  1665. {
  1666. return rgbColor.Val;
  1667. }
  1668. return colorStr;
  1669. }
  1670. else if (scv.Equals("lt1"))
  1671. {
  1672. DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Light1Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.SystemColor>();
  1673. if (sysColor != null)
  1674. {
  1675. return sysColor.LastColor;
  1676. }
  1677. DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Light1Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.RgbColorModelHex>();
  1678. if (rgbColor != null)
  1679. {
  1680. return rgbColor.Val;
  1681. }
  1682. return colorStr;
  1683. }
  1684. else if (scv.Equals("lt2"))
  1685. {
  1686. DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Light2Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.SystemColor>();
  1687. if (sysColor != null)
  1688. {
  1689. return sysColor.LastColor;
  1690. }
  1691. DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Light2Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.RgbColorModelHex>();
  1692. if (rgbColor != null)
  1693. {
  1694. return rgbColor.Val;
  1695. }
  1696. return colorStr;
  1697. }
  1698. else if (scv.Equals("hlink"))
  1699. {
  1700. DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Hyperlink.ChildElements.First<DocumentFormat.OpenXml.Drawing.SystemColor>();
  1701. if (sysColor != null)
  1702. {
  1703. return sysColor.LastColor;
  1704. }
  1705. DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Hyperlink.ChildElements.First<DocumentFormat.OpenXml.Drawing.RgbColorModelHex>();
  1706. if (rgbColor != null)
  1707. {
  1708. return rgbColor.Val;
  1709. }
  1710. return colorStr;
  1711. }
  1712. else if (scv.Equals("folHlink"))
  1713. {
  1714. DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.FollowedHyperlinkColor.ChildElements.First<DocumentFormat.OpenXml.Drawing.SystemColor>();
  1715. if (sysColor != null)
  1716. {
  1717. return sysColor.LastColor;
  1718. }
  1719. DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.FollowedHyperlinkColor.ChildElements.First<DocumentFormat.OpenXml.Drawing.RgbColorModelHex>();
  1720. if (rgbColor != null)
  1721. {
  1722. return rgbColor.Val;
  1723. }
  1724. return colorStr;
  1725. }
  1726. return colorStr;
  1727. }
  1728. }
  1729. }