|
@@ -18,6 +18,7 @@ using DocumentFormat.OpenXml.Drawing;
|
|
|
using DocumentFormat.OpenXml.Drawing.Charts;
|
|
|
using DocumentFormat.OpenXml.Office2010.Word.DrawingShape;
|
|
|
using DocumentFormat.OpenXml.Packaging;
|
|
|
+using HTEXLib.COMM;
|
|
|
using HTEXLib.COMM.Helpers;
|
|
|
using HTEXLib.DOCX.OpenXmlTool;
|
|
|
using HTEXLib.Helpers;
|
|
@@ -351,7 +352,7 @@ namespace OpenXmlPowerTools
|
|
|
|
|
|
foreach (var d in xhtml.DescendantsAndSelf())
|
|
|
{
|
|
|
-
|
|
|
+
|
|
|
var style = d.Annotation<Dictionary<string, string>>();
|
|
|
if (style == null)
|
|
|
continue;
|
|
@@ -368,11 +369,13 @@ namespace OpenXmlPowerTools
|
|
|
d.Add(st);
|
|
|
}
|
|
|
}
|
|
|
- if (htmlConverterSettings.TableInnerCss) {
|
|
|
+ if (htmlConverterSettings.TableInnerCss)
|
|
|
+ {
|
|
|
SetStyleElementValue(xhtml, htmlConverterSettings.GeneralCss + htmlConverterSettings.AdditionalCss);
|
|
|
foreach (var d in xhtml.DescendantsAndSelf())
|
|
|
{
|
|
|
- if (d.Name.LocalName.ToString().Equals("table") || d.Name.LocalName.ToString().Equals("tr") ||d.Name.LocalName.ToString().Equals("td")) {
|
|
|
+ if (d.Name.LocalName.ToString().Equals("table") || d.Name.LocalName.ToString().Equals("tr") || d.Name.LocalName.ToString().Equals("td"))
|
|
|
+ {
|
|
|
var style = d.Annotation<Dictionary<string, string>>();
|
|
|
if (style == null)
|
|
|
continue;
|
|
@@ -415,7 +418,7 @@ namespace OpenXmlPowerTools
|
|
|
{
|
|
|
var element = node as XElement;
|
|
|
if (element == null) return null;
|
|
|
-
|
|
|
+
|
|
|
// Transform the w:document element to the XHTML h:html element.
|
|
|
// The h:head element is laid out based on the W3C's recommended layout, i.e.,
|
|
|
// the charset (using the HTML5-compliant form), the title (which is always
|
|
@@ -535,49 +538,104 @@ namespace OpenXmlPowerTools
|
|
|
// Transform w:tr to h:tr.
|
|
|
if (element.Name == W.tr)
|
|
|
{
|
|
|
- return ProcessTableRow(wordDoc, settings, element, currentMarginLeft);
|
|
|
+ try
|
|
|
+ {
|
|
|
+ return ProcessTableRow(wordDoc, settings, element, currentMarginLeft);
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ throw new TransException(element, $"{element.Name}{ex.Message}", ex);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// Transform w:tc to h:td.
|
|
|
if (element.Name == W.tc)
|
|
|
{
|
|
|
- return ProcessTableCell(wordDoc, settings, element);
|
|
|
+ try
|
|
|
+ {
|
|
|
+ return ProcessTableCell(wordDoc, settings, element);
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ throw new TransException(element, $"{element.Name}{ex.Message}", ex);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// Transform images
|
|
|
if (element.Name == W.drawing || element.Name == W.pict || element.Name == W._object)
|
|
|
{
|
|
|
- XElement xElement = ProcessImage(wordDoc, element, settings.ImageHandler);
|
|
|
- return xElement;
|
|
|
+ try
|
|
|
+ {
|
|
|
+ XElement xElement = ProcessImage(wordDoc, element, settings.ImageHandler);
|
|
|
+ return xElement;
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ throw new TransException(element, $"{element.Name}{ex.Message}", ex);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// Transform content controls.
|
|
|
if (element.Name == W.sdt)
|
|
|
{
|
|
|
- return ProcessContentControl(wordDoc, settings, element, currentMarginLeft);
|
|
|
+ try
|
|
|
+ {
|
|
|
+ return ProcessContentControl(wordDoc, settings, element, currentMarginLeft);
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ throw new TransException(element, $"{element.Name}{ex.Message}", ex);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// Transform smart tags and simple fields.
|
|
|
if (element.Name == W.smartTag || element.Name == W.fldSimple)
|
|
|
{
|
|
|
- return CreateBorderDivs(wordDoc, settings, element.Elements());
|
|
|
+ try
|
|
|
+ {
|
|
|
+ return CreateBorderDivs(wordDoc, settings, element.Elements());
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ throw new TransException(element, $"{element.Name}{ex.Message}", ex);
|
|
|
+ }
|
|
|
}
|
|
|
//处理 数学公式
|
|
|
if (element.Name == M.oMath)
|
|
|
{
|
|
|
+ try
|
|
|
+ {
|
|
|
|
|
|
- return ProcessOMath(element);
|
|
|
+ return ProcessOMath(element);
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ throw new TransException(element, $"{element.Name}{ex.Message}", ex);
|
|
|
+ }
|
|
|
}
|
|
|
if (element.Name == M.oMathPara)
|
|
|
{
|
|
|
-
|
|
|
- return element.Elements().Select(e => ConvertToHtmlTransform(wordDoc, settings, e, false, currentMarginLeft));
|
|
|
+ try
|
|
|
+ {
|
|
|
+ return element.Elements().Select(e => ConvertToHtmlTransform(wordDoc, settings, e, false, currentMarginLeft));
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ throw new TransException(element, $"{element.Name}{ex.Message}", ex);
|
|
|
+ }
|
|
|
}
|
|
|
//处理形状
|
|
|
if (element.Name == MC.AlternateContent)
|
|
|
{
|
|
|
+ try
|
|
|
+ {
|
|
|
|
|
|
- return ProcessAlternateContent(wordDoc, element,settings.ImageHandler);
|
|
|
+ return ProcessAlternateContent(wordDoc, element, settings.ImageHandler);
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ throw new TransException(element, $"{element.Name}{ex.Message}", ex);
|
|
|
+ }
|
|
|
}
|
|
|
//if (element.Name == MC.Choice)
|
|
|
//{
|
|
@@ -594,21 +652,52 @@ namespace OpenXmlPowerTools
|
|
|
// Ignore element.
|
|
|
return null;
|
|
|
}
|
|
|
- public static XElement ProcessAlternateContent(WordprocessingDocument wordDoc, XElement element, Func<ImageInfo, XElement> imageHandler) {
|
|
|
+ public static XElement ProcessAlternateContent(WordprocessingDocument wordDoc, XElement element, Func<ImageInfo, XElement> imageHandler)
|
|
|
+ {
|
|
|
var drawing = element.Element(MC.Choice).Element(W.drawing).Element(WP.inline);
|
|
|
- if (drawing == null) {
|
|
|
+ if (drawing == null)
|
|
|
+ {
|
|
|
drawing = element.Element(MC.Choice).Element(W.drawing).Element(WP.anchor);
|
|
|
}
|
|
|
- var graphicData = drawing.Element(A.graphic).Element(A.graphicData).Elements() ;
|
|
|
-
|
|
|
- foreach (var elm in graphicData) {
|
|
|
- if (elm.Name==WPS.wsp)
|
|
|
+ var graphicData = drawing.Element(A.graphic).Element(A.graphicData).Elements();
|
|
|
+
|
|
|
+ foreach (var elm in graphicData)
|
|
|
+ {
|
|
|
+ if (elm.Name == WPS.wsp)
|
|
|
{
|
|
|
- var html = ProcessWps(wordDoc, elm, imageHandler);
|
|
|
+ (string html, HTEXLib.Shape shape) = ProcessWps(wordDoc, elm, imageHandler);
|
|
|
+ XElement img;
|
|
|
+ string mathxml = Globals.UnsupportedImage;
|
|
|
+ var imageInfo = new ImageInfo()
|
|
|
+ {
|
|
|
+ ContentType = "image/x-emf",
|
|
|
+ DrawingElement = element,
|
|
|
+ AltText = "UnsupportedImageError",
|
|
|
+ Mathxml = mathxml
|
|
|
+ };
|
|
|
+ double? widthInPoints = shape.style.position.cx;
|
|
|
+ double? heightInPoints = shape.style.position.cy;
|
|
|
+ img = imageHandler(imageInfo);
|
|
|
+ if (widthInPoints != null && heightInPoints != null)
|
|
|
+ {
|
|
|
+ //imageInfo.ImgStyleAttribute = new XAttribute("style",
|
|
|
+ // string.Format(NumberFormatInfo.InvariantInfo,
|
|
|
+ // "width: {0}pt; height: {1}pt ; vertical-align: bottom;", widthInPoints, heightInPoints));
|
|
|
+ img.SetAttributeValue("style", string.Format(NumberFormatInfo.InvariantInfo,
|
|
|
+ "width: {0}pt; height: {1}pt ; vertical-align: bottom;", widthInPoints, heightInPoints));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //imageInfo.ImgStyleAttribute = new XAttribute("style",
|
|
|
+ // string.Format(NumberFormatInfo.InvariantInfo,
|
|
|
+ // "vertical-align: middle;"));
|
|
|
+ img.SetAttributeValue("style", string.Format(NumberFormatInfo.InvariantInfo,
|
|
|
+ "vertical-align: middle;"));
|
|
|
+ }
|
|
|
XElement elmt = XElement.Parse(html);
|
|
|
- return elmt;
|
|
|
+ return img;
|
|
|
}
|
|
|
- else if (elm.Name==WPG.wgp)
|
|
|
+ else if (elm.Name == WPG.wgp)
|
|
|
{
|
|
|
return ProcessWgp(wordDoc, elm, imageHandler);
|
|
|
}
|
|
@@ -616,30 +705,60 @@ namespace OpenXmlPowerTools
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
- public static XElement ProcessWgp(WordprocessingDocument wordDoc, XElement element, Func<ImageInfo, XElement> imageHandler) {
|
|
|
- var extentCx = (int?)element.Elements(WP.extent)
|
|
|
- .Attributes(NoNamespace.cx).FirstOrDefault();
|
|
|
- var extentCy = (int?)element.Elements(WP.extent)
|
|
|
- .Attributes(NoNamespace.cy).FirstOrDefault();
|
|
|
- var elms= element.Descendants(WPS.wsp);
|
|
|
- StringBuilder stringBuilder = new StringBuilder();
|
|
|
- foreach (var elm in elms) {
|
|
|
- var emlt= ProcessWps(wordDoc, elm, imageHandler);
|
|
|
- stringBuilder.Append(emlt);
|
|
|
- }
|
|
|
- string svg = stringBuilder.ToString();
|
|
|
- svg = $"<div>{svg}</div>";
|
|
|
- XElement elmt = XElement.Parse(svg);
|
|
|
- return elmt;
|
|
|
+ public static XElement ProcessWgp(WordprocessingDocument wordDoc, XElement element, Func<ImageInfo, XElement> imageHandler)
|
|
|
+ {
|
|
|
+ var grpSpPr = element.Element(WPG.grpSpPr);
|
|
|
+ var ext = grpSpPr.GetWordNodeByPath("a:xfrm/a:ext");
|
|
|
+ var cx = ext.Attribute("cx").Value;
|
|
|
+ var cy = ext.Attribute("cy").Value;
|
|
|
+ //var elms= element.Descendants(WPS.wsp);
|
|
|
+ //StringBuilder stringBuilder = new StringBuilder();
|
|
|
+ //foreach (var elm in elms) {
|
|
|
+ // var emlt= ProcessWps(wordDoc, elm, imageHandler);
|
|
|
+ // stringBuilder.Append(emlt);
|
|
|
+ //}
|
|
|
+ //string svg = stringBuilder.ToString();
|
|
|
+ //svg = $"<div>{svg}</div>";
|
|
|
+ //XElement elmt = XElement.Parse(svg);
|
|
|
+
|
|
|
+ XElement img;
|
|
|
+ string mathxml = Globals.UnsupportedImage;
|
|
|
+ var imageInfo = new ImageInfo()
|
|
|
+ {
|
|
|
+ ContentType = "image/x-emf",
|
|
|
+ DrawingElement = element,
|
|
|
+ AltText = "UnsupportedImageError",
|
|
|
+ Mathxml = mathxml
|
|
|
+ };
|
|
|
+ double? widthInPoints = int.Parse(cx) * 96.0 / 914400;
|
|
|
+ double? heightInPoints = int.Parse(cy) * 96.0 / 914400;
|
|
|
+ img = imageHandler(imageInfo);
|
|
|
+ if (widthInPoints != null && heightInPoints != null)
|
|
|
+ {
|
|
|
+ //imageInfo.ImgStyleAttribute = new XAttribute("style",
|
|
|
+ // string.Format(NumberFormatInfo.InvariantInfo,
|
|
|
+ // "width: {0}pt; height: {1}pt ; vertical-align: bottom;", widthInPoints, heightInPoints));
|
|
|
+ img.SetAttributeValue("style", string.Format(NumberFormatInfo.InvariantInfo,
|
|
|
+ "width: {0}pt; height: {1}pt ; vertical-align: bottom;", widthInPoints, heightInPoints));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //imageInfo.ImgStyleAttribute = new XAttribute("style",
|
|
|
+ // string.Format(NumberFormatInfo.InvariantInfo,
|
|
|
+ // "vertical-align: middle;"));
|
|
|
+ img.SetAttributeValue("style", string.Format(NumberFormatInfo.InvariantInfo,
|
|
|
+ "vertical-align: middle;"));
|
|
|
+ }
|
|
|
+ return img;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
public static XElement ProcessChart(WordprocessingDocument wordDoc, XElement containerElement, Func<ImageInfo, XElement> imageHandler,
|
|
|
int? extentCx, int? extentCy, string altText, XElement element, string hyperlinkUri)
|
|
|
{
|
|
|
- var ird= element.Attribute(R.id);
|
|
|
- var chartird= wordDoc.MainDocumentPart.Parts.FirstOrDefault(pp => pp.RelationshipId == ird.Value);
|
|
|
- ChartPart chartPart= wordDoc.MainDocumentPart.ChartParts.Where(x => x.Uri.ToString() == chartird.OpenXmlPart.Uri.ToString()).FirstOrDefault<ChartPart>();
|
|
|
+ var ird = element.Attribute(R.id);
|
|
|
+ var chartird = wordDoc.MainDocumentPart.Parts.FirstOrDefault(pp => pp.RelationshipId == ird.Value);
|
|
|
+ ChartPart chartPart = wordDoc.MainDocumentPart.ChartParts.Where(x => x.Uri.ToString() == chartird.OpenXmlPart.Uri.ToString()).FirstOrDefault<ChartPart>();
|
|
|
if (chartPart != null)
|
|
|
{
|
|
|
ChartColorStylePart ChartColorStylePart = null;
|
|
@@ -664,7 +783,7 @@ namespace OpenXmlPowerTools
|
|
|
if (child is DocumentFormat.OpenXml.Office2013.Drawing.ChartStyle.StyleEntry StyleEntry)
|
|
|
{
|
|
|
|
|
|
- // DoStyleEntry(StyleEntry);
|
|
|
+ // DoStyleEntry(StyleEntry);
|
|
|
}
|
|
|
///OfficeArtExtensionList cs: extLst
|
|
|
// MarkerLayoutProperties cs: dataPointMarkerLayout
|
|
@@ -672,56 +791,85 @@ namespace OpenXmlPowerTools
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- HTEXLib. Chart charts = DrawChart(wordDoc,chartPart.ChartSpace,element,imageHandler,null);
|
|
|
- // charts.links = slide.hyperlinks;
|
|
|
- // return new List<Item> { charts };
|
|
|
+ HTEXLib.Chart charts = DrawChart(wordDoc, chartPart.ChartSpace, element, imageHandler, null);
|
|
|
+ // charts.links = slide.hyperlinks;
|
|
|
+ // return new List<Item> { charts };
|
|
|
+ XElement img = null;
|
|
|
+ string mathxml = Globals.UnsupportedImage;
|
|
|
+ var imageInfo = new ImageInfo()
|
|
|
+ {
|
|
|
+ ContentType = "image/x-emf",
|
|
|
+ DrawingElement = element,
|
|
|
+ AltText = "UnsupportedImageError",
|
|
|
+ Mathxml = mathxml
|
|
|
+ };
|
|
|
+ img = imageHandler(imageInfo);
|
|
|
+ double? widthInPoints = extentCx * 96.0 / 914400;
|
|
|
+ double? heightInPoints = extentCy * 96.0 / 914400;
|
|
|
+ if (widthInPoints != null && heightInPoints != null)
|
|
|
+ {
|
|
|
+ //imageInfo.ImgStyleAttribute = new XAttribute("style",
|
|
|
+ // string.Format(NumberFormatInfo.InvariantInfo,
|
|
|
+ // "width: {0}pt; height: {1}pt ; vertical-align: bottom;", widthInPoints, heightInPoints));
|
|
|
+ img.SetAttributeValue("style", string.Format(NumberFormatInfo.InvariantInfo,
|
|
|
+ "width: {0}pt; height: {1}pt ; vertical-align: bottom;", widthInPoints, heightInPoints));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //imageInfo.ImgStyleAttribute = new XAttribute("style",
|
|
|
+ // string.Format(NumberFormatInfo.InvariantInfo,
|
|
|
+ // "vertical-align: middle;"));
|
|
|
+ img.SetAttributeValue("style", string.Format(NumberFormatInfo.InvariantInfo,
|
|
|
+ "vertical-align: middle;"));
|
|
|
+ }
|
|
|
+ return img;
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
- public static HTEXLib.Chart DrawChart(WordprocessingDocument wordDoc, DocumentFormat.OpenXml.Drawing.Charts.ChartSpace chartSpace,XElement element, Func<ImageInfo, XElement> ImageHandler, HTEXLib.Position positionc)
|
|
|
+
|
|
|
+
|
|
|
+ public static HTEXLib.Chart DrawChart(WordprocessingDocument wordDoc, DocumentFormat.OpenXml.Drawing.Charts.ChartSpace chartSpace, XElement element, Func<ImageInfo, XElement> ImageHandler, HTEXLib.Position positionc)
|
|
|
{
|
|
|
var Chart = chartSpace.GetFirstChild<DocumentFormat.OpenXml.Drawing.Charts.Chart>();
|
|
|
var ShapeProperties = chartSpace.GetFirstChild<DocumentFormat.OpenXml.Drawing.Charts.ShapeProperties>();
|
|
|
- HTEXLib.Models.HTEX.ShapeStyle shapeStyleChart = WORDHelper.DoShapeProperties(wordDoc ,ShapeProperties, element, ImageHandler, positionc);
|
|
|
+ HTEXLib.Models.HTEX.ShapeStyle shapeStyleChart = WORDHelper.DoShapeProperties(wordDoc, ShapeProperties, element, ImageHandler, positionc);
|
|
|
var TextProperties = chartSpace.GetFirstChild<TextProperties>();
|
|
|
var style = chartSpace.GetFirstChild<DocumentFormat.OpenXml.Drawing.Charts.Style>();
|
|
|
var ColorMapOverride = chartSpace.GetFirstChild<DocumentFormat.OpenXml.Drawing.Charts.ColorMapOverride>();
|
|
|
var style2010 = chartSpace.GetFirstChild<DocumentFormat.OpenXml.Office2010.Drawing.Charts.Style>();
|
|
|
var UserShapesReference = chartSpace.GetFirstChild<UserShapesReference>();
|
|
|
- var charts = DoPlotArea(Chart.PlotArea,wordDoc,element, ImageHandler,positionc);
|
|
|
- HTEXLib.Models.HTEX. ShapeStyle shapeStyle = null;
|
|
|
+ var charts = DoPlotArea(Chart.PlotArea, wordDoc, element, ImageHandler, positionc);
|
|
|
+ HTEXLib.Models.HTEX.ShapeStyle shapeStyle = null;
|
|
|
if (Chart.Title != null)
|
|
|
{
|
|
|
var ChartShapeProperties = Chart.Title.ChartShapeProperties;
|
|
|
- shapeStyle = WORDHelper.DoShapeProperties(wordDoc, ChartShapeProperties, element, ImageHandler, positionc);
|
|
|
+ shapeStyle = WORDHelper.DoShapeProperties(wordDoc, ChartShapeProperties, element, ImageHandler, positionc);
|
|
|
}
|
|
|
- // var (PPTParagraphs, tBody) = DoChartTitle(Chart.Title);
|
|
|
+ // var (PPTParagraphs, tBody) = DoChartTitle(Chart.Title);
|
|
|
//TextBody textBody = DrawText(PPTParagraphs, tBody);
|
|
|
|
|
|
//Shape shape= new Shape { type = "Sp",uid ="Sp-" +ShaHashHelper.GetSHA1(slide.slideIndex + "-" + (Chart.Title.GetType().Name + Chart.Title.OuterXml).Trim().ToLower()), shapeType = "rect",
|
|
|
// textBody = textBody , sid = sid + "titel" };
|
|
|
- HTEXLib. Shape shape = new HTEXLib.Shape
|
|
|
- {
|
|
|
+ HTEXLib.Shape shape = new HTEXLib.Shape
|
|
|
+ {
|
|
|
type = "Sp",
|
|
|
uid = Guid.NewGuid().ToString(),
|
|
|
shapeType = "rect",
|
|
|
- // textBody = textBody,
|
|
|
- // sid = sid + "titel"
|
|
|
+ // textBody = textBody,
|
|
|
+ // sid = sid + "titel"
|
|
|
};
|
|
|
shape.style.fill = shapeStyle != null ? shapeStyle.fill : null;
|
|
|
shape.style.border = shapeStyle != null ? shapeStyle.border : null;
|
|
|
//var chart= new Chart {sid=sid,charts =charts,title=shape,type=type,uid = type+"-"+ ShaHashHelper.GetSHA1(slide.slideIndex + "-" + (Chart.GetType().Name + Chart.OuterXml).Trim().ToLower()) };
|
|
|
var chart = new HTEXLib.Chart
|
|
|
{
|
|
|
- // sid = sid,
|
|
|
+ // sid = sid,
|
|
|
charts = charts,
|
|
|
title = shape,
|
|
|
- // type = type,
|
|
|
+ // type = type,
|
|
|
uid = Guid.NewGuid().ToString(),
|
|
|
};
|
|
|
- HTEXLib.Position position = new HTEXLib.Position { /*cx = width, cy = height, x = left, y = top, rot = rot */};
|
|
|
+ HTEXLib.Position position = new HTEXLib.Position { /*cx = width, cy = height, x = left, y = top, rot = rot */};
|
|
|
chart.style.position = position;
|
|
|
chart.style.fill = shapeStyleChart != null ? shapeStyleChart.fill : null;
|
|
|
chart.style.border = shapeStyleChart != null ? shapeStyleChart.border : null;
|
|
@@ -753,7 +901,7 @@ namespace OpenXmlPowerTools
|
|
|
}
|
|
|
return chart;
|
|
|
}
|
|
|
- public static List<HTEXLib. CommonChart> DoPlotArea(PlotArea plotArea, WordprocessingDocument wordDoc, XElement element, Func<ImageInfo, XElement> ImageHandler, HTEXLib.Position positionc)
|
|
|
+ public static List<HTEXLib.CommonChart> DoPlotArea(PlotArea plotArea, WordprocessingDocument wordDoc, XElement element, Func<ImageInfo, XElement> ImageHandler, HTEXLib.Position positionc)
|
|
|
{
|
|
|
List<HTEXLib.CommonChart> charts = new List<HTEXLib.CommonChart>();
|
|
|
foreach (var child in plotArea.ChildElements)
|
|
@@ -782,8 +930,8 @@ namespace OpenXmlPowerTools
|
|
|
pieChart.pieType += "-" + ofPieType.Attribute("val").Value;
|
|
|
}
|
|
|
}
|
|
|
- serNodes = HTEXLib.ShapeHelper.GetPPTXNodeListByPath(child, "c:ser") ;
|
|
|
- pieChart.datas = ExtractChartData(serNodes,wordDoc,element, ImageHandler, positionc);
|
|
|
+ serNodes = HTEXLib.ShapeHelper.GetPPTXNodeListByPath(child, "c:ser");
|
|
|
+ pieChart.datas = ExtractChartData(serNodes, wordDoc, element, ImageHandler, positionc);
|
|
|
charts.Add(pieChart);
|
|
|
break;
|
|
|
case "lineChart":
|
|
@@ -978,14 +1126,14 @@ namespace OpenXmlPowerTools
|
|
|
if (spPr != null)
|
|
|
{
|
|
|
var ChartShapeProperties = new ChartShapeProperties(spPr.ToString());
|
|
|
- HTEXLib.Models.HTEX. ShapeStyle shapeStyle = WORDHelper.DoShapeProperties(wordDoc,ChartShapeProperties,element, ImageHandler, positionc);
|
|
|
+ HTEXLib.Models.HTEX.ShapeStyle shapeStyle = WORDHelper.DoShapeProperties(wordDoc, ChartShapeProperties, element, ImageHandler, positionc);
|
|
|
dict.Add("colStyle", shapeStyle);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
dict.Add("colStyle", null);
|
|
|
}
|
|
|
- var colNameNode = HTEXLib.ShapeHelper.GetPPTXNodeByPath(node,"c:tx/c:strRef/c:strCache/c:pt/c:v");
|
|
|
+ var colNameNode = HTEXLib.ShapeHelper.GetPPTXNodeByPath(node, "c:tx/c:strRef/c:strCache/c:pt/c:v");
|
|
|
if (colNameNode != null)
|
|
|
{
|
|
|
dict.Add("colName", colNameNode.Value);
|
|
@@ -1029,11 +1177,40 @@ namespace OpenXmlPowerTools
|
|
|
{
|
|
|
var rdm = element.Attribute(R.dm);
|
|
|
var dgm = wordDoc.MainDocumentPart.Parts.FirstOrDefault(pp => pp.RelationshipId == rdm.Value);
|
|
|
- return null;
|
|
|
+ XElement img = null;
|
|
|
+ string mathxml = Globals.UnsupportedImage;
|
|
|
+ var imageInfo = new ImageInfo()
|
|
|
+ {
|
|
|
+ ContentType = "image/x-emf",
|
|
|
+ DrawingElement = element,
|
|
|
+ AltText = "UnsupportedImageError",
|
|
|
+ Mathxml = mathxml
|
|
|
+ };
|
|
|
+ img = imageHandler(imageInfo);
|
|
|
+ double? widthInPoints = extentCx * 96.0 / 914400;
|
|
|
+ double? heightInPoints = extentCy * 96.0 / 914400;
|
|
|
+ if (widthInPoints != null && heightInPoints != null)
|
|
|
+ {
|
|
|
+ //imageInfo.ImgStyleAttribute = new XAttribute("style",
|
|
|
+ // string.Format(NumberFormatInfo.InvariantInfo,
|
|
|
+ // "width: {0}pt; height: {1}pt ; vertical-align: bottom;", widthInPoints, heightInPoints));
|
|
|
+ img.SetAttributeValue("style", string.Format(NumberFormatInfo.InvariantInfo,
|
|
|
+ "width: {0}pt; height: {1}pt ; vertical-align: bottom;", widthInPoints, heightInPoints));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //imageInfo.ImgStyleAttribute = new XAttribute("style",
|
|
|
+ // string.Format(NumberFormatInfo.InvariantInfo,
|
|
|
+ // "vertical-align: middle;"));
|
|
|
+ img.SetAttributeValue("style", string.Format(NumberFormatInfo.InvariantInfo,
|
|
|
+ "vertical-align: middle;"));
|
|
|
+ }
|
|
|
+ return img;
|
|
|
}
|
|
|
- public static string ProcessWps(WordprocessingDocument wordDoc, XElement element, Func<ImageInfo, XElement> imageHandler) {
|
|
|
+ public static (string html, HTEXLib.Shape shape) ProcessWps(WordprocessingDocument wordDoc, XElement element, Func<ImageInfo, XElement> imageHandler)
|
|
|
+ {
|
|
|
|
|
|
- // var wps = element.Element(MC.Choice).Element(W.drawing).Element(WP.anchor).Element(A.graphic).Element(A.graphicData).Element(WPS.wsp);
|
|
|
+ // var wps = element.Element(MC.Choice).Element(W.drawing).Element(WP.anchor).Element(A.graphic).Element(A.graphicData).Element(WPS.wsp);
|
|
|
WordprocessingShape wsp = new WordprocessingShape(element.ToString());
|
|
|
var ext = element.GetWordNodeByPath("wps:spPr/a:xfrm/a:ext");
|
|
|
var cx = ext.Attribute("cx").Value;
|
|
@@ -1043,7 +1220,8 @@ namespace OpenXmlPowerTools
|
|
|
shape.style.position = position;
|
|
|
var ShapeStyle = WORDHelper.DoShapeProperties(wordDoc, wsp.GetFirstChild<DocumentFormat.OpenXml.Office2010.Word.DrawingShape.ShapeProperties>(), element, imageHandler, position);
|
|
|
SlideColor slideColor = WORDHelper.DoShapeStyle(wsp.GetFirstChild<DocumentFormat.OpenXml.Office2010.Word.DrawingShape.ShapeStyle>(), wordDoc);
|
|
|
- if (ShapeStyle.border != null) {
|
|
|
+ if (ShapeStyle.border != null)
|
|
|
+ {
|
|
|
shape.style.border = ShapeStyle.border;
|
|
|
}
|
|
|
//从ShapeProperties 获取 p:spPr
|
|
@@ -1060,7 +1238,7 @@ namespace OpenXmlPowerTools
|
|
|
else
|
|
|
{
|
|
|
shape.style.border = ShapeStyle.border;
|
|
|
- shape.style.border.outline = ShapeStyle.border != null && ShapeStyle.border.outline != null ? ShapeStyle.border.outline : ShapeStyle.border.outline != null? ShapeStyle.border.outline:null;
|
|
|
+ shape.style.border.outline = ShapeStyle.border != null && ShapeStyle.border.outline != null ? ShapeStyle.border.outline : ShapeStyle.border.outline != null ? ShapeStyle.border.outline : null;
|
|
|
}
|
|
|
if (ShapeStyle.fill == null || ShapeStyle.fill.type == -1)
|
|
|
{
|
|
@@ -1104,21 +1282,23 @@ namespace OpenXmlPowerTools
|
|
|
}
|
|
|
|
|
|
}
|
|
|
- return DrawingShape(shape ,pars);
|
|
|
+ return (DrawingShape(shape, pars), shape);
|
|
|
}
|
|
|
|
|
|
- public static string DrawingShape(HTEXLib.Shape shape,List<string> pars) {
|
|
|
-
|
|
|
+ public static string DrawingShape(HTEXLib.Shape shape, List<string> pars)
|
|
|
+ {
|
|
|
+
|
|
|
StringBuilder builder = new StringBuilder();
|
|
|
if (shape.svg != null)
|
|
|
{
|
|
|
builder.Append($"<svg xmlns='http://www.w3.org/2000/svg' style='width:{shape.style.position.cx}px;height:{shape.style.position.cy}px;rotate({shape.style.position.rot}deg); overflow: visible;'>");
|
|
|
-
|
|
|
+
|
|
|
string bdc = shape.style.border != null && shape.style.border.color != null && shape.style.border.color.solidFill != null ? shape.style.border.color.solidFill : "none";
|
|
|
- string bds = shape.style.border != null && shape.style.border.stroke != null ? shape.style.border.stroke : "0";
|
|
|
+ string bds = shape.style.border != null && shape.style.border.stroke != null ? shape.style.border.stroke : "0";
|
|
|
double? bdw = shape.style.border != null && shape.style.border.outline != null && shape.style.border.outline.width != null ? shape.style.border.outline.width : 0;
|
|
|
string bgc = shape.style.fill != null && shape.style.fill != null && shape.style.fill.solidFill != null ? shape.style.fill.solidFill : "none";
|
|
|
- if (shape.style.border!=null&&(shape.style.border.tailEnd != null || shape.style.border.headEnd != null)) {
|
|
|
+ if (shape.style.border != null && (shape.style.border.tailEnd != null || shape.style.border.headEnd != null))
|
|
|
+ {
|
|
|
builder.Append("<defs xmlns='http://www.w3.org/2000/svg'>");
|
|
|
builder.Append($"<marker id='marker{shape.uid}' viewBox='0 0 20 20' refX='1' refY='10' markerWidth='10' markerHeight='20' stroke='{bdc}' fill='{bdc}' orient='auto-start-reverse' markerUnits='strokeWidth'><path d='M 0 0 L 20 10 L 0 20 z' /></marker>");
|
|
|
builder.Append("</defs>");
|
|
@@ -1126,8 +1306,9 @@ namespace OpenXmlPowerTools
|
|
|
|
|
|
string stm = "";
|
|
|
string edm = "";
|
|
|
- if (shape.style.border!=null&&shape.style.border.headEnd != null) {
|
|
|
- stm= $" marker-start='url(#marker{ shape.uid})'" ;
|
|
|
+ if (shape.style.border != null && shape.style.border.headEnd != null)
|
|
|
+ {
|
|
|
+ stm = $" marker-start='url(#marker{ shape.uid})'";
|
|
|
}
|
|
|
if (shape.style.border != null && shape.style.border.tailEnd != null)
|
|
|
{
|
|
@@ -1140,7 +1321,7 @@ namespace OpenXmlPowerTools
|
|
|
}
|
|
|
builder.Append("</svg>");
|
|
|
}
|
|
|
- return builder.ToString() ;
|
|
|
+ return builder.ToString();
|
|
|
}
|
|
|
public static XElement ProcessOMath(XElement element)
|
|
|
{
|
|
@@ -1175,7 +1356,7 @@ namespace OpenXmlPowerTools
|
|
|
|
|
|
}
|
|
|
}
|
|
|
- officeML= officeML.Replace("mml:", "");
|
|
|
+ officeML = officeML.Replace("mml:", "");
|
|
|
XElement officeElement = XElement.Load(new StringReader(officeML));
|
|
|
return officeElement;
|
|
|
}
|
|
@@ -3670,9 +3851,9 @@ namespace OpenXmlPowerTools
|
|
|
}
|
|
|
if (element.Name == W.pict || element.Name == W._object)
|
|
|
{
|
|
|
- return ProcessPictureOrObject(wordDoc, element , imageHandler);
|
|
|
+ return ProcessPictureOrObject(wordDoc, element, imageHandler);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
return null;
|
|
|
}
|
|
|
|
|
@@ -3711,14 +3892,14 @@ namespace OpenXmlPowerTools
|
|
|
if (containerElement.Elements(A.graphic)
|
|
|
.Elements(A.graphicData) != null)
|
|
|
{
|
|
|
- XElement rest = null;
|
|
|
+ XElement rest = null;
|
|
|
var elms = containerElement.Elements(A.graphic)
|
|
|
.Elements(A.graphicData).Elements();
|
|
|
foreach (var elm in elms)
|
|
|
{
|
|
|
if (elm.Name == Pic._pic)
|
|
|
{
|
|
|
- rest= ProcessPic(wordDoc, containerElement, imageHandler, extentCx, extentCy, altText, elm, hyperlinkUri);
|
|
|
+ rest = ProcessPic(wordDoc, containerElement, imageHandler, extentCx, extentCy, altText, elm, hyperlinkUri);
|
|
|
break;
|
|
|
}
|
|
|
if (elm.Name == C.chart)
|
|
@@ -3735,14 +3916,16 @@ namespace OpenXmlPowerTools
|
|
|
}
|
|
|
return rest;
|
|
|
}
|
|
|
- else {
|
|
|
+ else
|
|
|
+ {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
|
|
|
}
|
|
|
- public static XElement ProcessPic(WordprocessingDocument wordDoc, XElement containerElement, Func<ImageInfo, XElement> imageHandler,
|
|
|
- int? extentCx,int? extentCy,string altText, XElement element,string hyperlinkUri) {
|
|
|
+ public static XElement ProcessPic(WordprocessingDocument wordDoc, XElement containerElement, Func<ImageInfo, XElement> imageHandler,
|
|
|
+ int? extentCx, int? extentCy, string altText, XElement element, string hyperlinkUri)
|
|
|
+ {
|
|
|
var blipFill = containerElement.Elements(A.graphic)
|
|
|
.Elements(A.graphicData)
|
|
|
.Elements(Pic._pic).Elements(Pic.blipFill).FirstOrDefault();
|
|
@@ -3771,7 +3954,7 @@ namespace OpenXmlPowerTools
|
|
|
if (!ImageContentTypes.Contains(contentType))
|
|
|
return null;
|
|
|
|
|
|
- var uil= imagePart.Uri;
|
|
|
+ var uil = imagePart.Uri;
|
|
|
//WORDHelper.GetWordNodeByPath(wordDoc,"");
|
|
|
var Stream = imagePart.GetStream();
|
|
|
try
|
|
@@ -3846,17 +4029,19 @@ namespace OpenXmlPowerTools
|
|
|
new XAttribute(NoNamespace.alt, "wrong image"));
|
|
|
return img;
|
|
|
}
|
|
|
- finally {
|
|
|
+ finally
|
|
|
+ {
|
|
|
Stream.Close();
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
- public static XElement ProcessWmf(Stream stream,string contentType, XElement element, string hyperlinkUri ,Func<ImageInfo, XElement> imageHandler)
|
|
|
+ public static XElement ProcessWmf(Stream stream, string contentType, XElement element, string hyperlinkUri, Func<ImageInfo, XElement> imageHandler)
|
|
|
{
|
|
|
|
|
|
XElement img = null;
|
|
|
- string mathxml = "";
|
|
|
+ string base64 = "";
|
|
|
+ string altText = "";
|
|
|
if (contentType.Equals("image/x-wmf"))
|
|
|
{
|
|
|
bool compatible = false;
|
|
@@ -3865,7 +4050,7 @@ namespace OpenXmlPowerTools
|
|
|
WMFConverter.Svg.SvgGdi gdi = new WMFConverter.Svg.SvgGdi(compatible);
|
|
|
gdi.ReplaceSymbolFont = replaceSymbolFont;
|
|
|
parser.Parse(stream, gdi);
|
|
|
- mathxml = gdi.Document.InnerXml;
|
|
|
+ base64 = gdi.Document.InnerXml;
|
|
|
}
|
|
|
else if (contentType.Equals("image/x-emf"))
|
|
|
{
|
|
@@ -3887,7 +4072,10 @@ namespace OpenXmlPowerTools
|
|
|
//memoryStream.Close();
|
|
|
//memoryStream.Dispose();
|
|
|
//mathxml = Convert.ToBase64String(arr);
|
|
|
- mathxml = "EmfBase64ConvertError";
|
|
|
+ //mathxml = "EmfBase64ConvertError";
|
|
|
+ base64 = Globals.UnsupportedImage;
|
|
|
+ contentType = "image/x-emf";
|
|
|
+ altText = "UnsupportedImageError";
|
|
|
}
|
|
|
try
|
|
|
{
|
|
@@ -3895,19 +4083,20 @@ namespace OpenXmlPowerTools
|
|
|
{
|
|
|
ContentType = contentType,
|
|
|
DrawingElement = element,
|
|
|
- AltText = "",
|
|
|
- Mathxml = mathxml
|
|
|
+ AltText = altText,
|
|
|
+ Mathxml = base64
|
|
|
};
|
|
|
var style = (string)element.Elements(VML.shape).Attributes("style").FirstOrDefault();
|
|
|
|
|
|
float? widthInPoints = null;
|
|
|
float? heightInPoints = null;
|
|
|
- if (style != null) {
|
|
|
+ if (style != null)
|
|
|
+ {
|
|
|
var tokens = style.Split(';');
|
|
|
widthInPoints = WidthInPoints(tokens);
|
|
|
heightInPoints = HeightInPoints(tokens);
|
|
|
}
|
|
|
- img =imageHandler(imageInfo);
|
|
|
+ img = imageHandler(imageInfo);
|
|
|
//var imgElement2 = imageHandler(imageInfo);
|
|
|
if (widthInPoints != null && heightInPoints != null)
|
|
|
{
|
|
@@ -3942,7 +4131,7 @@ namespace OpenXmlPowerTools
|
|
|
{
|
|
|
throw new Exception(e.StackTrace);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
private static XElement ProcessPictureOrObject(WordprocessingDocument wordDoc,
|
|
|
XElement element, Func<ImageInfo, XElement> imageHandler)
|
|
@@ -3950,7 +4139,7 @@ namespace OpenXmlPowerTools
|
|
|
var imageRid = (string)element.Elements(VML.shape).Elements(VML.imagedata).Attributes(R.id).FirstOrDefault();
|
|
|
if (imageRid == null) return null;
|
|
|
var pp = wordDoc.MainDocumentPart.Parts.FirstOrDefault(pp2 => pp2.RelationshipId == imageRid);
|
|
|
- Stream stream = null ;
|
|
|
+ Stream stream = null;
|
|
|
try
|
|
|
{
|
|
|
|
|
@@ -3962,7 +4151,7 @@ namespace OpenXmlPowerTools
|
|
|
string mathxml = "";
|
|
|
if (pp.OpenXmlPart.ContentType.Equals("image/x-wmf"))
|
|
|
{
|
|
|
- stream= pp.OpenXmlPart.GetStream();
|
|
|
+ stream = pp.OpenXmlPart.GetStream();
|
|
|
bool compatible = false;
|
|
|
bool replaceSymbolFont = false;
|
|
|
WMFConverter.Wmf.WmfParser parser = new WMFConverter.Wmf.WmfParser();
|
|
@@ -3997,7 +4186,7 @@ namespace OpenXmlPowerTools
|
|
|
//application.EnablePartialTrustCode = true;
|
|
|
//mathxml = expected;
|
|
|
|
|
|
- // MemoryStream memoryStream = new MemoryStream();
|
|
|
+ // MemoryStream memoryStream = new MemoryStream();
|
|
|
//Metafile inFile = new Metafile(pp.OpenXmlPart.GetStream());
|
|
|
////Metafile outFile = new Metafile(memoryStream, Graphics.FromHwnd(IntPtr.Zero).GetHdc(), EmfType.EmfOnly);
|
|
|
//inFile.Save(memoryStream, ImageFormat.Png);
|
|
@@ -4083,13 +4272,14 @@ namespace OpenXmlPowerTools
|
|
|
{
|
|
|
return null;
|
|
|
}
|
|
|
- finally {
|
|
|
- if(stream!=null)
|
|
|
- stream.Close();
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ if (stream != null)
|
|
|
+ stream.Close();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
|
|
|
private static XElement ProcessObject(WordprocessingDocument wordDoc,
|
|
|
XElement element, Func<ImageInfo, XElement> imageHandler)
|
|
@@ -4105,8 +4295,8 @@ namespace OpenXmlPowerTools
|
|
|
var imagePart = (ImagePart)pp.OpenXmlPart;
|
|
|
if (imagePart == null) return null;
|
|
|
string hyperlinkUri = null;
|
|
|
-
|
|
|
- // WORDHelper.GetWordNodeByPath(wordDoc.MainDocumentPart.GetXDocument(), "//[@name='"+imagePart.Uri+"']");
|
|
|
+
|
|
|
+ // WORDHelper.GetWordNodeByPath(wordDoc.MainDocumentPart.GetXDocument(), "//[@name='"+imagePart.Uri+"']");
|
|
|
using (var partStream = imagePart.GetStream())
|
|
|
{
|
|
|
var contentType = imagePart.ContentType;
|
|
@@ -4161,7 +4351,7 @@ namespace OpenXmlPowerTools
|
|
|
{
|
|
|
return null;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
|
|
|
private static float? HeightInPoints(IEnumerable<string> tokens)
|