|
@@ -11,6 +11,9 @@ using System.IO;
|
|
|
using System.Linq;
|
|
|
using System.Xml;
|
|
|
using ColorMap = DocumentFormat.OpenXml.Presentation.ColorMap;
|
|
|
+using Paragraph = HiTeachCC.Model.PowerPoint.Paragraph;
|
|
|
+using Shape = HiTeachCC.Model.PowerPoint.Shape;
|
|
|
+using Text = HiTeachCC.Model.PowerPoint.Text;
|
|
|
using Theme = DocumentFormat.OpenXml.Drawing.Theme;
|
|
|
|
|
|
namespace HiTeachCC.Service.PowerPoint.Implement
|
|
@@ -19,7 +22,8 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
{
|
|
|
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>>();
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 加载PPTX文件
|
|
|
/// </summary>
|
|
@@ -72,7 +76,9 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
double y = presentation.SlideSize.Cy * inchpixel / pxBase;
|
|
|
List<HiTeachCC.Model.PowerPoint.Slide> slides = new List<HiTeachCC.Model.PowerPoint.Slide>();
|
|
|
string slideMasterXml = slideMaster.OuterXml;
|
|
|
- Style slideMasterStyle = PowerPointHelper.IndexNodes(slideMasterXml);
|
|
|
+ Style slideMasterTables = PowerPointHelper.IndexNodes(slideMasterXml);
|
|
|
+
|
|
|
+ XmlDocument SlideMasterTextStyles= PowerPointHelper.GetSlideMasterTextStyles(slideMasterXml);
|
|
|
if (presentation.SlideIdList != null)
|
|
|
{
|
|
|
|
|
@@ -81,14 +87,20 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
// 获取的是几页PPT数量
|
|
|
foreach (var slideId in presentation.SlideIdList.Elements<SlideId>())
|
|
|
{
|
|
|
- HiTeachCC.Model.PowerPoint.Slide slide = new HiTeachCC.Model.PowerPoint.Slide();
|
|
|
+
|
|
|
+ // HiTeachCC.Model.PowerPoint.Slide slide = new HiTeachCC.Model.PowerPoint.Slide();
|
|
|
// 获取这一页 PPT 的id
|
|
|
string id = slideId.RelationshipId;
|
|
|
SlidePart slidePart = presentationPart.GetPartById(slideId.RelationshipId) as SlidePart;
|
|
|
+
|
|
|
+ if (slidePart.Uri.ToString().Equals("/ppt/slides/slide10.xml"))
|
|
|
+ {
|
|
|
+ string a = "";
|
|
|
+ }
|
|
|
//获取当前页 PPT 的所有元素
|
|
|
// slide.Items = GetSlideElement(slidePart, theme, colorMap);
|
|
|
//slide.Xml = slidePart.Slide.OuterXml;
|
|
|
- GetSlideElement(slidePart, slideMaster, slideMasterColors, theme, slideMasterStyle);
|
|
|
+ HiTeachCC.Model.PowerPoint.Slide slide = GetSlideElement(slidePart, slideMaster, slideMasterColors, theme, slideMasterTables , SlideMasterTextStyles , pageSize);
|
|
|
slides.Add(slide);
|
|
|
pageSize++;
|
|
|
}
|
|
@@ -106,15 +118,21 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
/// <param name="slideMaster"></param>
|
|
|
/// <param name="slideMasterColors"></param>
|
|
|
/// <param name="theme"></param>
|
|
|
- /// <param name="slideMasterStyle"></param>
|
|
|
+ /// <param name="slideMasterTables"></param>
|
|
|
/// <returns></returns>
|
|
|
- public HiTeachCC.Model.PowerPoint.Slide GetSlideElement(SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> slideMasterColors, Theme theme, Style slideMasterStyle)
|
|
|
+ public HiTeachCC.Model.PowerPoint.Slide GetSlideElement(SlidePart slidePart, SlideMaster slideMaster,
|
|
|
+ Dictionary<string, string> slideMasterColors, Theme theme,
|
|
|
+ Style slideMasterTables, XmlDocument SlideMasterTextStyles , int pageSize)
|
|
|
{
|
|
|
+
|
|
|
+ Model.PowerPoint.Slide slide = new Model.PowerPoint.Slide() { index = pageSize };
|
|
|
+ //用Layout colorMap覆盖 master ColorMap
|
|
|
+ slideMasterColors = PowerPointHelper.GetLayoutOrMasterColors(slidePart, slideMasterColors, theme);
|
|
|
//slidePart.SlideLayoutPart;
|
|
|
string bgColor = PowerPointHelper.GetSlideBackgroundFill(slidePart, slideMaster, slideMasterColors, theme);
|
|
|
string slideLayoutXml = slidePart.SlideLayoutPart.SlideLayout.OuterXml;
|
|
|
|
|
|
- var slideLayoutStyle = PowerPointHelper.IndexNodes(slideLayoutXml);
|
|
|
+ var slideLayoutTables = PowerPointHelper.IndexNodes(slideLayoutXml);
|
|
|
|
|
|
var shapeTrees = from shap in slidePart.Slide.Descendants<ShapeTree>() select shap;
|
|
|
if (shapeTrees.Count() > 0 && shapeTrees.First().ChildElements.Count > 0)
|
|
@@ -137,11 +155,14 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
int index = 0;
|
|
|
foreach (OpenXmlElement element in openXmlElements)
|
|
|
{
|
|
|
- ProcessNodesInSlide(element, slidePart, slideMaster, slideMasterColors, index, position, slideLayoutStyle, slideMasterStyle);
|
|
|
+ if (element is DocumentFormat.OpenXml.Presentation.NonVisualGroupShapeProperties np || element is DocumentFormat.OpenXml.Presentation.GroupShapeProperties gp ) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ slide.Items.Add( ProcessNodesInSlide(element, slidePart, slideMaster, slideMasterColors, index, position, slideLayoutTables, slideMasterTables , SlideMasterTextStyles,theme));
|
|
|
index++;
|
|
|
}
|
|
|
}
|
|
|
- return null;
|
|
|
+ return slide;
|
|
|
}
|
|
|
/// <summary>
|
|
|
/// 单个元素分类
|
|
@@ -152,49 +173,49 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
/// <param name="slideMasterColors"></param>
|
|
|
/// <param name="index"></param>
|
|
|
/// <param name="position"></param>
|
|
|
- /// <param name="slideLayoutStyle"></param>
|
|
|
- /// <param name="slideMasterStyle"></param>
|
|
|
+ /// <param name="slideLayoutTables"></param>
|
|
|
+ /// <param name="slideMasterTables"></param>
|
|
|
/// <returns></returns>
|
|
|
- public string ProcessNodesInSlide(OpenXmlElement element,
|
|
|
+ public object ProcessNodesInSlide(OpenXmlElement element,
|
|
|
SlidePart slidePart,
|
|
|
SlideMaster slideMaster,
|
|
|
- Dictionary<string, string> slideMasterColors,
|
|
|
+ Dictionary<string, string> colorMaps,
|
|
|
int index,
|
|
|
HiTeachCC.Model.PowerPoint.Position position,
|
|
|
- Style slideLayoutStyle,
|
|
|
- Style slideMasterStyle)
|
|
|
+ Style slideLayoutTables,
|
|
|
+ Style slideMasterTables , XmlDocument SlideMasterTextStyles, Theme theme)
|
|
|
{
|
|
|
- if (element is DocumentFormat.OpenXml.Presentation.Shape sp)//p:sp 形状
|
|
|
+ if (element is DocumentFormat.OpenXml.Presentation.Picture pic)//p:pic 图片
|
|
|
{
|
|
|
- // pptElement = ShapeConvert(shape, theme, colorMap, index);
|
|
|
- ProcessSpNode(sp, slidePart, slideMaster, slideMasterColors, index, position, slideLayoutStyle, slideMasterStyle);
|
|
|
- }
|
|
|
- else if (element is DocumentFormat.OpenXml.Presentation.Picture pic)//p:pic 图片
|
|
|
- {
|
|
|
- ProcessPicNode(pic, slidePart, slideMaster, slideMasterColors, index, position, slideLayoutStyle, slideMasterStyle);
|
|
|
+ return ProcessPicNode(pic, slidePart, slideMaster, colorMaps, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme);
|
|
|
// pptElement = PictureConvert(picture, theme, colorMap, slidePart, index);
|
|
|
}
|
|
|
else if (element is DocumentFormat.OpenXml.AlternateContent mc)//mc:alternatecontent 公式等
|
|
|
{
|
|
|
- ProcessMcNode(mc, slidePart, slideMaster, slideMasterColors, index, position, slideLayoutStyle, slideMasterStyle);
|
|
|
+ return ProcessMcNode(mc, slidePart, slideMaster, colorMaps, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme);
|
|
|
/// pptElement = AlternateContentConvert(content, theme, colorMap, slidePart, index);
|
|
|
}
|
|
|
else if (element is DocumentFormat.OpenXml.Presentation.GraphicFrame graphicFrame)//p:graphicFrame Chart, Diagram, Table
|
|
|
{
|
|
|
- ProcessGraphicFrameNode(graphicFrame, slidePart, slideMaster, slideMasterColors, index, position, slideLayoutStyle, slideMasterStyle);
|
|
|
+ return ProcessGraphicFrameNode(graphicFrame, slidePart, slideMaster, colorMaps, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme);
|
|
|
/// pptElement = GraphicFrameConvert(graphicFrame, theme, colorMap, index);
|
|
|
}
|
|
|
else if (element is DocumentFormat.OpenXml.Presentation.GroupShape grpSp)//p:grpSp 组合图形
|
|
|
{
|
|
|
- ProcessGrpSpNode(grpSp, slidePart, slideMaster, slideMasterColors, index, position, slideLayoutStyle, slideMasterStyle);
|
|
|
+ return ProcessGrpSpNode(grpSp, slidePart, slideMaster, colorMaps, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme);
|
|
|
/// pptElement = GroupShapeConvert(groupShape, theme, colorMap, index);
|
|
|
}
|
|
|
else if (element is DocumentFormat.OpenXml.Presentation.ConnectionShape cxnSp) // p:cxnSp 连接线
|
|
|
{
|
|
|
- ProcessCxnSpNode(cxnSp, slidePart, slideMaster, slideMasterColors, index, position, slideLayoutStyle, slideMasterStyle);
|
|
|
+ return ProcessCxnSpNode(cxnSp, slidePart, slideMaster, colorMaps, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme);
|
|
|
/// pptElement = ConnectionShapeConvert(connectionShape, theme, colorMap, index);
|
|
|
}
|
|
|
- return null;
|
|
|
+ else if(element is DocumentFormat.OpenXml.Presentation.Shape sp)//p:sp 形状
|
|
|
+ {
|
|
|
+ // pptElement = ShapeConvert(shape, theme, colorMap, index);
|
|
|
+ return ProcessSpNode(sp, slidePart, slideMaster, colorMaps, index, position, slideLayoutTables, slideMasterTables, SlideMasterTextStyles, theme);
|
|
|
+ }
|
|
|
+ return element.OuterXml;
|
|
|
}
|
|
|
|
|
|
|
|
@@ -207,25 +228,15 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
/// <param name="colors"></param>
|
|
|
/// <param name="index"></param>
|
|
|
/// <param name="position"></param>
|
|
|
- /// <param name="slideLayoutStyle"></param>
|
|
|
- /// <param name="slideMasterStyle"></param>
|
|
|
+ /// <param name="slideLayoutTables"></param>
|
|
|
+ /// <param name="slideMasterTables"></param>
|
|
|
/// <returns></returns>
|
|
|
- public string ProcessSpNode(DocumentFormat.OpenXml.Presentation.Shape element, SlidePart slidePart, SlideMaster slideMaster,
|
|
|
+ public object ProcessSpNode(DocumentFormat.OpenXml.Presentation.Shape element, SlidePart slidePart, SlideMaster slideMaster,
|
|
|
Dictionary<string, string> colors, int index, HiTeachCC.Model.PowerPoint.Position position,
|
|
|
- Style slideLayoutStyle,
|
|
|
- Style slideMasterStyle)
|
|
|
+ Style slideLayoutTables,
|
|
|
+ Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme)
|
|
|
{
|
|
|
- HiTeachCC.Model.PowerPoint.Shape shape = new HiTeachCC.Model.PowerPoint.Shape();
|
|
|
- HiTeachCC.Model.PowerPoint.Position spPosition = null;
|
|
|
- if (element.ShapeProperties != null)
|
|
|
- {
|
|
|
- Transform2D transform2D = element.ShapeProperties.Transform2D;
|
|
|
- if (transform2D != null)
|
|
|
- {
|
|
|
- spPosition = GetPositionByTransform2D(transform2D);
|
|
|
- }
|
|
|
- }
|
|
|
- DocumentFormat.OpenXml.Presentation.NonVisualShapeProperties nonVisualShapeProperties = element.NonVisualShapeProperties;
|
|
|
+
|
|
|
XmlDocument doc = new XmlDocument();
|
|
|
doc.LoadXml(element.OuterXml);
|
|
|
//获取当前节点的相关样式属性
|
|
@@ -237,28 +248,117 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
XmlDocument slideMasterSpNode = null;
|
|
|
if (typeNode != null)
|
|
|
{
|
|
|
- slideLayoutSpNode = slideLayoutStyle.TypeTable;
|
|
|
- slideMasterSpNode = slideMasterStyle.TypeTable;
|
|
|
+
|
|
|
+ // 检查 slideLayoutSpNode slideMasterSpNode 为空时产生的位置 横竖排版 空指针问题
|
|
|
+
|
|
|
+
|
|
|
+ //slideLayoutSpNode = slideLayoutTables.TypeTable;
|
|
|
+ //slideMasterSpNode = slideMasterTables.TypeTable;
|
|
|
+
|
|
|
+
|
|
|
+ doc.LoadXml(slideLayoutTables.TypeTable.OuterXml);
|
|
|
+ XmlNodeList types = doc.SelectNodes("//xmlDatas/xmlData", PowerPointHelper.GetXmlnsManager(doc.NameTable));
|
|
|
+ if (types != null)
|
|
|
+ {
|
|
|
+ int size = types.Count;
|
|
|
+ for (int i = 0; i < size; i++)
|
|
|
+ {
|
|
|
+ XmlNode node = types.Item(i);
|
|
|
+ doc.LoadXml(node.OuterXml);
|
|
|
+ XmlNode id = doc.SelectSingleNode("./xmlData/@id", PowerPointHelper.GetXmlnsManager(doc.NameTable));
|
|
|
+ if (id.Value.Equals(typeNode.Value))
|
|
|
+ {
|
|
|
+ XmlDocument nodeDoc = new XmlDocument();
|
|
|
+ nodeDoc.LoadXml(types.Item(i).OuterXml);
|
|
|
+ slideLayoutSpNode = nodeDoc;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ doc.LoadXml(slideMasterTables.TypeTable.OuterXml);
|
|
|
+ types = doc.SelectNodes("//xmlDatas/xmlData", PowerPointHelper.GetXmlnsManager(doc.NameTable));
|
|
|
+ if (types != null)
|
|
|
+ {
|
|
|
+ int size = types.Count;
|
|
|
+ for (int i = 0; i < size; i++)
|
|
|
+ {
|
|
|
+ XmlNode node = types.Item(i);
|
|
|
+ doc.LoadXml(node.OuterXml);
|
|
|
+ XmlNode id = doc.SelectSingleNode("./xmlData/@id", PowerPointHelper.GetXmlnsManager(doc.NameTable));
|
|
|
+ if (id.Value.Equals(typeNode.Value))
|
|
|
+ {
|
|
|
+ XmlDocument nodeDoc = new XmlDocument();
|
|
|
+ nodeDoc.LoadXml(types.Item(i).OuterXml);
|
|
|
+ slideMasterSpNode = nodeDoc;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
if (idxNode != null)
|
|
|
{
|
|
|
- slideLayoutSpNode = slideLayoutStyle.IdxTable;
|
|
|
- slideMasterSpNode = slideMasterStyle.IdxTable;
|
|
|
+ //slideLayoutSpNode = slideLayoutTables.IdxTable;
|
|
|
+ //slideMasterSpNode = slideMasterTables.IdxTable;
|
|
|
+ doc.LoadXml(slideLayoutTables.IdxTable.OuterXml);
|
|
|
+ XmlNodeList types = doc.SelectNodes("//xmlDatas/xmlData", PowerPointHelper.GetXmlnsManager(doc.NameTable));
|
|
|
+ if (types != null)
|
|
|
+ {
|
|
|
+ int size = types.Count;
|
|
|
+ for (int i = 0; i < size; i++)
|
|
|
+ {
|
|
|
+ XmlNode node = types.Item(i);
|
|
|
+ doc.LoadXml(node.OuterXml);
|
|
|
+ XmlNode id = doc.SelectSingleNode("./xmlData/@id", PowerPointHelper.GetXmlnsManager(doc.NameTable));
|
|
|
+ if (id.Value.Equals(idxNode.Value))
|
|
|
+ {
|
|
|
+ XmlDocument nodeDoc = new XmlDocument();
|
|
|
+ nodeDoc.LoadXml(types.Item(i).OuterXml);
|
|
|
+ slideLayoutSpNode = nodeDoc;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ doc.LoadXml(slideMasterTables.IdxTable.OuterXml);
|
|
|
+ types = doc.SelectNodes("//xmlDatas/xmlData", PowerPointHelper.GetXmlnsManager(doc.NameTable));
|
|
|
+ if (types != null)
|
|
|
+ {
|
|
|
+ int size = types.Count;
|
|
|
+ for (int i = 0; i < size; i++)
|
|
|
+ {
|
|
|
+ XmlNode node = types.Item(i);
|
|
|
+ doc.LoadXml(node.OuterXml);
|
|
|
+ XmlNode id = doc.SelectSingleNode("./xmlData/@id", PowerPointHelper.GetXmlnsManager(doc.NameTable));
|
|
|
+ if (id.Value.Equals(idxNode.Value))
|
|
|
+ {
|
|
|
+ XmlDocument nodeDoc = new XmlDocument();
|
|
|
+ nodeDoc.LoadXml(types.Item(i).OuterXml);
|
|
|
+ slideMasterSpNode = nodeDoc;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- if (typeNode == null)
|
|
|
+ if (typeNode == null )
|
|
|
{
|
|
|
- typeNode = slideLayoutSpNode.SelectSingleNode("//p:nvSpPr/p:nvPr/p:ph/@type", PowerPointHelper.GetXmlnsManager(slideLayoutSpNode.NameTable));
|
|
|
+ if (slideLayoutSpNode != null) {
|
|
|
+ typeNode = slideLayoutSpNode.SelectSingleNode("//p:nvSpPr/p:nvPr/p:ph/@type", PowerPointHelper.GetXmlnsManager(slideLayoutSpNode.NameTable));
|
|
|
+ }
|
|
|
//getTextByPathList(slideLayoutSpNode, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "type"]);
|
|
|
if (typeNode == null)
|
|
|
{
|
|
|
- typeNode = slideLayoutSpNode.SelectSingleNode("//p:nvSpPr/p:nvPr/p:ph/@type", PowerPointHelper.GetXmlnsManager(slideLayoutSpNode.NameTable));
|
|
|
+ if (slideMasterSpNode != null)
|
|
|
+ {
|
|
|
+ typeNode = slideMasterSpNode.SelectSingleNode("//p:nvSpPr/p:nvPr/p:ph/@type", PowerPointHelper.GetXmlnsManager(slideMasterSpNode.NameTable));
|
|
|
+ }
|
|
|
// typeNode = getTextByPathList(slideMasterSpNode, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "type"]);
|
|
|
}
|
|
|
}
|
|
|
- return null;
|
|
|
+ object s= GenShape(element, slidePart, slideMaster, colors, index, position, slideLayoutTables,
|
|
|
+ slideMasterTables, idNode, nameNode, idxNode, typeNode, slideLayoutSpNode, slideMasterSpNode , slideMasterTextStyles , theme);
|
|
|
+ return s;
|
|
|
}
|
|
|
/// <summary>
|
|
|
/// 处理图形的具体信息
|
|
@@ -269,8 +369,8 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
/// <param name="colors"></param>
|
|
|
/// <param name="index"></param>
|
|
|
/// <param name="position"></param>
|
|
|
- /// <param name="slideLayoutStyle"></param>
|
|
|
- /// <param name="slideMasterStyle"></param>
|
|
|
+ /// <param name="slideLayoutTables"></param>
|
|
|
+ /// <param name="slideMasterTables"></param>
|
|
|
/// <param name="idNode"></param>
|
|
|
/// <param name="nameNode"></param>
|
|
|
/// <param name="idxNode"></param>
|
|
@@ -280,16 +380,42 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
/// <returns></returns>
|
|
|
public object GenShape(DocumentFormat.OpenXml.Presentation.Shape element, SlidePart slidePart, SlideMaster slideMaster,
|
|
|
Dictionary<string, string> colors, int index, HiTeachCC.Model.PowerPoint.Position position,
|
|
|
- Style slideLayoutStyle,
|
|
|
- Style slideMasterStyle, XmlNode idNode, XmlNode nameNode, XmlNode idxNode, XmlNode typeNode, XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode)
|
|
|
+ Style slideLayoutTables,
|
|
|
+ Style slideMasterTables, XmlNode idNode, XmlNode nameNode, XmlNode idxNode, XmlNode typeNode,
|
|
|
+ XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode ,XmlDocument slideMasterTextStyles, Theme theme)
|
|
|
{
|
|
|
+
|
|
|
+ HiTeachCC.Model.PowerPoint.Shape shape = new HiTeachCC.Model.PowerPoint.Shape();
|
|
|
+ HiTeachCC.Model.PowerPoint.Position spPosition = null;
|
|
|
+ if (element.ShapeProperties != null)
|
|
|
+ {
|
|
|
+ Transform2D transform2D = element.ShapeProperties.Transform2D;
|
|
|
+ if (transform2D != null)
|
|
|
+ {
|
|
|
+ spPosition = PowerPointHelper.GetPositionByTransform2D(transform2D);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ DocumentFormat.OpenXml.Presentation.NonVisualShapeProperties nonVisualShapeProperties = element.NonVisualShapeProperties;
|
|
|
+
|
|
|
XmlDocument doc = new XmlDocument();
|
|
|
doc.LoadXml(element.OuterXml);
|
|
|
XmlNode shapeType = doc.SelectSingleNode("//p:spPr/a:prstGeom/@prst", PowerPointHelper.GetXmlnsManager(doc.NameTable));
|
|
|
if (shapeType != null)
|
|
|
{
|
|
|
- //常规图形
|
|
|
-
|
|
|
+ //常规图形
|
|
|
+ HiTeachCC.Model.PowerPoint.Position shapePosition = PowerPointHelper.GetPosition(element.OuterXml, slideLayoutSpNode, slideMasterSpNode);
|
|
|
+ Border border = PowerPointHelper.GetBorder(element.OuterXml, true, colors);
|
|
|
+ HiTeachCC.Model.PowerPoint.Fill fill = PowerPointHelper.GetShapeFill(element.OuterXml, colors);
|
|
|
+ var headEndTypeNode = doc.SelectSingleNode("//p:spPr/a:ln/a:headEnd/@type", PowerPointHelper.GetXmlnsManager(doc.NameTable));
|
|
|
+ var tailEndTypeNode = doc.SelectSingleNode("//p:spPr/a:ln/a:tailEnd/@type", PowerPointHelper.GetXmlnsManager(doc.NameTable));
|
|
|
+ PowerPointHelper.GenPPTXShape(shapeType);
|
|
|
+ shape.Position = shapePosition;
|
|
|
+ shape.Paragraph = GenTextBody(element.OuterXml, slideLayoutSpNode, slideMasterSpNode, typeNode, slideLayoutTables, slideMasterTables, slideMasterTextStyles, theme, slidePart ,colors);
|
|
|
+ shape.Fill = fill;
|
|
|
+ shape.Border = border;
|
|
|
+ shape.Type = "shape";
|
|
|
+ shape.ShapeType = shapeType.Value;
|
|
|
+ return shape;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -297,29 +423,166 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
if (shapeType != null)
|
|
|
{
|
|
|
//自定义图形 画线 轨迹
|
|
|
+
|
|
|
+ //常规图形
|
|
|
+ HiTeachCC.Model.PowerPoint.Position shapePosition = PowerPointHelper.GetPosition(element.OuterXml, slideLayoutSpNode, slideMasterSpNode);
|
|
|
+ Border border = PowerPointHelper.GetBorder(element.OuterXml, true, colors);
|
|
|
+ HiTeachCC.Model.PowerPoint.Fill fill = PowerPointHelper.GetShapeFill(element.OuterXml, colors);
|
|
|
+ var headEndTypeNode = doc.SelectSingleNode("//p:spPr/a:ln/a:headEnd/@type", PowerPointHelper.GetXmlnsManager(doc.NameTable));
|
|
|
+ var tailEndTypeNode = doc.SelectSingleNode("//p:spPr/a:ln/a:tailEnd/@type", PowerPointHelper.GetXmlnsManager(doc.NameTable));
|
|
|
+ PowerPointHelper.GenPPTXShape(shapeType);
|
|
|
+ shape.Position = shapePosition;
|
|
|
+ shape.Paragraph = GenTextBody(element.OuterXml, slideLayoutSpNode, slideMasterSpNode, typeNode,
|
|
|
+ slideLayoutTables, slideMasterTables, slideMasterTextStyles, theme, slidePart, colors);
|
|
|
+ shape.Fill = fill;
|
|
|
+ shape.Border = border;
|
|
|
+ shape.Type = "shape";
|
|
|
+ shape.ShapeType = "custom";
|
|
|
+ return shape;
|
|
|
}
|
|
|
else {
|
|
|
- //都不是的图形 如页眉 页脚
|
|
|
+ string align = PowerPointHelper.GetVerticalAlign(element, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles);
|
|
|
+ HiTeachCC.Model.PowerPoint.Position shapePosition = PowerPointHelper.GetPosition(element.OuterXml,slideLayoutSpNode,slideMasterSpNode);
|
|
|
+ Border border = PowerPointHelper.GetBorder(element.OuterXml, true, colors);
|
|
|
+ HiTeachCC.Model.PowerPoint.Fill fill = PowerPointHelper.GetShapeFill(element.OuterXml,colors);
|
|
|
+ shape.Position = shapePosition;
|
|
|
+ shape.Paragraph = GenTextBody(element.OuterXml, slideLayoutSpNode, slideMasterSpNode, typeNode,
|
|
|
+ slideLayoutTables, slideMasterTables, slideMasterTextStyles, theme, slidePart,colors);
|
|
|
+ shape.Fill = fill;
|
|
|
+ shape.Border = border;
|
|
|
+ shape.Type = "shape";
|
|
|
+ shape.ShapeType = "rect";
|
|
|
+ return shape;
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
- return null;
|
|
|
+ //return null;
|
|
|
}
|
|
|
- /// <summary>
|
|
|
- /// 获取位置信息
|
|
|
- /// </summary>
|
|
|
- /// <param name="transform2D"></param>
|
|
|
- /// <returns></returns>
|
|
|
- private static HiTeachCC.Model.PowerPoint.Position GetPositionByTransform2D(Transform2D transform2D)
|
|
|
- {
|
|
|
- HiTeachCC.Model.PowerPoint.Position spPosition = new HiTeachCC.Model.PowerPoint.Position();
|
|
|
- spPosition.Rot = transform2D.Rotation == null ? 0 : transform2D.Rotation.Value;
|
|
|
- spPosition.FlipH = transform2D.HorizontalFlip == null ? false : transform2D.HorizontalFlip.Value;
|
|
|
- spPosition.FlipV = transform2D.VerticalFlip == null ? false : transform2D.VerticalFlip.Value;
|
|
|
- spPosition.X = transform2D.Offset.X == null ? 0 : transform2D.Offset.X.Value;
|
|
|
- spPosition.Y = transform2D.Offset.Y == null ? 0 : transform2D.Offset.Y.Value;
|
|
|
- spPosition.Cx = transform2D.Extents.Cx == null ? 0 : transform2D.Extents.Cx.Value;
|
|
|
- spPosition.Cy = transform2D.Extents.Cy == null ? 0 : transform2D.Extents.Cy.Value;
|
|
|
- return spPosition;
|
|
|
+
|
|
|
+
|
|
|
+ public List<Paragraph> GenTextBody(string nodeXml, XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode,
|
|
|
+ XmlNode typeNode , Style slideLayoutTables,
|
|
|
+ Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme , SlidePart slidePart,Dictionary<string ,string> colors) {
|
|
|
+ List<Paragraph> paragraphs = new List<Paragraph>();
|
|
|
+ XmlDocument doc = new XmlDocument();
|
|
|
+ doc.LoadXml(nodeXml);
|
|
|
+ XmlNodeList pNodes = doc.SelectNodes("//p:txBody/child::* ",PowerPointHelper. GetXmlnsManager(doc.NameTable));
|
|
|
+ //XmlNodeList plvlNodes = doc.SelectNodes("//p:txBody/a:p/a:pPr/@lvl", PowerPointHelper.GetXmlnsManager(doc.NameTable));
|
|
|
+ //bool hasBuChar = false;
|
|
|
+ //if (plvlNodes != null && plvlNodes.Count > 0) {
|
|
|
+ // hasBuChar = true;
|
|
|
+ //}
|
|
|
+ if (pNodes != null) {
|
|
|
+ int size = pNodes.Count;
|
|
|
+ for (int i = 0; i < size; i++) {
|
|
|
+ XmlNode pNode = pNodes.Item(i);
|
|
|
+ if (!pNode.Name.Equals("a:p") )
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ XmlDocument pXmlNode = new XmlDocument();
|
|
|
+ pXmlNode.LoadXml(pNode.OuterXml);
|
|
|
+ //XmlDocument docNode = new XmlDocument();
|
|
|
+ //docNode.LoadXml(pNode.OuterXml);
|
|
|
+ string HorizontalAlign= PowerPointHelper.GetHorizontalAlign(pXmlNode , slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles);
|
|
|
+ Paragraph paragraph = new Paragraph();
|
|
|
+ ParagraphStyle paragraphStyle = new ParagraphStyle { Alignment = HorizontalAlign };
|
|
|
+ XmlNodeList pPrNodes = pXmlNode.SelectNodes("//a:pPr", PowerPointHelper.GetXmlnsManager(pXmlNode.NameTable));
|
|
|
+ BuChar buChar= PowerPointHelper.GenBuChar(pXmlNode, slideLayoutTables , slideMasterTables, slideMasterTextStyles , typeNode);
|
|
|
+ paragraph.BuChar = buChar;
|
|
|
+ paragraph.ParagraphStyle = paragraphStyle;
|
|
|
+
|
|
|
+ XmlNodeList rNodes = pXmlNode.SelectNodes("//a:r", PowerPointHelper.GetXmlnsManager(pXmlNode.NameTable));
|
|
|
+ if (null == rNodes)
|
|
|
+ {
|
|
|
+ XmlDocument rNode = new XmlDocument();
|
|
|
+ rNode.LoadXml(pNode.OuterXml);
|
|
|
+ paragraph.Texts.Add(GenSpanElement(rNode, slideLayoutSpNode, slideMasterSpNode,typeNode,slideMasterTextStyles, theme, slidePart ,colors) );
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ int rsize = rNodes.Count;
|
|
|
+ for (int ri = 0; ri < rsize; ri++) {
|
|
|
+
|
|
|
+ XmlDocument rNode = new XmlDocument() ;
|
|
|
+ rNode.LoadXml(rNodes.Item(ri).OuterXml);
|
|
|
+ paragraph.Texts.Add(GenSpanElement(rNode, slideLayoutSpNode, slideMasterSpNode, typeNode, slideMasterTextStyles,theme , slidePart ,colors));
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ paragraphs.Add(paragraph);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return paragraphs;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public Text GenSpanElement(XmlDocument nodeXml, XmlDocument slideLayoutSpNode, XmlDocument slideMasterSpNode, XmlNode typeNode,
|
|
|
+ XmlDocument slideMasterTextStyles, Theme theme, SlidePart slidePart ,Dictionary<string ,string> colors) {
|
|
|
+
|
|
|
+ XmlNode tNode = nodeXml.SelectSingleNode("//a:t", PowerPointHelper.GetXmlnsManager(nodeXml.NameTable));
|
|
|
+ /*
|
|
|
+ var text = node["a:t"];
|
|
|
+ if (typeof text !== 'string') {
|
|
|
+ text = getTextByPathList(node, ["a:fld", "a:t"]);
|
|
|
+ if (typeof text !== 'string') {
|
|
|
+ text = " ";
|
|
|
+ //debug("XXX: " + JSON.stringify(node));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ */
|
|
|
+ string color= PowerPointHelper.GetFontColor(nodeXml,typeNode,slideMasterTextStyles , colors);
|
|
|
+ int font_size = PowerPointHelper.GetFontSize(nodeXml,slideLayoutSpNode,slideMasterSpNode,typeNode, slideMasterTextStyles);
|
|
|
+ string font_family = PowerPointHelper.GetFontType(nodeXml, typeNode, slideMasterTextStyles, theme);
|
|
|
+ string font_weight = PowerPointHelper.GetFontBold(nodeXml,typeNode,slideMasterTextStyles);
|
|
|
+ string font_style = PowerPointHelper.GetFontItalic(nodeXml,typeNode,slideMasterTextStyles);
|
|
|
+ string text_decoration = PowerPointHelper.GetFontDecoration(nodeXml,typeNode,slideMasterTextStyles);
|
|
|
+ string vertical_align = PowerPointHelper.GetTextVerticalAlign(nodeXml,typeNode,slideMasterTextStyles);
|
|
|
+ FontStyle fontStyle = new FontStyle
|
|
|
+ {
|
|
|
+ Color = color,
|
|
|
+ Size = font_size,
|
|
|
+ Type = font_family,
|
|
|
+ Bold = font_weight,
|
|
|
+ Italic = font_style,
|
|
|
+ Decoration = text_decoration,
|
|
|
+ VerticalAlign = vertical_align
|
|
|
+ };
|
|
|
+ string styleText = "color:"+color+ ";font-size:"+ font_size +
|
|
|
+ ";font-family:" + font_family + ";font-weight:" + font_weight +
|
|
|
+ ";font-style:" + font_style + ";text-decoration:" + text_decoration +
|
|
|
+ ";vertical-align:" + vertical_align;
|
|
|
+ string cssName = "";
|
|
|
+ if (styleTable.TryGetValue(styleText, out Dictionary<string, string> css))
|
|
|
+ {
|
|
|
+ cssName = css["name"];
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ cssName = "_css_" + (styleTable.Keys.Count + 1);
|
|
|
+ styleTable.TryAdd(styleText, new Dictionary<string, string> { { "name", cssName } , { "text" ,styleText} });
|
|
|
+ }
|
|
|
+
|
|
|
+ Text text = new Text { Content=tNode.InnerText ,FontStyle=fontStyle};
|
|
|
+ XmlNode linkID = nodeXml.SelectSingleNode("//a:rPr/a:hlinkClick/@r:id", PowerPointHelper.GetXmlnsManager(nodeXml.NameTable));
|
|
|
+ if (linkID != null)
|
|
|
+ {
|
|
|
+ List< DocumentFormat.OpenXml.Packaging.HyperlinkRelationship > hyperlinkRelationships = slidePart.HyperlinkRelationships.ToList();
|
|
|
+ bool flag = true ;
|
|
|
+ foreach (var HyperlinkRelationship in hyperlinkRelationships){
|
|
|
+ if (HyperlinkRelationship.Id.Equals(linkID.Value)) {
|
|
|
+ text.Href = HyperlinkRelationship.Uri.ToString();
|
|
|
+ flag = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (flag) {
|
|
|
+ text.Href = "#";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ text.Href = null;
|
|
|
+ }
|
|
|
+ return text;
|
|
|
}
|
|
|
/// <summary>
|
|
|
/// 处理图片
|
|
@@ -330,14 +593,14 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
/// <param name="colors"></param>
|
|
|
/// <param name="index"></param>
|
|
|
/// <param name="position"></param>
|
|
|
- /// <param name="slideLayoutStyle"></param>
|
|
|
- /// <param name="slideMasterStyle"></param>
|
|
|
+ /// <param name="slideLayoutTables"></param>
|
|
|
+ /// <param name="slideMasterTables"></param>
|
|
|
/// <returns></returns>
|
|
|
public string ProcessPicNode(DocumentFormat.OpenXml.Presentation.Picture element,
|
|
|
SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> colors, int index,
|
|
|
HiTeachCC.Model.PowerPoint.Position position,
|
|
|
- Style slideLayoutStyle,
|
|
|
- Style slideMasterStyle)
|
|
|
+ Style slideLayoutTables,
|
|
|
+ Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme)
|
|
|
{
|
|
|
return null;
|
|
|
}
|
|
@@ -351,14 +614,14 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
/// <param name="colors"></param>
|
|
|
/// <param name="index"></param>
|
|
|
/// <param name="position"></param>
|
|
|
- /// <param name="slideLayoutStyle"></param>
|
|
|
- /// <param name="slideMasterStyle"></param>
|
|
|
+ /// <param name="slideLayoutTables"></param>
|
|
|
+ /// <param name="slideMasterTables"></param>
|
|
|
/// <returns></returns>
|
|
|
public string ProcessMcNode(DocumentFormat.OpenXml.AlternateContent element, SlidePart slidePart,
|
|
|
SlideMaster slideMaster, Dictionary<string, string> colors,
|
|
|
int index, HiTeachCC.Model.PowerPoint.Position position,
|
|
|
- Style slideLayoutStyle,
|
|
|
- Style slideMasterStyle)
|
|
|
+ Style slideLayoutTables,
|
|
|
+ Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme)
|
|
|
{
|
|
|
return null;
|
|
|
}
|
|
@@ -371,14 +634,14 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
/// <param name="colors"></param>
|
|
|
/// <param name="index"></param>
|
|
|
/// <param name="position"></param>
|
|
|
- /// <param name="slideLayoutStyle"></param>
|
|
|
- /// <param name="slideMasterStyle"></param>
|
|
|
+ /// <param name="slideLayoutTables"></param>
|
|
|
+ /// <param name="slideMasterTables"></param>
|
|
|
/// <returns></returns>
|
|
|
public string ProcessGraphicFrameNode(DocumentFormat.OpenXml.Presentation.GraphicFrame element,
|
|
|
SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> colors,
|
|
|
int index, HiTeachCC.Model.PowerPoint.Position position,
|
|
|
- Style slideLayoutStyle,
|
|
|
- Style slideMasterStyle)
|
|
|
+ Style slideLayoutTables,
|
|
|
+ Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme)
|
|
|
{
|
|
|
return null;
|
|
|
}
|
|
@@ -391,19 +654,19 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
/// <param name="colors"></param>
|
|
|
/// <param name="index"></param>
|
|
|
/// <param name="position"></param>
|
|
|
- /// <param name="slideLayoutStyle"></param>
|
|
|
- /// <param name="slideMasterStyle"></param>
|
|
|
+ /// <param name="slideLayoutTables"></param>
|
|
|
+ /// <param name="slideMasterTables"></param>
|
|
|
/// <returns></returns>
|
|
|
- public string ProcessGrpSpNode(DocumentFormat.OpenXml.Presentation.GroupShape element, SlidePart slidePart,
|
|
|
+ public object ProcessGrpSpNode(DocumentFormat.OpenXml.Presentation.GroupShape element, SlidePart slidePart,
|
|
|
SlideMaster slideMaster, Dictionary<string, string> colors, int index,
|
|
|
HiTeachCC.Model.PowerPoint.Position position,
|
|
|
- Style slideLayoutStyle,
|
|
|
- Style slideMasterStyle)
|
|
|
+ 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)
|
|
|
{
|
|
|
- string s = ProcessNodesInSlide(shape, slidePart, slideMaster, colors, index, position, slideLayoutStyle, slideMasterStyle);
|
|
|
+ object s = ProcessNodesInSlide(shape, slidePart, slideMaster, colors, index, position, slideLayoutTables, slideMasterTables , slideMasterTextStyles,theme);
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
@@ -417,14 +680,14 @@ namespace HiTeachCC.Service.PowerPoint.Implement
|
|
|
/// <param name="colors"></param>
|
|
|
/// <param name="index"></param>
|
|
|
/// <param name="position"></param>
|
|
|
- /// <param name="slideLayoutStyle"></param>
|
|
|
- /// <param name="slideMasterStyle"></param>
|
|
|
+ /// <param name="slideLayoutTables"></param>
|
|
|
+ /// <param name="slideMasterTables"></param>
|
|
|
/// <returns></returns>
|
|
|
public string ProcessCxnSpNode(DocumentFormat.OpenXml.Presentation.ConnectionShape element,
|
|
|
SlidePart slidePart, SlideMaster slideMaster, Dictionary<string, string> colors,
|
|
|
int index, HiTeachCC.Model.PowerPoint.Position position,
|
|
|
- Style slideLayoutStyle,
|
|
|
- Style slideMasterStyle)
|
|
|
+ Style slideLayoutTables,
|
|
|
+ Style slideMasterTables, XmlDocument slideMasterTextStyles, Theme theme)
|
|
|
{
|
|
|
return null;
|
|
|
}
|