コード例 #1
0
 /// <summary>
 /// 删除元素列表中自动创建的段落标记元素
 /// </summary>
 /// <param name="elements">文档元素列表</param>
 /// <returns>操作是否改变了列表内容</returns>
 public static bool RemoveAutoCreateParagraphFlag(DomElementList elements)
 {
     if (elements != null && elements.Count > 0)
     {
         if (elements.LastElement is DomParagraphFlagElement)
         {
             DomParagraphFlagElement p = (DomParagraphFlagElement)elements.LastElement;
             if (p.AutoCreate)
             {
                 elements.RemoveAt(elements.Count - 1);
                 return(true);
             }
         }
     }
     return(false);
 }
コード例 #2
0
        /// <summary>
        /// 添加段落
        /// </summary>
        /// <param name="style">段落样式</param>
        /// <returns>新增的段落标记元素</returns>
        public DomParagraphFlagElement AppendParagraphFlag(DocumentContentStyle style)
        {
            DomParagraphFlagElement flag = new DomParagraphFlagElement();

            flag.OwnerDocument = this.Document;
            flag.Parent        = this.Container;
            DocumentContentStyle rs = style == null ? this.ParagraphStyle : style;

            if (this.EnableAddPermissionFlag)
            {
                rs = ( DocumentContentStyle )rs.Clone();
                rs.CreatorIndex = this.Document.UserHistories.CurrentIndex;
                rs.DeleterIndex = -1;
            }
            flag.Style = style;
            this.Append(flag);
            return(flag);
        }
