|
@@ -6,14 +6,25 @@ using DocumentFormat.OpenXml.Presentation;
|
|
|
using HiTeachCC.Model.PowerPoint;
|
|
|
using HiTeachCC.Service.Core.Implement;
|
|
|
using HiTeachCC.Service.PowerPoint.Interface;
|
|
|
+using Microsoft.AspNetCore.Http;
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.IO;
|
|
|
using System.Linq;
|
|
|
+using System.Threading.Tasks;
|
|
|
using System.Xml;
|
|
|
+using TEAMModelOS.SDK.Context.Constant.Common;
|
|
|
+using TEAMModelOS.SDK.Context.Exception;
|
|
|
+using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
|
|
|
+using TEAMModelOS.SDK.Helper.Common.JsonHelper;
|
|
|
+using TEAMModelOS.SDK.Helper.Common.XmlHelper;
|
|
|
+using TEAMModelOS.SDK.Helper.Security.ShaHash;
|
|
|
+using TEAMModelOS.SDK.Module.AzureBlob.Container;
|
|
|
+using TEAMModelOS.SDK.Module.AzureBlob.Interfaces;
|
|
|
using BlipFill = DocumentFormat.OpenXml.Presentation.BlipFill;
|
|
|
using ColorMap = DocumentFormat.OpenXml.Presentation.ColorMap;
|
|
|
using Paragraph = HiTeachCC.Model.PowerPoint.Paragraph;
|
|
|
+using Point = HiTeachCC.Model.PowerPoint.Point;
|
|
|
using Shape = HiTeachCC.Model.PowerPoint.Shape;
|
|
|
using Text = HiTeachCC.Model.PowerPoint.Text;
|
|
|
using Theme = DocumentFormat.OpenXml.Drawing.Theme;
|
|
@@ -23,25 +34,49 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
{
|
|
|
public class PowerPointService : BaseService, IPowerPointService
|
|
|
{
|
|
|
+ private readonly IAzureBlobDBRepository azureBlobDBRepository;
|
|
|
+
|
|
|
+ public PowerPointService(IAzureBlobDBRepository _azureBlobDBRepository)
|
|
|
+ {
|
|
|
+ azureBlobDBRepository = _azureBlobDBRepository;
|
|
|
+ }
|
|
|
+
|
|
|
const double inchpixel = 96.00, inchpt = 72.00, pxBase = 914400.00, ptBase = 12700;
|
|
|
const double rotBase = 60000.00;
|
|
|
public Dictionary<string, Dictionary<string, string>> styleTable = new Dictionary<string, Dictionary<string, string>>();
|
|
|
+ public async Task<Dictionary<string, object>> LoadPresentation(IFormFile file)
|
|
|
+ {
|
|
|
+ Dictionary<string, object> resdict = new Dictionary<string, object>();
|
|
|
|
|
|
+ if (FileType.GetExtention(file.FileName).ToLower().Equals("pptx"))
|
|
|
+ {
|
|
|
+ await ProcessPPT(file, resdict);
|
|
|
+ return resdict;
|
|
|
+ }
|
|
|
+ else if (FileType.GetExtention(file.FileName).ToLower().Equals("pdf"))
|
|
|
+ {
|
|
|
+ await ProcessPDF(file, resdict);
|
|
|
+ return resdict;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ throw new BizException(500, "file type does not support!");
|
|
|
+ }
|
|
|
+ }
|
|
|
/// <summary>
|
|
|
/// 加载PPTX文件
|
|
|
/// </summary>
|
|
|
/// <param name="presentationFile"></param>
|
|
|
/// <returns></returns>
|
|
|
- public Pptx LoadPresentation(Stream presentationStream)
|
|
|
+ public async Task<Dictionary<string, object>> ProcessPPT(IFormFile file, Dictionary<string, object> resdict)
|
|
|
{
|
|
|
- using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationStream, false))
|
|
|
+ string shaCode = ShaHashHelper.GetSHA1(file.OpenReadStream());
|
|
|
+ using (PresentationDocument presentationDocument = PresentationDocument.Open(file.OpenReadStream(), false))
|
|
|
{
|
|
|
if (presentationDocument == null)
|
|
|
{
|
|
|
throw new ArgumentNullException("presentationDocument");
|
|
|
}
|
|
|
- // Get a PresentationPart object from the PresentationDocument object.
|
|
|
-
|
|
|
var thumbnailPart = presentationDocument.ThumbnailPart;
|
|
|
var contentType = thumbnailPart.ContentType;
|
|
|
string base64 = "";
|
|
@@ -77,7 +112,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
//获取PPT 一页大小
|
|
|
double x = presentation.SlideSize.Cx * inchpixel / pxBase;
|
|
|
double y = presentation.SlideSize.Cy * inchpixel / pxBase;
|
|
|
- List<HiTeachCC.Model.PowerPoint.Slide> slides = new List<HiTeachCC.Model.PowerPoint.Slide>();
|
|
|
+ List<string> slides = new List<string>();
|
|
|
string slideMasterXml = slideMaster.OuterXml;
|
|
|
Style slideMasterTables = PowerPointHelper.IndexNodes(slideMasterXml);
|
|
|
|
|
@@ -95,21 +130,27 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
// 获取这一页 PPT 的id
|
|
|
string id = slideId.RelationshipId;
|
|
|
SlidePart slidePart = presentationPart.GetPartById(slideId.RelationshipId) as SlidePart;
|
|
|
-
|
|
|
- if (slidePart.Uri.ToString().Equals("/ppt/slides/slide10.xml"))
|
|
|
- {
|
|
|
- string a = "";
|
|
|
- }
|
|
|
//获取当前页 PPT 的所有元素
|
|
|
// slide.Items = GetSlideElement(slidePart, theme, colorMap);
|
|
|
//slide.Xml = slidePart.Slide.OuterXml;
|
|
|
+
|
|
|
HiTeachCC.Model.PowerPoint.Slide slide = GetSlideElement(slidePart, slideMaster, slideMasterColors, theme, slideMasterTables, SlideMasterTextStyles, pageSize);
|
|
|
- slides.Add(slide);
|
|
|
+ slide.Width = x;
|
|
|
+ slide.Height = y;
|
|
|
+
|
|
|
+ XmlDocument xml = Newtonsoft.Json.JsonConvert.DeserializeXmlNode(slide.ToJson(), "Slide");
|
|
|
+ string result = @"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>" + xml.OuterXml;
|
|
|
+ AzureBlobModel amodel = await azureBlobDBRepository.UploadTextByFolder(result, shaCode, (pageSize + 1) + ".xml" ,"pptx",false);
|
|
|
+ slides.Add(amodel.BlobUrl);
|
|
|
pageSize++;
|
|
|
}
|
|
|
}
|
|
|
- Pptx info = new Pptx { Slides = slides, Width = x, Height = y, PageSize = pageSize, Thumbnail = base64 };
|
|
|
- return info;
|
|
|
+ Pptx info = new Pptx { HiXmls = slides, Width = x, Height = y, PageSize = pageSize, Thumbnail = base64, Sha1Code = shaCode };
|
|
|
+ AzureBlobModel model = await azureBlobDBRepository.UploadFileByFolder(file.OpenReadStream(), shaCode, shaCode + ".pptx", "pptx", false);
|
|
|
+ info.PptUrl = model.BlobUrl;
|
|
|
+ resdict.Add("pptx", info);
|
|
|
+ resdict.Add("type", "pptx");
|
|
|
+ return resdict;
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
@@ -128,7 +169,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
Style slideMasterTables, XmlDocument SlideMasterTextStyles, int pageSize)
|
|
|
{
|
|
|
|
|
|
- Model.PowerPoint.Slide slide = new Model.PowerPoint.Slide() { index = pageSize };
|
|
|
+ Model.PowerPoint.Slide slide = new Model.PowerPoint.Slide() { Index = pageSize };
|
|
|
//用Layout colorMap覆盖 master ColorMap
|
|
|
slideMasterColors = PowerPointHelper.GetLayoutOrMasterColors(slidePart, slideMasterColors, theme);
|
|
|
//slidePart.SlideLayoutPart;
|
|
@@ -151,10 +192,10 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
position.Y = transformGroup.Offset.Y == null ? 0 : transformGroup.Offset.Y.Value;
|
|
|
position.Cx = transformGroup.Extents.Cx == null ? 0 : transformGroup.Extents.Cx.Value;
|
|
|
position.Cy = transformGroup.Extents.Cy == null ? 0 : transformGroup.Extents.Cy.Value;
|
|
|
- position.ChX = transformGroup.ChildOffset.X == null ? 0 : transformGroup.ChildOffset.X.Value;
|
|
|
- position.ChY = transformGroup.ChildOffset.Y == null ? 0 : transformGroup.ChildOffset.Y.Value;
|
|
|
- position.ChCX = transformGroup.ChildExtents.Cx == null ? 0 : transformGroup.ChildExtents.Cx.Value;
|
|
|
- position.ChCY = transformGroup.ChildExtents.Cy == null ? 0 : transformGroup.ChildExtents.Cy.Value;
|
|
|
+ //position.ChX = transformGroup.ChildOffset.X == null ? 0 : transformGroup.ChildOffset.X.Value;
|
|
|
+ //position.ChY = transformGroup.ChildOffset.Y == null ? 0 : transformGroup.ChildOffset.Y.Value;
|
|
|
+ //position.ChCX = transformGroup.ChildExtents.Cx == null ? 0 : transformGroup.ChildExtents.Cx.Value;
|
|
|
+ //position.ChCY = transformGroup.ChildExtents.Cy == null ? 0 : transformGroup.ChildExtents.Cy.Value;
|
|
|
int index = 0;
|
|
|
foreach (OpenXmlElement element in openXmlElements)
|
|
|
{
|
|
@@ -163,9 +204,10 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- List<object> list = new List<object>();
|
|
|
- ProcessNodesInSlide(list,element, slidePart, slideMaster, slideMasterColors, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme);
|
|
|
+ List<Item> list = new List<Item>();
|
|
|
+ ProcessNodesInSlide(list, element, slidePart, slideMaster, slideMasterColors, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme);
|
|
|
slide.Items.AddRange(list);
|
|
|
+
|
|
|
index++;
|
|
|
}
|
|
|
}
|
|
@@ -183,7 +225,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
/// <param name="slideLayoutTables"></param>
|
|
|
/// <param name="slideMasterTables"></param>
|
|
|
/// <returns></returns>
|
|
|
- public void ProcessNodesInSlide(List<object> list , OpenXmlElement element,
|
|
|
+ public void ProcessNodesInSlide(List<Item> list, OpenXmlElement element,
|
|
|
SlidePart slidePart,
|
|
|
SlideMaster slideMaster,
|
|
|
Dictionary<string, string> colorMaps,
|
|
@@ -195,7 +237,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
|
|
|
if (element is DocumentFormat.OpenXml.Presentation.Picture pic)//p:pic 图片
|
|
|
{
|
|
|
- list.Add(ProcessPicNode(pic, slidePart, slideMaster, colorMaps, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme) );
|
|
|
+ list.Add(ProcessPicNode(pic, slidePart, slideMaster, colorMaps, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme));
|
|
|
// pptElement = PictureConvert(picture, theme, colorMap, slidePart, index);
|
|
|
}
|
|
|
else if (element is DocumentFormat.OpenXml.AlternateContent mc)//mc:alternatecontent 公式等
|
|
@@ -210,7 +252,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
}
|
|
|
else if (element is DocumentFormat.OpenXml.Presentation.GroupShape grpSp)//p:grpSp 组合图形
|
|
|
{
|
|
|
- ProcessGrpSpNode(list,grpSp, slidePart, slideMaster, colorMaps, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme);
|
|
|
+ ProcessGrpSpNode(list, grpSp, slidePart, slideMaster, colorMaps, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme);
|
|
|
/// pptElement = GroupShapeConvert(groupShape, theme, colorMap, index);
|
|
|
}
|
|
|
else if (element is DocumentFormat.OpenXml.Presentation.ConnectionShape cxnSp) // p:cxnSp 连接线
|
|
@@ -221,9 +263,9 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
else if (element is DocumentFormat.OpenXml.Presentation.Shape sp)//p:sp 形状
|
|
|
{
|
|
|
// pptElement = ShapeConvert(shape, theme, colorMap, index);
|
|
|
- list.Add(ProcessSpNode(sp, slidePart, slideMaster, colorMaps, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme) );
|
|
|
+ list.Add(ProcessSpNode(sp, slidePart, slideMaster, colorMaps, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme));
|
|
|
}
|
|
|
- // return null; //element.OuterXml;
|
|
|
+ // return null; //element.OuterXml;
|
|
|
}
|
|
|
|
|
|
|
|
@@ -239,7 +281,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
/// <param name="slideLayoutTables"></param>
|
|
|
/// <param name="slideMasterTables"></param>
|
|
|
/// <returns></returns>
|
|
|
- public object ProcessSpNode(DocumentFormat.OpenXml.Presentation.Shape element, SlidePart slidePart, SlideMaster slideMaster,
|
|
|
+ public HiTeachCC.Model.PowerPoint.Shape ProcessSpNode(DocumentFormat.OpenXml.Presentation.Shape element, SlidePart slidePart, SlideMaster slideMaster,
|
|
|
Dictionary<string, string> colors, int index, HiTeachCC.Model.PowerPoint.Position position,
|
|
|
Style slideLayoutTables,
|
|
|
Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme)
|
|
@@ -365,7 +407,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
// typeNode = getTextByPathList(slideMasterSpNode, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "type"]);
|
|
|
}
|
|
|
}
|
|
|
- object s = GenShape(element, slidePart, slideMaster, colors, index, position, slideLayoutTables,
|
|
|
+ HiTeachCC.Model.PowerPoint.Shape s = GenShape(element, slidePart, slideMaster, colors, index, position, slideLayoutTables,
|
|
|
slideMasterTables, idNode, nameNode, idxNode, typeNode, slideLayoutSpNode, slideMasterSpNode, slideMasterTextStyles, theme);
|
|
|
return s;
|
|
|
}
|
|
@@ -387,7 +429,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
/// <param name="slideLayoutSpNode"></param>
|
|
|
/// <param name="slideMasterSpNode"></param>
|
|
|
/// <returns></returns>
|
|
|
- public object GenShape(DocumentFormat.OpenXml.Presentation.Shape element, SlidePart slidePart, SlideMaster slideMaster,
|
|
|
+ public HiTeachCC.Model.PowerPoint.Shape GenShape(DocumentFormat.OpenXml.Presentation.Shape element, SlidePart slidePart, SlideMaster slideMaster,
|
|
|
Dictionary<string, string> colors, int index, HiTeachCC.Model.PowerPoint.Position position,
|
|
|
Style slideLayoutTables,
|
|
|
Style slideMasterTables, XmlNode idNode, XmlNode nameNode, XmlNode idxNode, XmlNode typeNode,
|
|
@@ -415,15 +457,20 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
HiTeachCC.Model.PowerPoint.Position shapePosition = PowerPointHelper.GetPosition(element.OuterXml, slideLayoutSpNode, slideMasterSpNode);
|
|
|
Border border = PowerPointHelper.GetBorder(element.OuterXml, true, colors);
|
|
|
HiTeachCC.Model.PowerPoint.Fill fill = PowerPointHelper.GetShapeFill(element.OuterXml, colors);
|
|
|
- var headEndTypeNode = doc.SelectSingleNode("//p:spPr/a:ln/a:headEnd/@type", PowerPointHelper.GetXmlnsManager(doc.NameTable));
|
|
|
- var tailEndTypeNode = doc.SelectSingleNode("//p:spPr/a:ln/a:tailEnd/@type", PowerPointHelper.GetXmlnsManager(doc.NameTable));
|
|
|
+ //var headEndTypeNode = doc.SelectSingleNode("//p:spPr/a:ln/a:headEnd/@type", PowerPointHelper.GetXmlnsManager(doc.NameTable));
|
|
|
+ // var tailEndTypeNode = doc.SelectSingleNode("//p:spPr/a:ln/a:tailEnd/@type", PowerPointHelper.GetXmlnsManager(doc.NameTable));
|
|
|
PowerPointHelper.GenPPTXShape(shapeType);
|
|
|
+ // shapePosition.Index = index;
|
|
|
shape.Position = shapePosition;
|
|
|
shape.Paragraph = GenTextBody(element.OuterXml, slideLayoutSpNode, slideMasterSpNode, typeNode, slideLayoutTables, slideMasterTables, slideMasterTextStyles, theme, slidePart, colors);
|
|
|
shape.Fill = fill;
|
|
|
shape.Border = border;
|
|
|
- shape.Type = "shape";
|
|
|
+ shape.Type = "Sp";
|
|
|
shape.ShapeType = shapeType.Value;
|
|
|
+ shape.Index = index++;
|
|
|
+ // shape.VertAlign = PowerPointHelper.GetVerticalAlign(element, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles);
|
|
|
+ XmlNode avLstNode = doc.SelectSingleNode("//p:spPr/a:prstGeom/a:avLst", PowerPointHelper.GetXmlnsManager(doc.NameTable));
|
|
|
+ shape.ShapeGuides = GenShapeGuide(avLstNode);
|
|
|
return shape;
|
|
|
}
|
|
|
else
|
|
@@ -445,13 +492,17 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
slideLayoutTables, slideMasterTables, slideMasterTextStyles, theme, slidePart, colors);
|
|
|
shape.Fill = fill;
|
|
|
shape.Border = border;
|
|
|
- shape.Type = "shape";
|
|
|
+ shape.Type = "Sp";
|
|
|
shape.ShapeType = "custom";
|
|
|
+ shape.Index = index++;
|
|
|
+ //shape.VertAlign = PowerPointHelper.GetVerticalAlign(element, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles);
|
|
|
+ var pathNode = doc.SelectSingleNode("//p:spPr/a:custGeom/a:pathLst/a:path", PowerPointHelper.GetXmlnsManager(doc.NameTable));
|
|
|
+ shape.Paths = GenPath(pathNode.OuterXml);
|
|
|
return shape;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- string align = PowerPointHelper.GetVerticalAlign(element, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles);
|
|
|
+ // string align = PowerPointHelper.GetVerticalAlign(element, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles);
|
|
|
HiTeachCC.Model.PowerPoint.Position shapePosition = PowerPointHelper.GetPosition(element.OuterXml, slideLayoutSpNode, slideMasterSpNode);
|
|
|
Border border = PowerPointHelper.GetBorder(element.OuterXml, true, colors);
|
|
|
HiTeachCC.Model.PowerPoint.Fill fill = PowerPointHelper.GetShapeFill(element.OuterXml, colors);
|
|
@@ -460,14 +511,108 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
slideLayoutTables, slideMasterTables, slideMasterTextStyles, theme, slidePart, colors);
|
|
|
shape.Fill = fill;
|
|
|
shape.Border = border;
|
|
|
- shape.Type = "shape";
|
|
|
+ shape.Type = "Sp";
|
|
|
shape.ShapeType = "rect";
|
|
|
+ shape.Index = index++;
|
|
|
+ // shape.VertAlign = PowerPointHelper.GetVerticalAlign(element, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles);
|
|
|
return shape;
|
|
|
|
|
|
}
|
|
|
}
|
|
|
//return null;
|
|
|
}
|
|
|
+ public List<HiTeachCC.Model.PowerPoint.ShapeGuide> GenShapeGuide(XmlNode avLstNode)
|
|
|
+ {
|
|
|
+ if (avLstNode != null)
|
|
|
+ {
|
|
|
+ AdjustValueList adjustValueList = new AdjustValueList(avLstNode.OuterXml);
|
|
|
+ List<HiTeachCC.Model.PowerPoint.ShapeGuide> ShapeGuides = new List<Model.PowerPoint.ShapeGuide>();
|
|
|
+ var elements = adjustValueList.ChildElements;
|
|
|
+ foreach (var xmlElement in elements)
|
|
|
+ {
|
|
|
+ if (xmlElement is DocumentFormat.OpenXml.Drawing.ShapeGuide shapeGuide)
|
|
|
+ {
|
|
|
+ HiTeachCC.Model.PowerPoint.ShapeGuide ShapeGuide = new HiTeachCC.Model.PowerPoint.ShapeGuide { Name = shapeGuide.Name, Fmla = shapeGuide.Formula };
|
|
|
+ ShapeGuides.Add(ShapeGuide);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return ShapeGuides;
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ public List<HiTeachCC.Model.PowerPoint.Path> GenPath(string nodeXml)
|
|
|
+ {
|
|
|
+ DocumentFormat.OpenXml.Drawing.Path path = new DocumentFormat.OpenXml.Drawing.Path(nodeXml);
|
|
|
+ OpenXmlElementList elements = path.ChildElements;
|
|
|
+ List<HiTeachCC.Model.PowerPoint.Path> Paths = new List<Model.PowerPoint.Path>();
|
|
|
+ foreach (OpenXmlElement xmlElement in elements)
|
|
|
+ {
|
|
|
+ //起点
|
|
|
+ if (xmlElement is DocumentFormat.OpenXml.Drawing.MoveTo moveTo)
|
|
|
+ {
|
|
|
+ DocumentFormat.OpenXml.Drawing.Point point = moveTo.Point;
|
|
|
+ MoveToPath moveToPath = new MoveToPath { Type = "MoveTo" };
|
|
|
+ moveToPath.Pts.Add(new Point { X = double.Parse(point.X) * inchpixel / pxBase, Y = double.Parse(point.Y) * inchpixel / pxBase });
|
|
|
+ Paths.Add(moveToPath);
|
|
|
+ }
|
|
|
+ //连线
|
|
|
+ if (xmlElement is DocumentFormat.OpenXml.Drawing.LineTo linTo)
|
|
|
+ {
|
|
|
+ DocumentFormat.OpenXml.Drawing.Point point = linTo.Point;
|
|
|
+ LineToPath lineToPath = new LineToPath { Type = "LineTo" };
|
|
|
+ lineToPath.Pts.Add(new Point { X = double.Parse(point.X) * inchpixel / pxBase, Y = double.Parse(point.Y) * inchpixel / pxBase });
|
|
|
+ Paths.Add(lineToPath);
|
|
|
+ }
|
|
|
+ //三次贝塞尔曲线
|
|
|
+ if (xmlElement is DocumentFormat.OpenXml.Drawing.CubicBezierCurveTo cubicBezierCurveTo)
|
|
|
+ {
|
|
|
+ OpenXmlElementList list = cubicBezierCurveTo.ChildElements;
|
|
|
+ CubicBezPath cubicBezPath = new CubicBezPath { Type = "CubicBez" };
|
|
|
+ foreach (var ls in list)
|
|
|
+ {
|
|
|
+ if (ls is DocumentFormat.OpenXml.Drawing.Point point)
|
|
|
+ {
|
|
|
+ cubicBezPath.Pts.Add(new Point { X = double.Parse(point.X) * inchpixel / pxBase, Y = double.Parse(point.Y) * inchpixel / pxBase });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Paths.Add(cubicBezPath);
|
|
|
+ }
|
|
|
+ //二次贝塞尔曲线
|
|
|
+ if (xmlElement is DocumentFormat.OpenXml.Drawing.QuadraticBezierCurveTo quadraticBezierCurveTo)
|
|
|
+ {
|
|
|
+ OpenXmlElementList list = quadraticBezierCurveTo.ChildElements;
|
|
|
+ QuadBezPath quadBezPath = new QuadBezPath { Type = "QuadBez" };
|
|
|
+ foreach (var ls in list)
|
|
|
+ {
|
|
|
+ if (ls is DocumentFormat.OpenXml.Drawing.Point point)
|
|
|
+ {
|
|
|
+ quadBezPath.Pts.Add(new Point { X = double.Parse(point.X) * inchpixel / pxBase, Y = double.Parse(point.Y) * inchpixel / pxBase });
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Paths.Add(quadBezPath);
|
|
|
+ }
|
|
|
+ //处理曲线
|
|
|
+ if (xmlElement is DocumentFormat.OpenXml.Drawing.ArcTo arcTO)
|
|
|
+ {
|
|
|
+ ArcToPath arcToPath = new ArcToPath() { WidthRadius = arcTO.WidthRadius, HeightRadius = arcTO.HeightRadius, StartAngle = arcTO.StartAngle, SwingAngle = arcTO.SwingAngle };
|
|
|
+ Paths.Add(arcToPath);
|
|
|
+ }
|
|
|
+ ///判断路径是否闭合
|
|
|
+ if (xmlElement is DocumentFormat.OpenXml.Drawing.CloseShapePath close)
|
|
|
+ {
|
|
|
+ if (close != null)
|
|
|
+ {
|
|
|
+ ClosePath closePath = new ClosePath { Type = "Close" };
|
|
|
+ closePath.Close = true;
|
|
|
+ Paths.Add(closePath);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return Paths;
|
|
|
+ }
|
|
|
|
|
|
|
|
|
public List<Paragraph> GenTextBody(string nodeXml, XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode,
|
|
@@ -499,13 +644,13 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
//XmlDocument docNode = new XmlDocument();
|
|
|
//docNode.LoadXml(pNode.OuterXml);
|
|
|
string HorizontalAlign = PowerPointHelper.GetHorizontalAlign(pXmlNode, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles);
|
|
|
+ string VerticalAlign = PowerPointHelper.GetVerticalAlign(nodeXml, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles);
|
|
|
Paragraph paragraph = new Paragraph();
|
|
|
- ParagraphStyle paragraphStyle = new ParagraphStyle { Alignment = HorizontalAlign };
|
|
|
+ ParagraphStyle paragraphStyle = new ParagraphStyle { HoriAlign = HorizontalAlign, VertAlign = VerticalAlign };
|
|
|
XmlNodeList pPrNodes = pXmlNode.SelectNodes("//a:pPr", PowerPointHelper.GetXmlnsManager(pXmlNode.NameTable));
|
|
|
BuChar buChar = PowerPointHelper.GenBuChar(pXmlNode, slideLayoutTables, slideMasterTables, slideMasterTextStyles, typeNode, hasBuChar);
|
|
|
paragraph.BuChar = buChar;
|
|
|
paragraph.ParagraphStyle = paragraphStyle;
|
|
|
-
|
|
|
XmlNodeList rNodes = pXmlNode.SelectNodes("//a:r", PowerPointHelper.GetXmlnsManager(pXmlNode.NameTable));
|
|
|
if (null == rNodes)
|
|
|
{
|
|
@@ -518,17 +663,14 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
int rsize = rNodes.Count;
|
|
|
for (int ri = 0; ri < rsize; ri++)
|
|
|
{
|
|
|
-
|
|
|
XmlDocument rNode = new XmlDocument();
|
|
|
rNode.LoadXml(rNodes.Item(ri).OuterXml);
|
|
|
paragraph.Texts.Add(GenSpanElement(rNode, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles, theme, slidePart, colors, buChar));
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
paragraphs.Add(paragraph);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
return paragraphs;
|
|
|
}
|
|
|
|
|
@@ -536,7 +678,6 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
public Text GenSpanElement(XmlDocument nodeXml, XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode, XmlNode typeNode,
|
|
|
XmlDocument slideMasterTextStyles, Theme theme, SlidePart slidePart, Dictionary<string, string> colors, BuChar buChar)
|
|
|
{
|
|
|
-
|
|
|
XmlNode tNode = nodeXml.SelectSingleNode("//a:t", PowerPointHelper.GetXmlnsManager(nodeXml.NameTable));
|
|
|
/*
|
|
|
var text = node["a:t"];
|
|
@@ -567,7 +708,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
Bold = font_weight,
|
|
|
Italic = font_style,
|
|
|
Decoration = text_decoration,
|
|
|
- VerticalAlign = vertical_align
|
|
|
+ VertAlign = vertical_align
|
|
|
};
|
|
|
string styleText = "color:" + color + ";font-size:" + font_size +
|
|
|
";font-family:" + font_family + ";font-weight:" + font_weight +
|
|
@@ -622,7 +763,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
/// <param name="slideLayoutTables"></param>
|
|
|
/// <param name="slideMasterTables"></param>
|
|
|
/// <returns></returns>
|
|
|
- public object ProcessPicNode(DocumentFormat.OpenXml.Presentation.Picture element,
|
|
|
+ public Model.PowerPoint.Picture ProcessPicNode(DocumentFormat.OpenXml.Presentation.Picture element,
|
|
|
SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> colors, int index,
|
|
|
HiTeachCC.Model.PowerPoint.Position position,
|
|
|
Style slideLayoutTables,
|
|
@@ -630,6 +771,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
{
|
|
|
|
|
|
HiTeachCC.Model.PowerPoint.Position picPosition = PowerPointHelper.GetPosition(element.OuterXml, null, null);
|
|
|
+ //picPosition.Index = index;
|
|
|
BlipFill blipFill = element.BlipFill;
|
|
|
var imageRid = blipFill.Blip.Embed.Value;
|
|
|
IdPartPair idParie = slidePart.Parts.Where(x => x.RelationshipId == imageRid).FirstOrDefault();
|
|
@@ -651,10 +793,11 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
{
|
|
|
Type = "Pic",
|
|
|
Position = picPosition,
|
|
|
- Data = base64,
|
|
|
+ Base64 = base64,
|
|
|
Fill = fill,
|
|
|
Border = border
|
|
|
};
|
|
|
+ picture.Index = index++;
|
|
|
return picture;
|
|
|
}
|
|
|
|
|
@@ -670,7 +813,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
/// <param name="slideLayoutTables"></param>
|
|
|
/// <param name="slideMasterTables"></param>
|
|
|
/// <returns></returns>
|
|
|
- public object ProcessMcNode(DocumentFormat.OpenXml.AlternateContent element, SlidePart slidePart,
|
|
|
+ public Model.PowerPoint.Picture ProcessMcNode(DocumentFormat.OpenXml.AlternateContent element, SlidePart slidePart,
|
|
|
SlideMaster slideMaster, Dictionary<string, string> colors,
|
|
|
int index, HiTeachCC.Model.PowerPoint.Position position,
|
|
|
Style slideLayoutTables,
|
|
@@ -697,7 +840,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
}
|
|
|
|
|
|
|
|
|
- public object MathConvertImage(AlternateContent content, Theme theme, Dictionary<string, string> colors, SlidePart slidePart, int index)
|
|
|
+ public Model.PowerPoint.Picture MathConvertImage(AlternateContent content, Theme theme, Dictionary<string, string> colors, SlidePart slidePart, int index)
|
|
|
{
|
|
|
var fallbacks = from contentChoice in content.Descendants<AlternateContentFallback>() select contentChoice;
|
|
|
if (fallbacks.Count() > 0)
|
|
@@ -724,17 +867,19 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
base64 = "data:" + contentType + ";base64," + base64;
|
|
|
}
|
|
|
|
|
|
- Model.PowerPoint.Position picPosition = PowerPointHelper.GetPosition(shape.OuterXml, null,null);
|
|
|
+ Model.PowerPoint.Position picPosition = PowerPointHelper.GetPosition(shape.OuterXml, null, null);
|
|
|
Border border = PowerPointHelper.GetBorder(shape.OuterXml, true, colors);
|
|
|
Model.PowerPoint.Fill fill = PowerPointHelper.GetShapeFill(shape.OuterXml, colors);
|
|
|
+ // picPosition.Index = index;
|
|
|
Model.PowerPoint.Picture picture = new Model.PowerPoint.Picture
|
|
|
{
|
|
|
Type = "Pic",
|
|
|
Position = picPosition,
|
|
|
- Data = base64,
|
|
|
+ Base64 = base64,
|
|
|
Fill = fill,
|
|
|
Border = border
|
|
|
};
|
|
|
+ picture.Index = index++;
|
|
|
return picture;
|
|
|
}
|
|
|
}
|
|
@@ -754,13 +899,38 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
/// <param name="slideLayoutTables"></param>
|
|
|
/// <param name="slideMasterTables"></param>
|
|
|
/// <returns></returns>
|
|
|
- public object ProcessGraphicFrameNode(DocumentFormat.OpenXml.Presentation.GraphicFrame element,
|
|
|
+ public Item ProcessGraphicFrameNode(DocumentFormat.OpenXml.Presentation.GraphicFrame graphicFrame,
|
|
|
SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> colors,
|
|
|
int index, HiTeachCC.Model.PowerPoint.Position position,
|
|
|
Style slideLayoutTables,
|
|
|
Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme)
|
|
|
{
|
|
|
+ DocumentFormat.OpenXml.Drawing.GraphicData graphicData = graphicFrame.ChildElements.First<DocumentFormat.OpenXml.Drawing.GraphicData>();
|
|
|
+ if (graphicData != null)
|
|
|
+ {
|
|
|
+ OpenXmlElement element = graphicData.ChildElements.First();
|
|
|
+ if (element != null)
|
|
|
+ {
|
|
|
+ if (element is DocumentFormat.OpenXml.Drawing.Table table)
|
|
|
+ {
|
|
|
+ TableConvert(table, theme, colors);
|
|
|
+ }
|
|
|
+ if (element is DocumentFormat.OpenXml.Drawing.Chart chart)
|
|
|
+ {
|
|
|
+ //return ChartConvert(graphicFrame, theme, colorMap);
|
|
|
+ }
|
|
|
+ if (element is DocumentFormat.OpenXml.Drawing.Diagram diagram)
|
|
|
+ {
|
|
|
+ //return DiagramConvert(graphicFrame, theme, colorMap);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
return null;
|
|
|
+ }
|
|
|
+ public void TableConvert(DocumentFormat.OpenXml.Drawing.Table table, Theme theme, Dictionary<string, string> colors)
|
|
|
+ {
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
/// <summary>
|
|
|
/// 处理组合图形
|
|
@@ -774,18 +944,18 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
/// <param name="slideLayoutTables"></param>
|
|
|
/// <param name="slideMasterTables"></param>
|
|
|
/// <returns></returns>
|
|
|
- public void ProcessGrpSpNode(List<object>list, DocumentFormat.OpenXml.Presentation.GroupShape element, SlidePart slidePart,
|
|
|
+ public void ProcessGrpSpNode(List<Item> list, DocumentFormat.OpenXml.Presentation.GroupShape element, SlidePart slidePart,
|
|
|
SlideMaster slideMaster, Dictionary<string, string> colors, int index,
|
|
|
HiTeachCC.Model.PowerPoint.Position position,
|
|
|
Style slideLayoutTables,
|
|
|
Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme)
|
|
|
{
|
|
|
var shapes = from shap in element.Descendants<DocumentFormat.OpenXml.Presentation.Shape>() select shap;
|
|
|
-
|
|
|
+
|
|
|
foreach (var shape in shapes)
|
|
|
{
|
|
|
- ProcessNodesInSlide(list ,shape, slidePart, slideMaster, colors, index, position, slideLayoutTables, slideMasterTables, slideMasterTextStyles, theme);
|
|
|
-
|
|
|
+ ProcessNodesInSlide(list, shape, slidePart, slideMaster, colors, index, position, slideLayoutTables, slideMasterTables, slideMasterTextStyles, theme);
|
|
|
+
|
|
|
}
|
|
|
//return list;
|
|
|
}
|
|
@@ -802,13 +972,13 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
/// <param name="slideLayoutTables"></param>
|
|
|
/// <param name="slideMasterTables"></param>
|
|
|
/// <returns></returns>
|
|
|
- public object ProcessCxnSpNode(DocumentFormat.OpenXml.Presentation.ConnectionShape element,
|
|
|
+ public HiTeachCC.Model.PowerPoint.Connector ProcessCxnSpNode(DocumentFormat.OpenXml.Presentation.ConnectionShape element,
|
|
|
SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> colors,
|
|
|
int index, HiTeachCC.Model.PowerPoint.Position position,
|
|
|
Style slideLayoutTables,
|
|
|
Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme)
|
|
|
{
|
|
|
- HiTeachCC.Model.PowerPoint.Shape shape = new HiTeachCC.Model.PowerPoint.Shape();
|
|
|
+ HiTeachCC.Model.PowerPoint.Connector shape = new HiTeachCC.Model.PowerPoint.Connector();
|
|
|
HiTeachCC.Model.PowerPoint.Position spPosition = null;
|
|
|
if (element.ShapeProperties != null)
|
|
|
{
|
|
@@ -825,21 +995,50 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
if (shapeType != null)
|
|
|
{
|
|
|
//常规图形
|
|
|
- HiTeachCC.Model.PowerPoint.Position shapePosition = PowerPointHelper.GetPosition(element.OuterXml, null,null);
|
|
|
+ HiTeachCC.Model.PowerPoint.Position shapePosition = PowerPointHelper.GetPosition(element.OuterXml, null, null);
|
|
|
Border border = PowerPointHelper.GetBorder(element.OuterXml, true, colors);
|
|
|
HiTeachCC.Model.PowerPoint.Fill fill = PowerPointHelper.GetShapeFill(element.OuterXml, colors);
|
|
|
var headEndTypeNode = doc.SelectSingleNode("//p:spPr/a:ln/a:headEnd/@type", PowerPointHelper.GetXmlnsManager(doc.NameTable));
|
|
|
var tailEndTypeNode = doc.SelectSingleNode("//p:spPr/a:ln/a:tailEnd/@type", PowerPointHelper.GetXmlnsManager(doc.NameTable));
|
|
|
PowerPointHelper.GenPPTXShape(shapeType);
|
|
|
+ //shapePosition.Index = index;
|
|
|
shape.Position = shapePosition;
|
|
|
- shape.Fill = fill;
|
|
|
+ // shape.Fill = fill;
|
|
|
shape.Border = border;
|
|
|
- shape.Type = "shape";
|
|
|
- shape.ShapeType = shapeType.Value;
|
|
|
+ shape.Type = "CxnSp";
|
|
|
+ shape.CxnType = shapeType.Value;
|
|
|
+ shape.Index = index++;
|
|
|
+ if (headEndTypeNode != null)
|
|
|
+ {
|
|
|
+ shape.HeadEnd = headEndTypeNode.Value;
|
|
|
+ }
|
|
|
+ if (tailEndTypeNode != null)
|
|
|
+ {
|
|
|
+ shape.TailEnd = tailEndTypeNode.Value;
|
|
|
+ }
|
|
|
return shape;
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
-
|
|
|
+ private async Task ProcessPDF(IFormFile file, Dictionary<string, object> resdict)
|
|
|
+ {
|
|
|
+ string shaCode = ShaHashHelper.GetSHA1(file.OpenReadStream());
|
|
|
+ Dictionary<string, object> dict = new Dictionary<string, object> { { "Sha1Code", shaCode } };
|
|
|
+ List<AzureBlobModel> models = await FindListByDict<AzureBlobModel>(dict);
|
|
|
+ if (models.IsNotEmpty())
|
|
|
+ {
|
|
|
+ resdict.Add("pdf", models[0]);
|
|
|
+ resdict.Add("type", "pdf");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ AzureBlobModel azureBlobModel = await azureBlobDBRepository.UploadFile(file, "pdffiles", true);
|
|
|
+ azureBlobModel.Sha1Code = shaCode;
|
|
|
+ await SaveOrUpdate<AzureBlobModel>(azureBlobModel);
|
|
|
+ azureBlobModel.Sha1Code = shaCode;
|
|
|
+ resdict.Add("pdf", azureBlobModel);
|
|
|
+ resdict.Add("type", "pdf");
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|