private void ConvertHtml(ExCSS.Stylesheet sheet, string html, Section section) { _sheet = sheet; if (string.IsNullOrEmpty(html)) { throw new ArgumentNullException("html"); } if (section == null) { throw new ArgumentNullException("section"); } //section.PageSetup.HeaderDistance = "0.001cm"; section.PageSetup.FooterDistance = Unit.FromCentimeter(0.01); // Create a paragraph with centered page number. See definition of style "Footer". var footer = section.Footers.Primary.AddParagraph(); //section.Footers.Primary. footer.Format.Alignment = ParagraphAlignment.Right; footer.AddPageField(); footer.AddText(" of "); footer.AddNumPagesField(); var doc = new HtmlDocument(); doc.LoadHtml(html); ConvertHtmlNodes(doc.DocumentNode.ChildNodes, sheet, section); }
private void SetMargin(HtmlNode node, ExCSS.Stylesheet sheet, out Unit margin, string cssMargin) { var @class = node.Attributes["class"]; margin = Unit.FromCentimeter(0.2); if (@class != null) { var css = (from t in sheet.RuleSets where t.Selectors.Any(x => x.SimpleSelectors.Any(z => z.Class == @class.Value)) select t).FirstOrDefault(); if (css == null) { } if (css != null) { var mar = (from top in css.Declarations where top.Name == cssMargin select top).FirstOrDefault(); if (mar != null) { var tm = mar.Expression.Terms.Where(x => x.Value != string.Empty).FirstOrDefault(); if (tm != null) { margin = Unit.FromCentimeter(double.Parse(tm.Value)); } } } } }
public DocumentObject NodeHandler(HtmlNode node, ExCSS.Stylesheet sheet, DocumentObject parent, DocumentObject current = null) { if (!(parent is Section)) { return parent; } var sec = (Section)parent; Unit margin; SetMargin(node, sheet, out margin, "margin-top"); sec.PageSetup.TopMargin = margin; SetMargin(node, sheet, out margin, "margin-bottom"); sec.PageSetup.BottomMargin = margin; SetMargin(node, sheet, out margin, "margin-left"); sec.PageSetup.LeftMargin = margin; SetMargin(node, sheet, out margin, "margin-right"); sec.PageSetup.LeftMargin = margin; return parent; }
private void ConvertHtmlNodes(HtmlNodeCollection nodes, ExCSS.Stylesheet sheet, DocumentObject section, DocumentObject current = null) { foreach (var node in nodes) { Func<HtmlNode, ExCSS.Stylesheet, DocumentObject, DocumentObject> nodeHandler; Type t; if (_mapping.TryGetValue(node.Name, out t)) { var instance = (INodeHandler)Activator.CreateInstance(t); var result = instance.NodeHandler(node, sheet, section); if (node.HasChildNodes) { ConvertHtmlNodes(node.ChildNodes, sheet, section, result); } } else { if (nodeHandlers.TryGetValue(node.Name, out nodeHandler)) { // pass the current container or section var result = nodeHandler(node, sheet, current ?? section); if (node.HasChildNodes) { ConvertHtmlNodes(node.ChildNodes, sheet, section, result); } } else { if (node.HasChildNodes) { ConvertHtmlNodes(node.ChildNodes, sheet, section, current); } } } } }
private static DocumentObject AddHeading(HtmlNode node, ExCSS.Stylesheet sheet, DocumentObject parent) { return ((Section)parent).AddParagraph().SetStyle("Heading" + node.Name[1]); }
private static DocumentObject AddFormattedText(HtmlNode node, ExCSS.Stylesheet sheet, DocumentObject parent, TextFormat format) { var formattedText = parent as FormattedText; if (formattedText != null) { return formattedText.Format(format); } // otherwise parent is paragraph or section return GetParagraph(parent).AddFormattedText(format); }
public Action<Section> Convert(ExCSS.Stylesheet sheet, string contents) { return section => ConvertHtml(sheet, contents, section); }
public Section AddHtml(ExCSS.Stylesheet sheet, string contents, IConverter converter) { if (string.IsNullOrEmpty(contents)) { throw new ArgumentNullException("contents"); } if (converter == null) { throw new ArgumentNullException("converter"); } Action<Section> addAction = converter.Convert(sheet, contents); addAction(this); return this; }
internal static bool IsMatch(this HtmlAgilityPack.HtmlNode node, ExCSS.Model.Attribute attribute) { var attr = node.Attributes[attribute.Operand]; if (attr != null) { var value = attr.Value; var test = (attribute.Value ?? "").Trim(' ', '\'', '"'); switch (attribute.Operator) { case AttributeOperator.BeginsWith: return value.StartsWith(test); case AttributeOperator.Contains: return value.Contains(test); case AttributeOperator.EndsWith: return value.EndsWith(test); case AttributeOperator.Equals: return value == test; case AttributeOperator.Hyphenated: return value.Split('-').Contains(test); case AttributeOperator.InList: return value.Split(' ').Contains(test); case AttributeOperator.None: return true; } } return false; }