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);
 }
예제 #8
0
    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;
    }
예제 #9
0
        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;
        }