コード例 #3
0
ファイル: HtmlLoader.cs プロジェクト: ywscr/CSharpWriter
        private void CreateElements(
            HTMLElement rootHtmlElement,
            DomElement rootDomElement,
            DocumentContentStyle currentStyle)
        {
            if (rootHtmlElement.ChildNodes == null)
            {
                return;
            }
            foreach (HTMLElement element in rootHtmlElement.ChildNodes)
            {
                if (element is HTMLCommentElement)
                {
                    // 忽略注释
                    continue;
                }
                string tagName = element.FixTagName;
                switch (tagName)
                {
                case "div":
                {
                    CreateElements(element, rootDomElement, currentStyle);
                    DomElement p = this.DomDocument.CreateElement(typeof(DomParagraphFlagElement));
                    p.StyleIndex = this.DomDocument.ContentStyles.GetStyleIndex(currentStyle);
                    rootDomElement.Elements.Add(p);
                }
                break;

                case "ul":    // 原点式列表
                case "ol":    // 数值式列表
                    foreach (HTMLElement li in element.ChildNodes)
                    {
                        if (li.FixTagName == "li")
                        {
                            CreateElements(li, rootDomElement, currentStyle);
                            DomParagraphFlagElement flag = (DomParagraphFlagElement)this.DomDocument.CreateElement(typeof(DomParagraphFlagElement));
                            DocumentContentStyle    s    = (DocumentContentStyle)currentStyle.Clone();
                            if (tagName == "ul")
                            {
                                s.BulletedList = true;
                            }
                            else
                            {
                                s.NumberedList = true;
                            }
                            flag.StyleIndex = this.DomDocument.ContentStyles.GetStyleIndex(s);
                            rootDomElement.Elements.Add(flag);
                        } //if
                    }     //foreach
                    break;

                case "pre":
                {
                    // 预览文本
                    DocumentContentStyle s    = CreateStyle(element, currentStyle);
                    DomElementList       list = this.DomDocument.CreateTextElements(element.InnerText, null, s);
                    rootDomElement.Elements.AddRange(list);
                    DomElement p = this.DomDocument.CreateElement(typeof(DomParagraphFlagElement));
                    p.StyleIndex = this.DomDocument.ContentStyles.GetStyleIndex(currentStyle);
                    rootDomElement.Elements.Add(p);
                    break;
                }

                case "img":
                {
                    // 图片
                    DocumentContentStyle s = CreateStyle(element, currentStyle);
                    s.BorderColor  = Color.Black;
                    s.BorderLeft   = true;
                    s.BorderTop    = true;
                    s.BorderRight  = true;
                    s.BorderBottom = true;
                    s.BorderWidth  = 0;
                    if (element.HasAttribute("border"))
                    {
                        s.BorderWidth = ToInt32(element.GetAttribute("border"));
                    }
                    DomImageElement img = (DomImageElement)this.DomDocument.CreateElement(typeof(DomImageElement));

                    img.StyleIndex = this.DomDocument.ContentStyles.GetStyleIndex(s);
                    if (element.HasAttribute("width"))
                    {
                        img.Width = (float )ToLength(element.GetAttribute("width"));
                    }
                    if (element.HasAttribute("height"))
                    {
                        img.Height = ( float )ToLength(element.GetAttribute("height"));
                    }
                    if (element.HasAttribute("id"))
                    {
                        img.ID = element.GetAttribute("id");
                    }
                    if (element.HasAttribute("alt"))
                    {
                        img.Alt = element.GetAttribute("alt");
                    }
                    if (element.HasAttribute("title"))
                    {
                        img.Title = element.GetAttribute("title");
                    }
                    if (element.HasAttribute("src"))
                    {
                        XImageValue v   = new XImageValue();
                        string      url = this.HtmlDocument.GetAbsoluteURL(element.GetAttribute("src"));
                        try
                        {
                            string msg = string.Format(WriterStrings.Downloading_URL, url);
                            if (this.DomDocument.EditorControl != null)
                            {
                                this.DomDocument.EditorControl.SetStatusText(msg);
                            }
                            if (this.DomDocument.Options.BehaviorOptions.DebugMode)
                            {
                                System.Diagnostics.Debug.Write(msg);
                            }
                            int len = v.Load(url);
                            if (this.DomDocument.Options.BehaviorOptions.DebugMode)
                            {
                                System.Diagnostics.Debug.WriteLine(WriterUtils.FormatByteSize(len));
                            }
                        }
                        catch (Exception ext)
                        {
                            img.Alt = url + ":" + ext.Message;
                            if (this.DomDocument.Options.BehaviorOptions.DebugMode)
                            {
                                System.Diagnostics.Debug.WriteLine(WriterStrings.Fail);
                            }
                        }
                        if (this.DomDocument.EditorControl != null)
                        {
                            this.DomDocument.EditorControl.SetStatusText(null);
                        }
                        if (v.HasContent == false)
                        {
                            img.Alt = url;
                            if (img.Width == 0)
                            {
                                img.Width = 300;
                            }
                            if (img.Height == 0)
                            {
                                img.Height = 150;
                            }
                        }
                        img.Image = v;
                    }

                    if (img.Width == 0 || img.Height == 0)
                    {
                        img.UpdateSize();
                    }
                    rootDomElement.Elements.Add(img);
                }
                break;

                case "#text":
                {
                    // 纯文本片段
                    string text = DCSoft.Common.StringFormatHelper.NormalizeSpace(element.Text);
                    text = System.Web.HttpUtility.HtmlDecode(text);
                    if (string.IsNullOrEmpty(text) == false)
                    {
                        DomElementList cs = this._DomDocument.CreateTextElements(
                            text,
                            currentStyle,
                            currentStyle);
                        if (cs != null && cs.Count > 0)
                        {
                            rootDomElement.Elements.AddRange(cs);
                        }
                    }
                }
                break;

                case "p":
                {
                    // 段落
                    DocumentContentStyle ps = CreateStyle(element, currentStyle);
                    CreateElements(element, rootDomElement, ps);
                    DomParagraphFlagElement flag = ( DomParagraphFlagElement )_DomDocument.CreateElement(typeof(DomParagraphFlagElement));
                    flag.StyleIndex = _DomDocument.ContentStyles.GetStyleIndex(ps);
                    rootDomElement.Elements.Add(flag);
                }
                break;

                case "br":
                {
                    // 软回车
                    DomLineBreakElement lb = (DomLineBreakElement)_DomDocument.CreateElement(typeof(DomLineBreakElement));
                    rootDomElement.Elements.Add(lb);
                }
                break;

                case "sup":
                {
                    // 上标
                    DocumentContentStyle ss = ( DocumentContentStyle )currentStyle.Clone();
                    ss.Superscript = true;
                    CreateElements(element, rootDomElement, ss);
                }
                break;

                case "sub":
                {
                    // 下标
                    DocumentContentStyle ss = (DocumentContentStyle)currentStyle.Clone();
                    ss.Subscript = true;
                    CreateElements(element, rootDomElement, ss);
                }
                break;

                case "strong":
                case "b":
                {
                    // 粗体
                    DocumentContentStyle ss = (DocumentContentStyle)currentStyle.Clone();
                    ss.Bold = true;
                    CreateElements(element, rootDomElement, ss);
                }
                break;

                case "i":
                {
                    // 斜体
                    DocumentContentStyle ss = (DocumentContentStyle)currentStyle.Clone();
                    ss.Italic = true;
                    CreateElements(element, rootDomElement, ss);
                }
                break;

                case "strike":
                {
                    // 删除线
                    DocumentContentStyle ss = (DocumentContentStyle)currentStyle.Clone();
                    ss.Strikeout = true;
                    CreateElements(element, rootDomElement, ss);
                }
                break;

                case "a":
                {
                    // 超链接
                    DocumentContentStyle ss = (DocumentContentStyle)currentStyle.Clone();
                    ss.Color = Color.Blue;
                    CreateElements(element, rootDomElement, ss);
                }
                break;

                case "font":
                {
                    // 字体
                    DocumentContentStyle ss = CreateStyle(element, currentStyle);
                    if (element.HasAttribute("color"))
                    {
                        // 文字颜色
                        ss.Color = ToColor(element.GetAttribute("color"), Color.Black);
                    }
                    if (element.HasAttribute("face"))
                    {
                        // 字体名称
                        ss.FontName = GetFontName(element.GetAttribute("face"));
                    }
                    if (element.HasAttribute("size"))
                    {
                        // 文字大小
                        int size = ToInt32(element.GetAttribute("size"));
                        switch (size)
                        {
                        case 1: ss.FontSize = 7; break;

                        case 2: ss.FontSize = 10; break;

                        case 3: ss.FontSize = 12; break;

                        case 4: ss.FontSize = 14; break;

                        case 5: ss.FontSize = 18; break;

                        case 6: ss.FontSize = 24; break;

                        case 7: ss.FontSize = 35; break;
                        }
                    }
                    CreateElements(element, rootDomElement, ss);
                }
                break;

                case "h1":
                case "h2":
                case "h3":
                case "h4":
                case "h5":
                case "h6":
                {
                    // 标题
                    rootDomElement.Elements.Add(this.DomDocument.CreateElement(typeof(DomParagraphFlagElement)));
                    float fz = 9;
                    switch (tagName)
                    {
                    case "h1": fz = 24; break;

                    case "h2": fz = 18; break;

                    case "h3": fz = 13; break;

                    case "h4": fz = 12; break;

                    case "h5": fz = 10; break;

                    case "h6": fz = 8; break;
                    }
                    DocumentContentStyle ss = CreateStyle(element, currentStyle);
                    if (XDependencyObject.HasPropertyValue(ss, "FontSize"))
                    {
                        ss.FontSize = fz;
                    }
                    CreateElements(element, rootDomElement, ss);
                    rootDomElement.Elements.Add(this.DomDocument.CreateElement(typeof(DomParagraphFlagElement)));
                }
                break;

                default:
                {
                    DocumentContentStyle ds = CreateStyle(element, (DocumentContentStyle)currentStyle);
                    CreateElements(element, rootDomElement, ds);
                }
                break;
                } //switch
            }     //foreach
        }
