/// <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); }
/// <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); }
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 }
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 }