PowerPointService.cs 61 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146
  1. using DocumentFormat.OpenXml;
  2. using DocumentFormat.OpenXml.Drawing;
  3. using DocumentFormat.OpenXml.Office2010.Drawing;
  4. using DocumentFormat.OpenXml.Packaging;
  5. using DocumentFormat.OpenXml.Presentation;
  6. using HiTeachCC.Model.PowerPoint;
  7. using HiTeachCC.Service.Core.Implement;
  8. using HiTeachCC.Service.PowerPoint.Interface;
  9. using Microsoft.AspNetCore.Http;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.IO;
  13. using System.Linq;
  14. using System.Threading.Tasks;
  15. using System.Xml;
  16. using TEAMModelOS.SDK.Context.Constant.Common;
  17. using TEAMModelOS.SDK.Context.Exception;
  18. using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
  19. using TEAMModelOS.SDK.Helper.Common.JsonHelper;
  20. using TEAMModelOS.SDK.Helper.Common.XmlHelper;
  21. using TEAMModelOS.SDK.Helper.Security.ShaHash;
  22. using TEAMModelOS.SDK.Module.AzureBlob.Container;
  23. using TEAMModelOS.SDK.Module.AzureBlob.Interfaces;
  24. using BlipFill = DocumentFormat.OpenXml.Presentation.BlipFill;
  25. using ColorMap = DocumentFormat.OpenXml.Presentation.ColorMap;
  26. using Paragraph = HiTeachCC.Model.PowerPoint.Paragraph;
  27. using Point = HiTeachCC.Model.PowerPoint.Point;
  28. using Shape = HiTeachCC.Model.PowerPoint.Shape;
  29. using Text = HiTeachCC.Model.PowerPoint.Text;
  30. using Theme = DocumentFormat.OpenXml.Drawing.Theme;
  31. using Transform2D = DocumentFormat.OpenXml.Drawing.Transform2D;
  32. namespace HiTeachCC.Service.PowerPoint.Implement
  33. {
  34. public class PowerPointService : BaseService, IPowerPointService
  35. {
  36. private readonly IAzureBlobDBRepository azureBlobDBRepository;
  37. public PowerPointService(IAzureBlobDBRepository _azureBlobDBRepository)
  38. {
  39. azureBlobDBRepository = _azureBlobDBRepository;
  40. }
  41. const double inchpixel = 96.00, inchpt = 72.00, pxBase = 914400.00, ptBase = 12700;
  42. const double rotBase = 60000.00;
  43. public Dictionary<string, Dictionary<string, string>> styleTable = new Dictionary<string, Dictionary<string, string>>();
  44. public async Task<Dictionary<string, object>> LoadPresentation(IFormFile file)
  45. {
  46. Dictionary<string, object> resdict = new Dictionary<string, object>();
  47. if (FileType.GetExtention(file.FileName).ToLower().Equals("pptx"))
  48. {
  49. await ProcessPPT(file, resdict);
  50. return resdict;
  51. }
  52. else if (FileType.GetExtention(file.FileName).ToLower().Equals("pdf"))
  53. {
  54. await ProcessPDF(file, resdict);
  55. return resdict;
  56. }
  57. else
  58. {
  59. throw new BizException(500, "file type does not support!");
  60. }
  61. }
  62. /// <summary>
  63. /// 加载PPTX文件
  64. /// </summary>
  65. /// <param name="presentationFile"></param>
  66. /// <returns></returns>
  67. public async Task<Dictionary<string, object>> ProcessPPT(IFormFile file, Dictionary<string, object> resdict)
  68. {
  69. string shaCode = ShaHashHelper.GetSHA1(file.OpenReadStream());
  70. using (PresentationDocument presentationDocument = PresentationDocument.Open(file.OpenReadStream(), false))
  71. {
  72. if (presentationDocument == null)
  73. {
  74. throw new ArgumentNullException("presentationDocument");
  75. }
  76. var thumbnailPart = presentationDocument.ThumbnailPart;
  77. string base64 = "";
  78. if (thumbnailPart != null) {
  79. var contentType = thumbnailPart.ContentType;
  80. using (var stream = thumbnailPart.GetStream())
  81. {
  82. byte[] buffer = new byte[stream.Length];
  83. stream.Read(buffer, 0, buffer.Length);
  84. stream.Close();
  85. base64 = System.Convert.ToBase64String(buffer);
  86. base64 = "data:" + contentType + ";base64," + base64;
  87. }
  88. }
  89. PresentationPart presentationPart = presentationDocument.PresentationPart;
  90. if (presentationPart != null && presentationPart.Presentation != null)
  91. {
  92. // Get a Presentation object from the PresentationPart object.
  93. Presentation presentation = presentationPart.Presentation;
  94. int pageSize = 0;
  95. var slideMasterParts = presentationPart.SlideMasterParts;
  96. ColorMap colorMap = null;
  97. SlideMaster slideMaster = null;
  98. Theme theme = null;
  99. foreach (var slideMasterPart in slideMasterParts)
  100. {
  101. if (colorMap != null && theme != null)
  102. {
  103. break;
  104. }
  105. slideMaster = slideMasterPart.SlideMaster;
  106. colorMap = slideMasterPart.SlideMaster.ColorMap;
  107. theme = slideMasterPart.ThemePart.Theme;
  108. var imgpart = slideMasterPart.ImageParts;
  109. if (imgpart != null)
  110. {
  111. imgpart.ToList().ForEach(yy =>
  112. {
  113. var bgct = yy.ContentType;
  114. string bg64 = "";
  115. using (var stream = yy.GetStream())
  116. {
  117. byte[] buffer = new byte[stream.Length];
  118. stream.Read(buffer, 0, buffer.Length);
  119. stream.Close();
  120. bg64 = System.Convert.ToBase64String(buffer);
  121. bg64 = "data:" + bgct + ";base64," + bg64;
  122. }
  123. });
  124. // slideMaster.CommonSlideData.Background.BackgroundProperties;
  125. //blipfill blipfill = element.blipfill;
  126. //var imagerid = blipfill.blip.embed.value;
  127. //idpartpair idparie = slidepart.parts.where(x => x.relationshipid == imagerid).firstordefault();
  128. //imagepart imagepart = (imagepart)idparie.openxmlpart;
  129. //var contenttype = imagepart.contenttype;
  130. //string base64 = "";
  131. //using (var stream = imagepart.getstream())
  132. //{
  133. // byte[] buffer = new byte[stream.length];
  134. // stream.read(buffer, 0, buffer.length);
  135. // stream.close();
  136. // base64 = system.convert.tobase64string(buffer);
  137. // base64 = "data:" + contenttype + ";base64," + base64;
  138. //}
  139. }
  140. }
  141. Dictionary<string, string> slideMasterColors = PowerPointHelper.DoColorMap(null, colorMap, theme);
  142. //获取PPT 一页大小
  143. double x = presentation.SlideSize.Cx * inchpixel / pxBase;
  144. double y = presentation.SlideSize.Cy * inchpixel / pxBase;
  145. List<string> slides = new List<string>();
  146. string slideMasterXml = slideMaster.OuterXml;
  147. Style slideMasterTables = PowerPointHelper.IndexNodes(slideMasterXml);
  148. XmlDocument SlideMasterTextStyles = PowerPointHelper.GetSlideMasterTextStyles(slideMasterXml);
  149. if (presentation.SlideIdList != null)
  150. {
  151. // presentation.SlideIdList.OrderBy(x=>x.);
  152. // Get the title of each slide in the slide order.
  153. // 获取的是几页PPT数量
  154. foreach (var slideId in presentation.SlideIdList.Elements<SlideId>())
  155. {
  156. // HiTeachCC.Model.PowerPoint.Slide slide = new HiTeachCC.Model.PowerPoint.Slide();
  157. // 获取这一页 PPT 的id
  158. string id = slideId.RelationshipId;
  159. SlidePart slidePart = presentationPart.GetPartById(slideId.RelationshipId) as SlidePart;
  160. //获取当前页 PPT 的所有元素
  161. // slide.Items = GetSlideElement(slidePart, theme, colorMap);
  162. //slide.Xml = slidePart.Slide.OuterXml;
  163. var slide10 = slidePart.Slide;
  164. HiTeachCC.Model.PowerPoint.Slide slide = GetSlideElement(slidePart, slideMaster, slideMasterColors, theme, slideMasterTables, SlideMasterTextStyles, pageSize);
  165. slide.Width = x;
  166. slide.Height = y;
  167. XmlDocument xml = Newtonsoft.Json.JsonConvert.DeserializeXmlNode(slide.ToJson(), "Slide");
  168. string result = @"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>" +
  169. @"<?xml-stylesheet type=""text/xsl"" href=""hixml2html.xsl""?>" +
  170. xml.OuterXml;
  171. AzureBlobModel amodel = await azureBlobDBRepository.UploadTextByFolder(result, shaCode, (pageSize + 1) + ".xml", "pptx", false);
  172. slides.Add(amodel.BlobUrl);
  173. pageSize++;
  174. }
  175. }
  176. Pptx info = new Pptx { HiXmls = slides, Width = x, Height = y, PageSize = pageSize, Thumbnail = base64, Sha1Code = shaCode };
  177. AzureBlobModel model = await azureBlobDBRepository.UploadFileByFolder(file.OpenReadStream(), shaCode, shaCode + ".pptx", "pptx", false);
  178. info.PptUrl = model.BlobUrl;
  179. resdict.Add("pptx", info);
  180. resdict.Add("type", "pptx");
  181. return resdict;
  182. }
  183. return null;
  184. }
  185. }
  186. /// <summary>
  187. /// 处理图形非可视化信息
  188. /// </summary>
  189. /// <param name="slidePart"></param>
  190. /// <param name="slideMaster"></param>
  191. /// <param name="slideMasterColors"></param>
  192. /// <param name="theme"></param>
  193. /// <param name="slideMasterTables"></param>
  194. /// <returns></returns>
  195. public HiTeachCC.Model.PowerPoint.Slide GetSlideElement(SlidePart slidePart, SlideMaster slideMaster,
  196. Dictionary<string, string> slideMasterColors, Theme theme,
  197. Style slideMasterTables, XmlDocument SlideMasterTextStyles, int pageSize)
  198. {
  199. Model.PowerPoint.Slide slide = new Model.PowerPoint.Slide() { Index = pageSize };
  200. //用Layout colorMap覆盖 master ColorMap
  201. slideMasterColors = PowerPointHelper.GetLayoutOrMasterColors(slidePart, slideMasterColors, theme);
  202. //slidePart.SlideLayoutPart;
  203. HiTeachCC.Model.PowerPoint.Fill bgFill = PowerPointHelper.GetSlideBackgroundFill(slidePart, slideMaster, slideMasterColors, theme);
  204. string slideLayoutXml = slidePart.SlideLayoutPart.SlideLayout.OuterXml;
  205. var slideLayoutTables = PowerPointHelper.IndexNodes(slideLayoutXml);
  206. var shapeTrees = from shap in slidePart.Slide.Descendants<ShapeTree>() select shap;
  207. if (shapeTrees.Count() > 0 && shapeTrees.First().ChildElements.Count > 0)
  208. {
  209. OpenXmlElementList openXmlElements = shapeTrees.First().ChildElements;
  210. //TransformGroup transformGroup = shapeTrees.First().GroupShapeProperties.TransformGroup;
  211. //HiTeachCC.Model.PowerPoint.Position position = new
  212. //HiTeachCC.Model.PowerPoint.Position();
  213. //position.Rot = transformGroup.Rotation == null ? 0 : transformGroup.Rotation.Value;
  214. //position.FlipH = transformGroup.HorizontalFlip == null ? 0 : transformGroup.HorizontalFlip.Value == true ? 1 : 0;
  215. //position.FlipV = transformGroup.VerticalFlip == null ? 0 : transformGroup.VerticalFlip.Value == true ? 1 : 0;
  216. //position.X = transformGroup.Offset.X == null ? 0 : transformGroup.Offset.X.Value;
  217. //position.Y = transformGroup.Offset.Y == null ? 0 : transformGroup.Offset.Y.Value;
  218. //position.Cx = transformGroup.Extents.Cx == null ? 0 : transformGroup.Extents.Cx.Value;
  219. //position.Cy = transformGroup.Extents.Cy == null ? 0 : transformGroup.Extents.Cy.Value;
  220. //position.ChX = transformGroup.ChildOffset.X == null ? 0 : transformGroup.ChildOffset.X.Value;
  221. //position.ChY = transformGroup.ChildOffset.Y == null ? 0 : transformGroup.ChildOffset.Y.Value;
  222. //position.ChCX = transformGroup.ChildExtents.Cx == null ? 0 : transformGroup.ChildExtents.Cx.Value;
  223. //position.ChCY = transformGroup.ChildExtents.Cy == null ? 0 : transformGroup.ChildExtents.Cy.Value;
  224. int index = 0;
  225. foreach (OpenXmlElement element in openXmlElements)
  226. {
  227. if (element is DocumentFormat.OpenXml.Presentation.NonVisualGroupShapeProperties np || element is DocumentFormat.OpenXml.Presentation.GroupShapeProperties gp)
  228. {
  229. continue;
  230. }
  231. List<Item> list = new List<Item>();
  232. ProcessNodesInSlide(list, element, slidePart.Parts, slideMaster, slideMasterColors, index, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme, slidePart, false);
  233. slide.Items.AddRange(list);
  234. index++;
  235. }
  236. }
  237. var layOutshapeTrees = from shap in slidePart.SlideLayoutPart.SlideLayout.Descendants<ShapeTree>() select shap;
  238. if (layOutshapeTrees.Count() > 0 && layOutshapeTrees.First().ChildElements.Count > 0)
  239. {
  240. OpenXmlElementList openXmlElements = layOutshapeTrees.First().ChildElements;
  241. //TransformGroup transformGroup = shapeTrees.First().GroupShapeProperties.TransformGroup;
  242. //HiTeachCC.Model.PowerPoint.Position position = new
  243. //HiTeachCC.Model.PowerPoint.Position();
  244. //position.Rot = transformGroup.Rotation == null ? 0 : transformGroup.Rotation.Value;
  245. //position.FlipH = transformGroup.HorizontalFlip == null ? 0 : transformGroup.HorizontalFlip.Value == true ? 1 : 0;
  246. //position.FlipV = transformGroup.VerticalFlip == null ? 0 : transformGroup.VerticalFlip.Value == true ? 1 : 0;
  247. //position.X = transformGroup.Offset.X == null ? 0 : transformGroup.Offset.X.Value;
  248. //position.Y = transformGroup.Offset.Y == null ? 0 : transformGroup.Offset.Y.Value;
  249. //position.Cx = transformGroup.Extents.Cx == null ? 0 : transformGroup.Extents.Cx.Value;
  250. //position.Cy = transformGroup.Extents.Cy == null ? 0 : transformGroup.Extents.Cy.Value;
  251. //position.ChX = transformGroup.ChildOffset.X == null ? 0 : transformGroup.ChildOffset.X.Value;
  252. //position.ChY = transformGroup.ChildOffset.Y == null ? 0 : transformGroup.ChildOffset.Y.Value;
  253. //position.ChCX = transformGroup.ChildExtents.Cx == null ? 0 : transformGroup.ChildExtents.Cx.Value;
  254. //position.ChCY = transformGroup.ChildExtents.Cy == null ? 0 : transformGroup.ChildExtents.Cy.Value;
  255. int index = 0;
  256. foreach (OpenXmlElement element in openXmlElements)
  257. {
  258. if (element is DocumentFormat.OpenXml.Presentation.NonVisualGroupShapeProperties np || element is DocumentFormat.OpenXml.Presentation.GroupShapeProperties gp)
  259. {
  260. continue;
  261. }
  262. List<Item> list = new List<Item>();
  263. ProcessNodesInSlide(list, element, slidePart.SlideLayoutPart.Parts, slideMaster, slideMasterColors, index, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme, slidePart, true);
  264. slide.Items.AddRange(list);
  265. index++;
  266. }
  267. }
  268. slide.Fill = bgFill;
  269. return slide;
  270. }
  271. /// <summary>
  272. /// 单个元素分类
  273. /// </summary>
  274. /// <param name="element"></param>
  275. /// <param name="slidePart"></param>
  276. /// <param name="slideMaster"></param>
  277. /// <param name="slideMasterColors"></param>
  278. /// <param name="index"></param>
  279. /// <param name="position"></param>
  280. /// <param name="slideLayoutTables"></param>
  281. /// <param name="slideMasterTables"></param>
  282. /// <returns></returns>
  283. public void ProcessNodesInSlide(List<Item> list, OpenXmlElement element,
  284. IEnumerable<IdPartPair> idPartPairs,
  285. SlideMaster slideMaster,
  286. Dictionary<string, string> colorMaps,
  287. int index,
  288. Style slideLayoutTables,
  289. Style slideMasterTables, XmlDocument SlideMasterTextStyles, Theme theme, SlidePart slidePart, bool isLayOut)
  290. {
  291. if (element is DocumentFormat.OpenXml.Presentation.Picture pic)//p:pic 图片
  292. {
  293. list.Add(ProcessPicNode(pic, idPartPairs, slideMaster, colorMaps, index, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme));
  294. }
  295. else if (element is DocumentFormat.OpenXml.AlternateContent mc)//mc:alternatecontent 公式等
  296. {
  297. list.Add(ProcessMcNode(mc, idPartPairs, slideMaster, colorMaps, index, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme));
  298. }
  299. else if (element is DocumentFormat.OpenXml.Presentation.GraphicFrame graphicFrame)//p:graphicFrame Chart, Diagram, Table
  300. {
  301. list.Add(ProcessGraphicFrameNode(graphicFrame, idPartPairs, slideMaster, colorMaps, index, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme));
  302. }
  303. else if (element is DocumentFormat.OpenXml.Presentation.GroupShape grpSp)//p:grpSp 组合图形
  304. {
  305. ProcessGrpSpNode(list, grpSp, idPartPairs, slideMaster, colorMaps, index, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme, slidePart);
  306. }
  307. else if (element is DocumentFormat.OpenXml.Presentation.ConnectionShape cxnSp) // p:cxnSp 连接线
  308. {
  309. list.Add(ProcessCxnSpNode(cxnSp, idPartPairs, slideMaster, colorMaps, index, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme));
  310. }
  311. else if (element is DocumentFormat.OpenXml.Presentation.Shape sp)//p:sp 形状
  312. {
  313. if (isLayOut)
  314. {
  315. XmlDocument doc = new XmlDocument();
  316. doc.LoadXml(element.OuterXml);
  317. XmlNode userDrawnNode = doc.SelectSingleNode("//p:nvPr//@userDrawn", PowerPointHelper.GetXmlnsManager(doc.NameTable));
  318. //处理模板中有无背编辑过的元素
  319. if (userDrawnNode != null && userDrawnNode.Value.Equals("1"))
  320. {
  321. list.Add(ProcessSpNode(sp, idPartPairs, slideMaster, colorMaps, index, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme, slidePart));
  322. }
  323. }
  324. else
  325. {
  326. list.Add(ProcessSpNode(sp, idPartPairs, slideMaster, colorMaps, index, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme, slidePart));
  327. }
  328. }
  329. }
  330. /// <summary>
  331. /// 处理Shape的样式 位置信息
  332. /// </summary>
  333. /// <param name="element"></param>
  334. /// <param name="slidePart"></param>
  335. /// <param name="slideMaster"></param>
  336. /// <param name="colors"></param>
  337. /// <param name="index"></param>
  338. /// <param name="position"></param>
  339. /// <param name="slideLayoutTables"></param>
  340. /// <param name="slideMasterTables"></param>
  341. /// <returns></returns>
  342. public HiTeachCC.Model.PowerPoint.Shape ProcessSpNode(DocumentFormat.OpenXml.Presentation.Shape element, IEnumerable<IdPartPair> idPartPairs, SlideMaster slideMaster,
  343. Dictionary<string, string> colors, int index,
  344. //HiTeachCC.Model.PowerPoint.Position position,
  345. Style slideLayoutTables,
  346. Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme, SlidePart slidePart)
  347. {
  348. XmlDocument doc = new XmlDocument();
  349. doc.LoadXml(element.OuterXml);
  350. //获取当前节点的相关样式属性
  351. XmlNode idNode = doc.SelectSingleNode("//p:nvSpPr/p:cNvPr/@id", PowerPointHelper.GetXmlnsManager(doc.NameTable));
  352. XmlNode nameNode = doc.SelectSingleNode("//p:nvSpPr/p:cNvPr/@name", PowerPointHelper.GetXmlnsManager(doc.NameTable));
  353. XmlNode idxNode = doc.SelectSingleNode("//p:nvSpPr/p:nvPr/p:ph/@idx", PowerPointHelper.GetXmlnsManager(doc.NameTable));
  354. XmlNode typeNode = doc.SelectSingleNode("//p:nvSpPr/p:nvPr/p:ph/@type", PowerPointHelper.GetXmlnsManager(doc.NameTable));
  355. XmlDocument slideLayoutSpNode = null;
  356. XmlDocument slideMasterSpNode = null;
  357. if (typeNode != null)
  358. {
  359. // 检查 slideLayoutSpNode slideMasterSpNode 为空时产生的位置 横竖排版 空指针问题
  360. //slideLayoutSpNode = slideLayoutTables.TypeTable;
  361. //slideMasterSpNode = slideMasterTables.TypeTable;
  362. doc.LoadXml(slideLayoutTables.TypeTable.OuterXml);
  363. XmlNodeList types = doc.SelectNodes("//xmlDatas/xmlData", PowerPointHelper.GetXmlnsManager(doc.NameTable));
  364. if (types != null)
  365. {
  366. int size = types.Count;
  367. for (int i = 0; i < size; i++)
  368. {
  369. XmlNode node = types.Item(i);
  370. doc.LoadXml(node.OuterXml);
  371. XmlNode id = doc.SelectSingleNode("./xmlData/@id", PowerPointHelper.GetXmlnsManager(doc.NameTable));
  372. if (id.Value.Equals(typeNode.Value))
  373. {
  374. XmlDocument nodeDoc = new XmlDocument();
  375. nodeDoc.LoadXml(types.Item(i).OuterXml);
  376. slideLayoutSpNode = nodeDoc;
  377. break;
  378. }
  379. }
  380. }
  381. doc.LoadXml(slideMasterTables.TypeTable.OuterXml);
  382. types = doc.SelectNodes("//xmlDatas/xmlData", PowerPointHelper.GetXmlnsManager(doc.NameTable));
  383. if (types != null)
  384. {
  385. int size = types.Count;
  386. for (int i = 0; i < size; i++)
  387. {
  388. XmlNode node = types.Item(i);
  389. doc.LoadXml(node.OuterXml);
  390. XmlNode id = doc.SelectSingleNode("./xmlData/@id", PowerPointHelper.GetXmlnsManager(doc.NameTable));
  391. if (id.Value.Equals(typeNode.Value))
  392. {
  393. XmlDocument nodeDoc = new XmlDocument();
  394. nodeDoc.LoadXml(types.Item(i).OuterXml);
  395. slideMasterSpNode = nodeDoc;
  396. break;
  397. }
  398. }
  399. }
  400. }
  401. else
  402. {
  403. if (idxNode != null)
  404. {
  405. //slideLayoutSpNode = slideLayoutTables.IdxTable;
  406. //slideMasterSpNode = slideMasterTables.IdxTable;
  407. doc.LoadXml(slideLayoutTables.IdxTable.OuterXml);
  408. XmlNodeList types = doc.SelectNodes("//xmlDatas/xmlData", PowerPointHelper.GetXmlnsManager(doc.NameTable));
  409. if (types != null)
  410. {
  411. int size = types.Count;
  412. for (int i = 0; i < size; i++)
  413. {
  414. XmlNode node = types.Item(i);
  415. doc.LoadXml(node.OuterXml);
  416. XmlNode id = doc.SelectSingleNode("./xmlData/@id", PowerPointHelper.GetXmlnsManager(doc.NameTable));
  417. if (id.Value.Equals(idxNode.Value))
  418. {
  419. XmlDocument nodeDoc = new XmlDocument();
  420. nodeDoc.LoadXml(types.Item(i).OuterXml);
  421. slideLayoutSpNode = nodeDoc;
  422. break;
  423. }
  424. }
  425. }
  426. doc.LoadXml(slideMasterTables.IdxTable.OuterXml);
  427. types = doc.SelectNodes("//xmlDatas/xmlData", PowerPointHelper.GetXmlnsManager(doc.NameTable));
  428. if (types != null)
  429. {
  430. int size = types.Count;
  431. for (int i = 0; i < size; i++)
  432. {
  433. XmlNode node = types.Item(i);
  434. doc.LoadXml(node.OuterXml);
  435. XmlNode id = doc.SelectSingleNode("./xmlData/@id", PowerPointHelper.GetXmlnsManager(doc.NameTable));
  436. if (id.Value.Equals(idxNode.Value))
  437. {
  438. XmlDocument nodeDoc = new XmlDocument();
  439. nodeDoc.LoadXml(types.Item(i).OuterXml);
  440. slideMasterSpNode = nodeDoc;
  441. break;
  442. }
  443. }
  444. }
  445. }
  446. }
  447. if (typeNode == null)
  448. {
  449. if (slideLayoutSpNode != null)
  450. {
  451. typeNode = slideLayoutSpNode.SelectSingleNode("//p:nvSpPr/p:nvPr/p:ph/@type", PowerPointHelper.GetXmlnsManager(slideLayoutSpNode.NameTable));
  452. }
  453. //getTextByPathList(slideLayoutSpNode, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "type"]);
  454. if (typeNode == null)
  455. {
  456. if (slideMasterSpNode != null)
  457. {
  458. typeNode = slideMasterSpNode.SelectSingleNode("//p:nvSpPr/p:nvPr/p:ph/@type", PowerPointHelper.GetXmlnsManager(slideMasterSpNode.NameTable));
  459. }
  460. // typeNode = getTextByPathList(slideMasterSpNode, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "type"]);
  461. }
  462. }
  463. HiTeachCC.Model.PowerPoint.Shape s = GenShape(element, idPartPairs, slideMaster, colors, index, slideLayoutTables,
  464. slideMasterTables, idNode, nameNode, idxNode, typeNode, slideLayoutSpNode, slideMasterSpNode, slideMasterTextStyles, theme, slidePart);
  465. return s;
  466. }
  467. /// <summary>
  468. /// 处理图形的具体信息
  469. /// </summary>
  470. /// <param name="element"></param>
  471. /// <param name="slidePart"></param>
  472. /// <param name="slideMaster"></param>
  473. /// <param name="colors"></param>
  474. /// <param name="index"></param>
  475. /// <param name="position"></param>
  476. /// <param name="slideLayoutTables"></param>
  477. /// <param name="slideMasterTables"></param>
  478. /// <param name="idNode"></param>
  479. /// <param name="nameNode"></param>
  480. /// <param name="idxNode"></param>
  481. /// <param name="typeNode"></param>
  482. /// <param name="slideLayoutSpNode"></param>
  483. /// <param name="slideMasterSpNode"></param>
  484. /// <returns></returns>
  485. public HiTeachCC.Model.PowerPoint.Shape GenShape(DocumentFormat.OpenXml.Presentation.Shape element, IEnumerable<IdPartPair> idPartPairs, SlideMaster slideMaster,
  486. Dictionary<string, string> colors, int index,
  487. //HiTeachCC.Model.PowerPoint.Position position,
  488. Style slideLayoutTables,
  489. Style slideMasterTables, XmlNode idNode, XmlNode nameNode, XmlNode idxNode, XmlNode typeNode,
  490. XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode, XmlDocument slideMasterTextStyles, Theme theme, SlidePart slidePart)
  491. {
  492. HiTeachCC.Model.PowerPoint.Shape shape = new HiTeachCC.Model.PowerPoint.Shape();
  493. HiTeachCC.Model.PowerPoint.Position spPosition = null;
  494. if (element.ShapeProperties != null)
  495. {
  496. Transform2D transform2D = element.ShapeProperties.Transform2D;
  497. if (transform2D != null)
  498. {
  499. spPosition = PowerPointHelper.GetPositionByTransform2D(transform2D);
  500. }
  501. }
  502. DocumentFormat.OpenXml.Presentation.NonVisualShapeProperties nonVisualShapeProperties = element.NonVisualShapeProperties;
  503. XmlDocument doc = new XmlDocument();
  504. doc.LoadXml(element.OuterXml);
  505. XmlNode shapeType = doc.SelectSingleNode("//p:spPr/a:prstGeom/@prst", PowerPointHelper.GetXmlnsManager(doc.NameTable));
  506. if (shapeType != null)
  507. {
  508. //常规图形
  509. HiTeachCC.Model.PowerPoint.Position shapePosition = PowerPointHelper.GetPosition(element.OuterXml, slideLayoutSpNode, slideMasterSpNode);
  510. Border border = PowerPointHelper.GetBorder(element.OuterXml, false, colors);
  511. HiTeachCC.Model.PowerPoint.Fill fill = PowerPointHelper.GetShapeFill(element.OuterXml, colors);
  512. //var headEndTypeNode = doc.SelectSingleNode("//p:spPr/a:ln/a:headEnd/@type", PowerPointHelper.GetXmlnsManager(doc.NameTable));
  513. // var tailEndTypeNode = doc.SelectSingleNode("//p:spPr/a:ln/a:tailEnd/@type", PowerPointHelper.GetXmlnsManager(doc.NameTable));
  514. PowerPointHelper.GenPPTXShape(shapeType);
  515. // shapePosition.Index = index;
  516. shape.Position = shapePosition;
  517. shape.Paragraph = GenTextBody(element.OuterXml, slideLayoutSpNode, slideMasterSpNode, typeNode, slideLayoutTables, slideMasterTables, slideMasterTextStyles, theme, idPartPairs, colors, slidePart);
  518. shape.Fill = fill;
  519. shape.Border = border;
  520. shape.Type = "Sp";
  521. shape.ShapeType = shapeType.Value;
  522. shape.Index = index++;
  523. // shape.VertAlign = PowerPointHelper.GetVerticalAlign(element, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles);
  524. XmlNode avLstNode = doc.SelectSingleNode("//p:spPr/a:prstGeom/a:avLst", PowerPointHelper.GetXmlnsManager(doc.NameTable));
  525. shape.ShapeGuides = GenShapeGuide(avLstNode);
  526. return shape;
  527. }
  528. else
  529. {
  530. shapeType = doc.SelectSingleNode("//p:spPr/a:custGeom", PowerPointHelper.GetXmlnsManager(doc.NameTable));
  531. if (shapeType != null)
  532. {
  533. //自定义图形 画线 轨迹
  534. //常规图形
  535. HiTeachCC.Model.PowerPoint.Position shapePosition = PowerPointHelper.GetPosition(element.OuterXml, slideLayoutSpNode, slideMasterSpNode);
  536. Border border = PowerPointHelper.GetBorder(element.OuterXml, false, colors);
  537. HiTeachCC.Model.PowerPoint.Fill fill = PowerPointHelper.GetShapeFill(element.OuterXml, colors);
  538. var headEndTypeNode = doc.SelectSingleNode("//p:spPr/a:ln/a:headEnd/@type", PowerPointHelper.GetXmlnsManager(doc.NameTable));
  539. var tailEndTypeNode = doc.SelectSingleNode("//p:spPr/a:ln/a:tailEnd/@type", PowerPointHelper.GetXmlnsManager(doc.NameTable));
  540. PowerPointHelper.GenPPTXShape(shapeType);
  541. shape.Position = shapePosition;
  542. shape.Paragraph = GenTextBody(element.OuterXml, slideLayoutSpNode, slideMasterSpNode, typeNode,
  543. slideLayoutTables, slideMasterTables, slideMasterTextStyles, theme, idPartPairs, colors, slidePart);
  544. shape.Fill = fill;
  545. shape.Border = border;
  546. shape.Type = "Sp";
  547. shape.ShapeType = "custom";
  548. shape.Index = index++;
  549. //shape.VertAlign = PowerPointHelper.GetVerticalAlign(element, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles);
  550. var pathNode = doc.SelectSingleNode("//p:spPr/a:custGeom/a:pathLst/a:path", PowerPointHelper.GetXmlnsManager(doc.NameTable));
  551. shape.Paths = GenPath(pathNode.OuterXml);
  552. return shape;
  553. }
  554. else
  555. {
  556. // string align = PowerPointHelper.GetVerticalAlign(element, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles);
  557. HiTeachCC.Model.PowerPoint.Position shapePosition = PowerPointHelper.GetPosition(element.OuterXml, slideLayoutSpNode, slideMasterSpNode);
  558. Border border = PowerPointHelper.GetBorder(element.OuterXml, false, colors);
  559. HiTeachCC.Model.PowerPoint.Fill fill = PowerPointHelper.GetShapeFill(element.OuterXml, colors);
  560. shape.Position = shapePosition;
  561. shape.Paragraph = GenTextBody(element.OuterXml, slideLayoutSpNode, slideMasterSpNode, typeNode,
  562. slideLayoutTables, slideMasterTables, slideMasterTextStyles, theme, idPartPairs, colors, slidePart);
  563. shape.Fill = fill;
  564. shape.Border = border;
  565. shape.Type = "Sp";
  566. shape.ShapeType = "rect";
  567. shape.Index = index++;
  568. // shape.VertAlign = PowerPointHelper.GetVerticalAlign(element, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles);
  569. return shape;
  570. }
  571. }
  572. //return null;
  573. }
  574. public List<HiTeachCC.Model.PowerPoint.ShapeGuide> GenShapeGuide(XmlNode avLstNode)
  575. {
  576. if (avLstNode != null)
  577. {
  578. AdjustValueList adjustValueList = new AdjustValueList(avLstNode.OuterXml);
  579. List<HiTeachCC.Model.PowerPoint.ShapeGuide> ShapeGuides = new List<Model.PowerPoint.ShapeGuide>();
  580. var elements = adjustValueList.ChildElements;
  581. foreach (var xmlElement in elements)
  582. {
  583. if (xmlElement is DocumentFormat.OpenXml.Drawing.ShapeGuide shapeGuide)
  584. {
  585. HiTeachCC.Model.PowerPoint.ShapeGuide ShapeGuide = new HiTeachCC.Model.PowerPoint.ShapeGuide { Name = shapeGuide.Name, Fmla = shapeGuide.Formula };
  586. ShapeGuides.Add(ShapeGuide);
  587. }
  588. }
  589. return ShapeGuides;
  590. }
  591. return null;
  592. }
  593. public List<HiTeachCC.Model.PowerPoint.Path> GenPath(string nodeXml)
  594. {
  595. DocumentFormat.OpenXml.Drawing.Path path = new DocumentFormat.OpenXml.Drawing.Path(nodeXml);
  596. OpenXmlElementList elements = path.ChildElements;
  597. List<HiTeachCC.Model.PowerPoint.Path> Paths = new List<Model.PowerPoint.Path>();
  598. foreach (OpenXmlElement xmlElement in elements)
  599. {
  600. //起点
  601. if (xmlElement is DocumentFormat.OpenXml.Drawing.MoveTo moveTo)
  602. {
  603. DocumentFormat.OpenXml.Drawing.Point point = moveTo.Point;
  604. MoveToPath moveToPath = new MoveToPath { Type = "MoveTo" };
  605. moveToPath.Pts.Add(new Point { X = double.Parse(point.X) * inchpixel / pxBase, Y = double.Parse(point.Y) * inchpixel / pxBase });
  606. Paths.Add(moveToPath);
  607. }
  608. //连线
  609. if (xmlElement is DocumentFormat.OpenXml.Drawing.LineTo linTo)
  610. {
  611. DocumentFormat.OpenXml.Drawing.Point point = linTo.Point;
  612. LineToPath lineToPath = new LineToPath { Type = "LineTo" };
  613. lineToPath.Pts.Add(new Point { X = double.Parse(point.X) * inchpixel / pxBase, Y = double.Parse(point.Y) * inchpixel / pxBase });
  614. Paths.Add(lineToPath);
  615. }
  616. //三次贝塞尔曲线
  617. if (xmlElement is DocumentFormat.OpenXml.Drawing.CubicBezierCurveTo cubicBezierCurveTo)
  618. {
  619. OpenXmlElementList list = cubicBezierCurveTo.ChildElements;
  620. CubicBezPath cubicBezPath = new CubicBezPath { Type = "CubicBez" };
  621. foreach (var ls in list)
  622. {
  623. if (ls is DocumentFormat.OpenXml.Drawing.Point point)
  624. {
  625. cubicBezPath.Pts.Add(new Point { X = double.Parse(point.X) * inchpixel / pxBase, Y = double.Parse(point.Y) * inchpixel / pxBase });
  626. }
  627. }
  628. Paths.Add(cubicBezPath);
  629. }
  630. //二次贝塞尔曲线
  631. if (xmlElement is DocumentFormat.OpenXml.Drawing.QuadraticBezierCurveTo quadraticBezierCurveTo)
  632. {
  633. OpenXmlElementList list = quadraticBezierCurveTo.ChildElements;
  634. QuadBezPath quadBezPath = new QuadBezPath { Type = "QuadBez" };
  635. foreach (var ls in list)
  636. {
  637. if (ls is DocumentFormat.OpenXml.Drawing.Point point)
  638. {
  639. quadBezPath.Pts.Add(new Point { X = double.Parse(point.X) * inchpixel / pxBase, Y = double.Parse(point.Y) * inchpixel / pxBase });
  640. }
  641. }
  642. Paths.Add(quadBezPath);
  643. }
  644. //处理曲线
  645. if (xmlElement is DocumentFormat.OpenXml.Drawing.ArcTo arcTO)
  646. {
  647. ArcToPath arcToPath = new ArcToPath() { WidthRadius = arcTO.WidthRadius, HeightRadius = arcTO.HeightRadius, StartAngle = arcTO.StartAngle, SwingAngle = arcTO.SwingAngle };
  648. Paths.Add(arcToPath);
  649. }
  650. ///判断路径是否闭合
  651. if (xmlElement is DocumentFormat.OpenXml.Drawing.CloseShapePath close)
  652. {
  653. if (close != null)
  654. {
  655. ClosePath closePath = new ClosePath { Type = "Close" };
  656. closePath.Close = true;
  657. Paths.Add(closePath);
  658. }
  659. }
  660. }
  661. return Paths;
  662. }
  663. public List<Paragraph> GenTextBody(string nodeXml, XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode,
  664. XmlNode typeNode, Style slideLayoutTables,
  665. Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme, IEnumerable<IdPartPair> idPartPairs, Dictionary<string, string> colors, SlidePart slidePart)
  666. {
  667. List<Paragraph> paragraphs = new List<Paragraph>();
  668. XmlDocument doc = new XmlDocument();
  669. doc.LoadXml(nodeXml);
  670. XmlNodeList pNodes = doc.SelectNodes("//p:txBody/child::* ", PowerPointHelper.GetXmlnsManager(doc.NameTable));
  671. XmlNodeList plvlNodes = doc.SelectNodes("//p:txBody/a:p/a:pPr/@lvl", PowerPointHelper.GetXmlnsManager(doc.NameTable));
  672. bool hasBuChar = false;
  673. if (plvlNodes != null && plvlNodes.Count > 0)
  674. {
  675. hasBuChar = true;
  676. }
  677. if (pNodes != null)
  678. {
  679. int size = pNodes.Count;
  680. for (int i = 0; i < size; i++)
  681. {
  682. XmlNode pNode = pNodes.Item(i);
  683. if (!pNode.Name.Equals("a:p"))
  684. {
  685. continue;
  686. }
  687. XmlDocument pXmlNode = new XmlDocument();
  688. pXmlNode.LoadXml(pNode.OuterXml);
  689. //XmlDocument docNode = new XmlDocument();
  690. //docNode.LoadXml(pNode.OuterXml);
  691. string HorizontalAlign = PowerPointHelper.GetHorizontalAlign(pXmlNode, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles);
  692. string VerticalAlign = PowerPointHelper.GetVerticalAlign(nodeXml, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles);
  693. Paragraph paragraph = new Paragraph();
  694. ParagraphStyle paragraphStyle = new ParagraphStyle { HoriAlign = HorizontalAlign, VertAlign = VerticalAlign };
  695. XmlNodeList pPrNodes = pXmlNode.SelectNodes("//a:pPr", PowerPointHelper.GetXmlnsManager(pXmlNode.NameTable));
  696. BuChar buChar = PowerPointHelper.GenBuChar(pXmlNode, slideLayoutTables, slideMasterTables, slideMasterTextStyles, typeNode, hasBuChar);
  697. paragraph.BuChar = buChar;
  698. paragraph.ParagraphStyle = paragraphStyle;
  699. XmlNodeList rNodes = pXmlNode.SelectNodes("//a:r", PowerPointHelper.GetXmlnsManager(pXmlNode.NameTable));
  700. if (null == rNodes)
  701. {
  702. XmlDocument rNode = new XmlDocument();
  703. rNode.LoadXml(pNode.OuterXml);
  704. paragraph.Texts.Add(GenSpanElement(rNode, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles, theme, idPartPairs, colors, buChar, slidePart));
  705. }
  706. else
  707. {
  708. int rsize = rNodes.Count;
  709. for (int ri = 0; ri < rsize; ri++)
  710. {
  711. XmlDocument rNode = new XmlDocument();
  712. rNode.LoadXml(rNodes.Item(ri).OuterXml);
  713. paragraph.Texts.Add(GenSpanElement(rNode, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles, theme, idPartPairs, colors, buChar, slidePart));
  714. }
  715. }
  716. paragraphs.Add(paragraph);
  717. }
  718. }
  719. return paragraphs;
  720. }
  721. public Text GenSpanElement(XmlDocument nodeXml, XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode, XmlNode typeNode,
  722. XmlDocument slideMasterTextStyles, Theme theme, IEnumerable<IdPartPair> idPartPairs, Dictionary<string, string> colors, BuChar buChar, SlidePart slidePart)
  723. {
  724. XmlNode tNode = nodeXml.SelectSingleNode("//a:t", PowerPointHelper.GetXmlnsManager(nodeXml.NameTable));
  725. /*
  726. var text = node["a:t"];
  727. if (typeof text !== 'string') {
  728. text = getTextByPathList(node, ["a:fld", "a:t"]);
  729. if (typeof text !== 'string') {
  730. text = "&nbsp;";
  731. //debug("XXX: " + JSON.stringify(node));
  732. }
  733. }
  734. */
  735. string color = PowerPointHelper.GetFontColor(nodeXml, typeNode, slideMasterTextStyles, colors);
  736. int font_size = PowerPointHelper.GetFontSize(nodeXml, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles);
  737. if (font_size == 0 && buChar != null)
  738. {
  739. font_size = buChar.FontSize;
  740. }
  741. string font_family = PowerPointHelper.GetFontType(nodeXml, typeNode, slideMasterTextStyles, theme);
  742. string font_weight = PowerPointHelper.GetFontBold(nodeXml, typeNode, slideMasterTextStyles);
  743. string font_style = PowerPointHelper.GetFontItalic(nodeXml, typeNode, slideMasterTextStyles);
  744. string text_decoration = PowerPointHelper.GetFontDecoration(nodeXml, typeNode, slideMasterTextStyles);
  745. string vertical_align = PowerPointHelper.GetTextVerticalAlign(nodeXml, typeNode, slideMasterTextStyles);
  746. FontStyle fontStyle = new FontStyle
  747. {
  748. Color = color,
  749. Size = font_size,
  750. Type = font_family,
  751. Bold = font_weight,
  752. Italic = font_style,
  753. Decoration = text_decoration,
  754. VertAlign = vertical_align
  755. };
  756. string styleText = "color:" + color + ";font-size:" + font_size +
  757. ";font-family:" + font_family + ";font-weight:" + font_weight +
  758. ";font-style:" + font_style + ";text-decoration:" + text_decoration +
  759. ";vertical-align:" + vertical_align;
  760. string cssName = "";
  761. if (styleTable.TryGetValue(styleText, out Dictionary<string, string> css))
  762. {
  763. cssName = css["name"];
  764. }
  765. else
  766. {
  767. cssName = "_css_" + (styleTable.Keys.Count + 1);
  768. styleTable.TryAdd(styleText, new Dictionary<string, string> { { "name", cssName }, { "text", styleText } });
  769. }
  770. Text text = new Text { Content = tNode.InnerText, FontStyle = fontStyle };
  771. XmlNode linkID = nodeXml.SelectSingleNode("//a:rPr/a:hlinkClick/@r:id", PowerPointHelper.GetXmlnsManager(nodeXml.NameTable));
  772. if (linkID != null)
  773. {
  774. List<DocumentFormat.OpenXml.Packaging.HyperlinkRelationship> hyperlinkRelationships = slidePart.HyperlinkRelationships.ToList();
  775. bool flag = true;
  776. foreach (var HyperlinkRelationship in hyperlinkRelationships)
  777. {
  778. if (HyperlinkRelationship.Id.Equals(linkID.Value))
  779. {
  780. text.Href = HyperlinkRelationship.Uri.ToString();
  781. flag = false;
  782. break;
  783. }
  784. }
  785. if (flag)
  786. {
  787. text.Href = "#";
  788. }
  789. }
  790. else
  791. {
  792. text.Href = null;
  793. }
  794. return text;
  795. }
  796. /// <summary>
  797. /// 处理图片
  798. /// </summary>
  799. /// <param name="element"></param>
  800. /// <param name="slidePart"></param>
  801. /// <param name="slideMaster"></param>
  802. /// <param name="colors"></param>
  803. /// <param name="index"></param>
  804. /// <param name="position"></param>
  805. /// <param name="slideLayoutTables"></param>
  806. /// <param name="slideMasterTables"></param>
  807. /// <returns></returns>
  808. public Model.PowerPoint.Picture ProcessPicNode(DocumentFormat.OpenXml.Presentation.Picture element,
  809. IEnumerable<IdPartPair> idPartPairs, SlideMaster slideMaster, Dictionary<string, string> colors, int index,
  810. Style slideLayoutTables,
  811. Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme)
  812. {
  813. HiTeachCC.Model.PowerPoint.Position picPosition = PowerPointHelper.GetPosition(element.OuterXml, null, null);
  814. //picPosition.Index = index;
  815. BlipFill blipFill = element.BlipFill;
  816. var imageRid = blipFill.Blip.Embed.Value;
  817. IdPartPair idParie = idPartPairs.Where(x => x.RelationshipId == imageRid).FirstOrDefault();
  818. ImagePart imagePart = (ImagePart)idParie.OpenXmlPart;
  819. var contentType = imagePart.ContentType;
  820. string base64 = "";
  821. using (var stream = imagePart.GetStream())
  822. {
  823. byte[] buffer = new byte[stream.Length];
  824. stream.Read(buffer, 0, buffer.Length);
  825. stream.Close();
  826. base64 = System.Convert.ToBase64String(buffer);
  827. base64 = "data:" + contentType + ";base64," + base64;
  828. }
  829. Border border = PowerPointHelper.GetBorder(element.OuterXml, false, colors);
  830. Model.PowerPoint.Fill fill = PowerPointHelper.GetShapeFill(element.OuterXml, colors);
  831. Model.PowerPoint.Picture picture = new Model.PowerPoint.Picture
  832. {
  833. Type = "Pic",
  834. Position = picPosition,
  835. Base64 = base64,
  836. Fill = fill,
  837. Border = border
  838. };
  839. picture.Index = index++;
  840. return picture;
  841. }
  842. /// <summary>
  843. /// 处理包含公式等的信息
  844. /// </summary>
  845. /// <param name="element"></param>
  846. /// <param name="slidePart"></param>
  847. /// <param name="slideMaster"></param>
  848. /// <param name="colors"></param>
  849. /// <param name="index"></param>
  850. /// <param name="position"></param>
  851. /// <param name="slideLayoutTables"></param>
  852. /// <param name="slideMasterTables"></param>
  853. /// <returns></returns>
  854. public Model.PowerPoint.Picture ProcessMcNode(DocumentFormat.OpenXml.AlternateContent element, IEnumerable<IdPartPair> slidePart,
  855. SlideMaster slideMaster, Dictionary<string, string> colors,
  856. int index,
  857. Style slideLayoutTables,
  858. Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme)
  859. {
  860. var choices = from contentChoice in element.Descendants<AlternateContentChoice>() select contentChoice;
  861. if (choices.Count() > 0)
  862. {
  863. OpenXmlElement celement = choices.First().ChildElements.First();
  864. if (celement != null)
  865. {
  866. if (celement is DocumentFormat.OpenXml.Presentation.Shape shape)
  867. {
  868. var textMaths = from shap in shape.Descendants<TextMath>() select shap;
  869. if (textMaths.Count() > 0)
  870. {
  871. // return MathConvertMathML(shape, theme, colorMap, index);
  872. return MathConvertImage(element, theme, colors, slidePart, index);
  873. }
  874. }
  875. }
  876. }
  877. return null;
  878. }
  879. public Model.PowerPoint.Picture MathConvertImage(AlternateContent content, Theme theme, Dictionary<string, string> colors, IEnumerable<IdPartPair> slidePart, int index)
  880. {
  881. var fallbacks = from contentChoice in content.Descendants<AlternateContentFallback>() select contentChoice;
  882. if (fallbacks.Count() > 0)
  883. {
  884. OpenXmlElement xmlElement = fallbacks.First().ChildElements.First();
  885. if (xmlElement != null)
  886. {
  887. if (xmlElement is DocumentFormat.OpenXml.Presentation.Shape shape)
  888. {
  889. var blipFills = from pic in shape.Descendants<DocumentFormat.OpenXml.Drawing.BlipFill>() select pic;
  890. if (blipFills.Count() > 0)
  891. {
  892. var imageRid = blipFills.First().Blip.Embed.Value;
  893. IdPartPair idParie = slidePart.Where(x => x.RelationshipId == imageRid).FirstOrDefault();
  894. ImagePart imagePart = (ImagePart)idParie.OpenXmlPart;
  895. var contentType = imagePart.ContentType;
  896. string base64 = "";
  897. using (var stream = imagePart.GetStream())
  898. {
  899. byte[] buffer = new byte[stream.Length];
  900. stream.Read(buffer, 0, buffer.Length);
  901. stream.Close();
  902. base64 = System.Convert.ToBase64String(buffer);
  903. base64 = "data:" + contentType + ";base64," + base64;
  904. }
  905. Model.PowerPoint.Position picPosition = PowerPointHelper.GetPosition(shape.OuterXml, null, null);
  906. Border border = PowerPointHelper.GetBorder(shape.OuterXml, false, colors);
  907. Model.PowerPoint.Fill fill = PowerPointHelper.GetShapeFill(shape.OuterXml, colors);
  908. // picPosition.Index = index;
  909. Model.PowerPoint.Picture picture = new Model.PowerPoint.Picture
  910. {
  911. Type = "Math",
  912. Position = picPosition,
  913. Base64 = base64,
  914. Fill = fill,
  915. Border = border
  916. };
  917. picture.Index = index++;
  918. return picture;
  919. }
  920. }
  921. }
  922. }
  923. return null;
  924. }
  925. /// <summary>
  926. /// 处理复杂图形的
  927. /// </summary>
  928. /// <param name="element"></param>
  929. /// <param name="slidePart"></param>
  930. /// <param name="slideMaster"></param>
  931. /// <param name="colors"></param>
  932. /// <param name="index"></param>
  933. /// <param name="position"></param>
  934. /// <param name="slideLayoutTables"></param>
  935. /// <param name="slideMasterTables"></param>
  936. /// <returns></returns>
  937. public Item ProcessGraphicFrameNode(DocumentFormat.OpenXml.Presentation.GraphicFrame graphicFrame,
  938. IEnumerable<IdPartPair> slidePart, SlideMaster slideMaster, Dictionary<string, string> colors,
  939. int index,
  940. Style slideLayoutTables,
  941. Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme)
  942. {
  943. DocumentFormat.OpenXml.Drawing.GraphicData graphicData = graphicFrame.ChildElements.First<DocumentFormat.OpenXml.Drawing.GraphicData>();
  944. if (graphicData != null)
  945. {
  946. OpenXmlElement element = graphicData.ChildElements.First();
  947. if (element != null)
  948. {
  949. if (element is DocumentFormat.OpenXml.Drawing.Table table)
  950. {
  951. TableConvert(table, theme, colors);
  952. }
  953. if (element is DocumentFormat.OpenXml.Drawing.Chart chart)
  954. {
  955. //return ChartConvert(graphicFrame, theme, colorMap);
  956. }
  957. if (element is DocumentFormat.OpenXml.Drawing.Diagram diagram)
  958. {
  959. //return DiagramConvert(graphicFrame, theme, colorMap);
  960. }
  961. }
  962. }
  963. return null;
  964. }
  965. public void TableConvert(DocumentFormat.OpenXml.Drawing.Table table, Theme theme, Dictionary<string, string> colors)
  966. {
  967. int s =
  968. 0;
  969. }
  970. /// <summary>
  971. /// 处理组合图形
  972. /// </summary>
  973. /// <param name="element"></param>
  974. /// <param name="slidePart"></param>
  975. /// <param name="slideMaster"></param>
  976. /// <param name="colors"></param>
  977. /// <param name="index"></param>
  978. /// <param name="position"></param>
  979. /// <param name="slideLayoutTables"></param>
  980. /// <param name="slideMasterTables"></param>
  981. /// <returns></returns>
  982. public void ProcessGrpSpNode(List<Item> list, DocumentFormat.OpenXml.Presentation.GroupShape element, IEnumerable<IdPartPair> idPartPairs,
  983. SlideMaster slideMaster, Dictionary<string, string> colors, int index,
  984. //HiTeachCC.Model.PowerPoint.Position position,
  985. Style slideLayoutTables,
  986. Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme, SlidePart slidePart)
  987. {
  988. var shapes = from shap in element.Descendants<DocumentFormat.OpenXml.Presentation.Shape>() select shap;
  989. HiTeachCC.Model.PowerPoint.Position position = new HiTeachCC.Model.PowerPoint.Position();
  990. TransformGroup transformGroup = element.GroupShapeProperties.TransformGroup;
  991. position.Rot = transformGroup.Rotation == null ? 0 : transformGroup.Rotation.Value;
  992. position.FlipH = transformGroup.HorizontalFlip == null ? 0 : transformGroup.HorizontalFlip.Value == true ? 1 : 0;
  993. position.FlipV = transformGroup.VerticalFlip == null ? 0 : transformGroup.VerticalFlip.Value == true ? 1 : 0;
  994. position.X = transformGroup.Offset.X == null ? 0 : transformGroup.Offset.X.Value;
  995. position.Y = transformGroup.Offset.Y == null ? 0 : transformGroup.Offset.Y.Value;
  996. position.Cx = transformGroup.Extents.Cx == null ? 0 : transformGroup.Extents.Cx.Value;
  997. position.Cy = transformGroup.Extents.Cy == null ? 0 : transformGroup.Extents.Cy.Value;
  998. long ChX = transformGroup.ChildOffset.X == null ? 0 : transformGroup.ChildOffset.X.Value;
  999. long ChY = transformGroup.ChildOffset.Y == null ? 0 : transformGroup.ChildOffset.Y.Value;
  1000. long ChCX = transformGroup.ChildExtents.Cx == null ? 0 : transformGroup.ChildExtents.Cx.Value;
  1001. long ChCY = transformGroup.ChildExtents.Cy == null ? 0 : transformGroup.ChildExtents.Cy.Value;
  1002. position.X = position.X - ChX;
  1003. position.Y = position.Y - ChY;
  1004. position.Cx = position.Cx - ChCX;
  1005. position.Cy = position.Cy - ChCY;
  1006. Group group = new Group();
  1007. group.Position = position;
  1008. group.Type = "Group";
  1009. group.Index = index++;
  1010. List<Item> items = new List<Item>();
  1011. foreach (var shape in shapes)
  1012. {
  1013. ProcessNodesInSlide(items, shape, idPartPairs, slideMaster, colors, index, slideLayoutTables, slideMasterTables, slideMasterTextStyles, theme, slidePart, false);
  1014. }
  1015. group.Shapes = items;
  1016. list.Add(group);
  1017. //return list;
  1018. }
  1019. /// <summary>
  1020. /// 处理连接线的信息
  1021. /// </summary>
  1022. /// <param name="element"></param>
  1023. /// <param name="slidePart"></param>
  1024. /// <param name="slideMaster"></param>
  1025. /// <param name="colors"></param>
  1026. /// <param name="index"></param>
  1027. /// <param name="position"></param>
  1028. /// <param name="slideLayoutTables"></param>
  1029. /// <param name="slideMasterTables"></param>
  1030. /// <returns></returns>
  1031. public HiTeachCC.Model.PowerPoint.Connector ProcessCxnSpNode(DocumentFormat.OpenXml.Presentation.ConnectionShape element,
  1032. IEnumerable<IdPartPair> slidePart, SlideMaster slideMaster, Dictionary<string, string> colors,
  1033. int index,
  1034. Style slideLayoutTables,
  1035. Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme)
  1036. {
  1037. HiTeachCC.Model.PowerPoint.Connector shape = new HiTeachCC.Model.PowerPoint.Connector();
  1038. HiTeachCC.Model.PowerPoint.Position spPosition = null;
  1039. if (element.ShapeProperties != null)
  1040. {
  1041. Transform2D transform2D = element.ShapeProperties.Transform2D;
  1042. if (transform2D != null)
  1043. {
  1044. spPosition = PowerPointHelper.GetPositionByTransform2D(transform2D);
  1045. }
  1046. }
  1047. XmlDocument doc = new XmlDocument();
  1048. doc.LoadXml(element.OuterXml);
  1049. XmlNode shapeType = doc.SelectSingleNode("//p:spPr/a:prstGeom/@prst", PowerPointHelper.GetXmlnsManager(doc.NameTable));
  1050. if (shapeType != null)
  1051. {
  1052. //常规图形
  1053. HiTeachCC.Model.PowerPoint.Position shapePosition = PowerPointHelper.GetPosition(element.OuterXml, null, null);
  1054. Border border = PowerPointHelper.GetBorder(element.OuterXml, true, colors);
  1055. HiTeachCC.Model.PowerPoint.Fill fill = PowerPointHelper.GetShapeFill(element.OuterXml, colors);
  1056. var headEndTypeNode = doc.SelectSingleNode("//p:spPr/a:ln/a:headEnd/@type", PowerPointHelper.GetXmlnsManager(doc.NameTable));
  1057. var tailEndTypeNode = doc.SelectSingleNode("//p:spPr/a:ln/a:tailEnd/@type", PowerPointHelper.GetXmlnsManager(doc.NameTable));
  1058. PowerPointHelper.GenPPTXShape(shapeType);
  1059. //shapePosition.Index = index;
  1060. shape.Position = shapePosition;
  1061. // shape.Fill = fill;
  1062. shape.Border = border;
  1063. shape.Type = "CxnSp";
  1064. shape.CxnType = shapeType.Value;
  1065. shape.Index = index++;
  1066. if (headEndTypeNode != null)
  1067. {
  1068. shape.HeadEnd = headEndTypeNode.Value;
  1069. }
  1070. if (tailEndTypeNode != null)
  1071. {
  1072. shape.TailEnd = tailEndTypeNode.Value;
  1073. }
  1074. return shape;
  1075. }
  1076. return null;
  1077. }
  1078. private async Task ProcessPDF(IFormFile file, Dictionary<string, object> resdict)
  1079. {
  1080. string shaCode = ShaHashHelper.GetSHA1(file.OpenReadStream());
  1081. Dictionary<string, object> dict = new Dictionary<string, object> { { "Sha1Code", shaCode } };
  1082. List<AzureBlobModel> models = await FindListByDict<AzureBlobModel>(dict);
  1083. if (models.IsNotEmpty())
  1084. {
  1085. resdict.Add("pdf", models[0]);
  1086. resdict.Add("type", "pdf");
  1087. }
  1088. else
  1089. {
  1090. AzureBlobModel azureBlobModel = await azureBlobDBRepository.UploadFile(file, "pdffiles", true);
  1091. azureBlobModel.Sha1Code = shaCode;
  1092. await SaveOrUpdate<AzureBlobModel>(azureBlobModel);
  1093. azureBlobModel.Sha1Code = shaCode;
  1094. resdict.Add("pdf", azureBlobModel);
  1095. resdict.Add("type", "pdf");
  1096. }
  1097. }
  1098. }
  1099. }