コード例 #4
0
        private void ReadContent(
            RTFDomElement parentNode,
            DomDocument doc,
            DomElementList result,
            DocumentFormatInfo format)
        {
            if (format == null)
            {
                format = new DocumentFormatInfo();
            }
            //if ( parentNode == null || parentNode.Elements == null)
            //{
            //    System.Console.WriteLine("");
            //    return;
            //}
            foreach (RTFDomElement element in parentNode.Elements)
            {
                if (element is RTFDomHeader)
                {
                    if (((RTFDomHeader)element).HasContentElement)
                    {
                        XTextDocumentHeaderElement header = new XTextDocumentHeaderElement();
                        doc.PageSettings.HeaderDistance = (int)(GraphicsUnitConvert.FromTwips(
                                                                    (double)this._RTFDocument.HeaderDistance,
                                                                    GraphicsUnit.Inch) * 100.0);
                        result.Add(header);
                        ReadContent(element, doc, header.Elements, format);
                    }
                }
                else if (element is RTFDomFooter)
                {
                    if (((RTFDomFooter)element).HasContentElement)
                    {
                        XTextDocumentFooterElement footer = new XTextDocumentFooterElement();
                        doc.PageSettings.FooterDistance = (int)(GraphicsUnitConvert.FromTwips(
                                                                    (double)this._RTFDocument.FooterDistance,
                                                                    GraphicsUnit.Inch) * 100.0);
                        result.Add(footer);
                        ReadContent(element, doc, footer.Elements, format);
                    }
                }
                else if (element is RTFDomParagraph)
                {
                    RTFDomParagraph domP = (RTFDomParagraph)element;
                    //XTextParagraph p = new XTextParagraph();
                    //p.OwnerDocument = doc;
                    DocumentContentStyle style = ToDocumentContentStyle(
                        domP.Format,
                        doc.DocumentGraphicsUnit);
                    ReadContent(element, doc, result, domP.Format);

                    if (domP.IsTemplateGenerated == false ||
                        this.ImportTemplateGenerateParagraph)
                    {
                        DomParagraphFlagElement eof = new DomParagraphFlagElement();
                        eof.StyleIndex = doc.ContentStyles.GetStyleIndex(style);
                        result.Add(eof);
                    }
                }
                else if (element is RTFDomText)
                {
                    RTFDomText domText = (RTFDomText)element;
                    if (domText.Format.Hidden == false &&
                        domText.Text != null &&
                        domText.Text.Length > 0)
                    {
                        DocumentContentStyle style = ToDocumentContentStyle(
                            domText.Format,
                            doc.DocumentGraphicsUnit);
                        int si = doc.ContentStyles.GetStyleIndex(style);
                        result.AddRange(doc.CreateChars(domText.Text, si));
                    }
                }
                else if (element is RTFDomImage)
                {
                    // 插入图片
                    RTFDomImage     domImg = (RTFDomImage)element;
                    DomImageElement img    = new DomImageElement();
                    img.OwnerDocument = doc;
                    img.Image         = new XImageValue(domImg.Data);
                    DocumentContentStyle style = ToDocumentContentStyle(
                        domImg.Format,
                        doc.DocumentGraphicsUnit);
                    img.StyleIndex = doc.ContentStyles.GetStyleIndex(style);
                    img.Width      = GraphicsUnitConvert.FromTwips(domImg.Width, doc.DocumentGraphicsUnit);
                    img.Height     = GraphicsUnitConvert.FromTwips(domImg.Height, doc.DocumentGraphicsUnit);
                    result.Add(img);
                }


                else if (element is RTFDomShape)
                {
                }
                else if (element is RTFDomShapeGroup)
                {
                }
                else if (element is RTFDomLineBreak)
                {
                    // 软回车
                    result.Add(new DomLineBreakElement());// doc.CreateLineBreak());
                }

                else if (element.Elements != null &&
                         element.Elements.Count > 0)
                {
                    ReadContent(element, doc, result, format.Clone());
                }
            }//foreach
        }