/// <summary> /// Write formatted string. Call WriteStartString before this method /// </summary> /// <param name="text">text</param> /// <param name="info">format</param> public void WriteString(string text, DocumentFormatInfo info) { if (CollectionInfo) { FontTable.Add(info.FontName); ColorTable.Add(info.TextColor); ColorTable.Add(info.BackColor); } else { WriteStartString(info); if (info.Multiline) { if (text != null) { text = text.Replace("\n", ""); var reader = new StringReader(text); var strLine = reader.ReadLine(); var count = 0; while (strLine != null) { if (count > 0) { Writer.WriteKeyword("line"); } count++; Writer.WriteText(strLine); strLine = reader.ReadLine(); } reader.Close(); } } else { Writer.WriteText(text); } WriteEndString(info); } }
// ReSharper disable once MemberCanBePrivate.Global /// <summary> /// End writing of a formatted string. WriteStartString and WriteString have to be called before this method /// </summary> /// <param name="info"></param> public void WriteEndString(DocumentFormatInfo info) { if (CollectionInfo) { return; } if (info.Subscript) { Writer.WriteKeyword("sub0"); } if (info.Superscript) { Writer.WriteKeyword("super0"); } if (info.Bold) { Writer.WriteKeyword("b0"); } if (info.Italic) { Writer.WriteKeyword("i0"); } if (info.Underline) { Writer.WriteKeyword("ul0"); } if (info.Strikeout) { Writer.WriteKeyword("strike0"); } if (!string.IsNullOrEmpty(info.Link)) { Writer.WriteEndGroup(); Writer.WriteEndGroup(); Writer.WriteEndGroup(); } }
/// <summary> /// Write font format /// </summary> /// <param name="font">font</param> public void WriteFont(System.Drawing.Font font) { if (font == null) { throw new ArgumentNullException("font"); } if (CollectionInfo) { FontTable.Add(font.Name); } else { var index = FontTable.IndexOf(font.Name); if (index >= 0) { Writer.WriteKeyword("f" + index); } if (font.Bold) { Writer.WriteKeyword("b"); } if (font.Italic) { Writer.WriteKeyword("i"); } if (font.Underline) { Writer.WriteKeyword("ul"); } if (font.Strikeout) { Writer.WriteKeyword("strike"); } Writer.WriteKeyword("fs" + Convert.ToInt32(font.Size * 2)); } }
/// <summary> /// Write image /// </summary> /// <param name="image">Image</param> /// <param name="width">Pixel width</param> /// <param name="height">Pixel height</param> /// <param name="imageData">Image binary data</param> public void WriteImage(Image image, int width, int height, byte[] imageData) { if (imageData == null) { return; } var memoryStream = new MemoryStream(); image.Save(memoryStream, ImageFormat.Jpeg); memoryStream.Close(); var bs = memoryStream.ToArray(); Writer.WriteStartGroup(); Writer.WriteKeyword("pict"); Writer.WriteKeyword("jpegblip"); Writer.WriteKeyword("picscalex" + Convert.ToInt32(width * 100.0 / image.Size.Width)); Writer.WriteKeyword("picscaley" + Convert.ToInt32(height * 100.0 / image.Size.Height)); Writer.WriteKeyword("picwgoal" + Convert.ToString(image.Size.Width * 15)); Writer.WriteKeyword("pichgoal" + Convert.ToString(image.Size.Height * 15)); Writer.WriteBytes(bs); Writer.WriteEndGroup(); }
/// <summary> /// Write font table rtf /// </summary> /// <param name="writer">rtf text writer</param> public void Write(Writer writer) { writer.WriteStartGroup(); writer.WriteKeyword(Consts.Fonttbl); foreach (Font font in this) { writer.WriteStartGroup(); writer.WriteKeyword("f" + font.Index); if (font.Charset != 0) { writer.WriteKeyword("fcharset" + font.Charset); } writer.WriteText(font.Name); writer.WriteEndGroup(); } writer.WriteEndGroup(); }
/// <summary> /// Start write of formatted text /// </summary> /// <param name="info">format</param> /// <remarks> /// This function must assort with WriteEndString /// </remarks> // ReSharper disable once MemberCanBePrivate.Global public void WriteStartString(DocumentFormatInfo info) { if (CollectionInfo) { FontTable.Add(info.FontName); ColorTable.Add(info.TextColor); ColorTable.Add(info.BackColor); if (info.BorderColor.A != 0) { ColorTable.Add(info.BorderColor); } return; } if (!string.IsNullOrEmpty(info.Link)) { Writer.WriteStartGroup(); Writer.WriteKeyword("field"); Writer.WriteStartGroup(); Writer.WriteKeyword("fldinst", true); Writer.WriteStartGroup(); Writer.WriteKeyword("hich"); Writer.WriteText(" HYPERLINK \"" + info.Link + "\""); Writer.WriteEndGroup(); Writer.WriteEndGroup(); Writer.WriteStartGroup(); Writer.WriteKeyword("fldrslt"); Writer.WriteStartGroup(); } switch (info.Align) { case RtfAlignment.Left: Writer.WriteKeyword("ql"); break; case RtfAlignment.Center: Writer.WriteKeyword("qc"); break; case RtfAlignment.Right: Writer.WriteKeyword("qr"); break; case RtfAlignment.Justify: Writer.WriteKeyword("qj"); break; } Writer.WriteKeyword("plain"); int index = FontTable.IndexOf(info.FontName); if (index >= 0) { Writer.WriteKeyword("f" + index); } if (info.Bold) { Writer.WriteKeyword("b"); } if (info.Italic) { Writer.WriteKeyword("i"); } if (info.Underline) { Writer.WriteKeyword("ul"); } if (info.Strikeout) { Writer.WriteKeyword("strike"); } Writer.WriteKeyword("fs" + Convert.ToInt32(info.FontSize * 2)); // Back color index = ColorTable.IndexOf(info.BackColor); if (index >= 0) { Writer.WriteKeyword("chcbpat" + Convert.ToString(index + 1)); } index = ColorTable.IndexOf(info.TextColor); if (index >= 0) { Writer.WriteKeyword("cf" + Convert.ToString(index + 1)); } if (info.Subscript) { Writer.WriteKeyword("sub"); } if (info.Superscript) { Writer.WriteKeyword("super"); } if (info.NoWwrap) { Writer.WriteKeyword("nowwrap"); } if (info.LeftBorder || info.TopBorder || info.RightBorder || info.BottomBorder) { // Border color if (info.BorderColor.A != 0) { Writer.WriteKeyword("chbrdr"); Writer.WriteKeyword("brdrs"); Writer.WriteKeyword("brdrw10"); index = ColorTable.IndexOf(info.BorderColor); if (index >= 0) { Writer.WriteKeyword("brdrcf" + Convert.ToString(index + 1)); } } } }
/// <summary> /// Write end of paragraph /// </summary> /// <param name="info">format</param> // ReSharper disable once MemberCanBePrivate.Global public void WriteStartParagraph(DocumentFormatInfo info) { if (CollectionInfo) { //myFontTable.Add("Wingdings"); } else { if (_firstParagraph) { _firstParagraph = false; Writer.WriteRaw(Environment.NewLine); //myWriter.WriteKeyword("par"); } else { Writer.WriteKeyword("par"); } if (info.ListId >= 0) { Writer.WriteKeyword("pard"); Writer.WriteKeyword("ls" + info.ListId); if (_lastParagraphInfo != null) { if (_lastParagraphInfo.ListId >= 0) { Writer.WriteKeyword("pard"); } } } switch (info.Align) { case RtfAlignment.Left: Writer.WriteKeyword("ql"); break; case RtfAlignment.Center: Writer.WriteKeyword("qc"); break; case RtfAlignment.Right: Writer.WriteKeyword("qr"); break; case RtfAlignment.Justify: Writer.WriteKeyword("qj"); break; } if (info.ParagraphFirstLineIndent != 0) { Writer.WriteKeyword("fi" + Convert.ToInt32( info.ParagraphFirstLineIndent * 400 / info.StandTabWidth)); } else { Writer.WriteKeyword("fi0"); } if (info.LeftIndent != 0) { Writer.WriteKeyword("li" + Convert.ToInt32( info.LeftIndent * 400 / info.StandTabWidth)); } else { Writer.WriteKeyword("li0"); } Writer.WriteKeyword("plain"); } _lastParagraphInfo = info; }
/// <summary> /// Write the start of the document /// </summary> public void WriteStartDocument() { _lastParagraphInfo = null; _firstParagraph = true; if (CollectionInfo) { Info.Clear(); FontTable.Clear(); ColorTable.Clear(); FontTable.Add(Control.DefaultFont.Name); } else { Writer.WriteStartGroup(); Writer.WriteKeyword(Consts.Rtf); Writer.WriteKeyword("ansi"); Writer.WriteKeyword("ansicpg" + Writer.Encoding.CodePage); // Write document information if (Info.Count > 0) { Writer.WriteStartGroup(); Writer.WriteKeyword("info"); foreach (string key in Info.Keys) { Writer.WriteStartGroup(); var value = Info[key]; if (value is string) { Writer.WriteKeyword(key); Writer.WriteText((string)value); } else if (value is int) { Writer.WriteKeyword(key + value); } else if (value is DateTime) { var dateTime = (DateTime)value; Writer.WriteKeyword(key); Writer.WriteKeyword("yr" + dateTime.Year); Writer.WriteKeyword("mo" + dateTime.Month); Writer.WriteKeyword("dy" + dateTime.Day); Writer.WriteKeyword("hr" + dateTime.Hour); Writer.WriteKeyword("min" + dateTime.Minute); Writer.WriteKeyword("sec" + dateTime.Second); } else { Writer.WriteKeyword(key); } Writer.WriteEndGroup(); } Writer.WriteEndGroup(); } // Write font table Writer.WriteStartGroup(); Writer.WriteKeyword(Consts.Fonttbl); for (var count = 0; count < FontTable.Count; count++) { //string f = myFontTable[ count ] ; Writer.WriteStartGroup(); Writer.WriteKeyword("f" + count); var f = FontTable[count]; Writer.WriteText(f.Name); if (f.Charset != 1) { Writer.WriteKeyword("fcharset" + f.Charset); } Writer.WriteEndGroup(); } Writer.WriteEndGroup(); // Write color table Writer.WriteStartGroup(); Writer.WriteKeyword(Consts.Colortbl); Writer.WriteRaw(";"); for (var count = 0; count < ColorTable.Count; count++) { var colorTable = ColorTable[count]; Writer.WriteKeyword("red" + colorTable.R); Writer.WriteKeyword("green" + colorTable.G); Writer.WriteKeyword("blue" + colorTable.B); Writer.WriteRaw(";"); } Writer.WriteEndGroup(); // Write list table if (ListTable != null && ListTable.Count > 0) { if (DebugMode) { Writer.WriteRaw(Environment.NewLine); } Writer.WriteStartGroup(); Writer.WriteKeyword("listtable", true); foreach (var list in ListTable) { if (DebugMode) { Writer.WriteRaw(Environment.NewLine); } Writer.WriteStartGroup(); Writer.WriteKeyword("list"); Writer.WriteKeyword("listtemplateid" + list.ListTemplateId); if (list.ListHybrid) { Writer.WriteKeyword("listhybrid"); } if (DebugMode) { Writer.WriteRaw(Environment.NewLine); } Writer.WriteStartGroup(); Writer.WriteKeyword("listlevel"); Writer.WriteKeyword("levelfollow" + list.LevelFollow); Writer.WriteKeyword("leveljc" + list.LevelJc); Writer.WriteKeyword("levelstartat" + list.LevelStartAt); Writer.WriteKeyword("levelnfc" + Convert.ToInt32(list.LevelNfc)); Writer.WriteKeyword("levelnfcn" + Convert.ToInt32(list.LevelNfc)); Writer.WriteKeyword("leveljc" + list.LevelJc); if (string.IsNullOrEmpty(list.LevelText) == false) { Writer.WriteStartGroup(); Writer.WriteKeyword("leveltext"); Writer.WriteKeyword("'0" + list.LevelText.Length); if (list.LevelNfc == RtfLevelNumberType.Bullet) { Writer.WriteUnicodeText(list.LevelText); } else { Writer.WriteText(list.LevelText, false); } Writer.WriteEndGroup(); if (list.LevelNfc == RtfLevelNumberType.Bullet) { var f = FontTable["Wingdings"]; if (f != null) { Writer.WriteKeyword("f" + f.Index); } } else { Writer.WriteStartGroup(); Writer.WriteKeyword("levelnumbers"); Writer.WriteKeyword("'01"); Writer.WriteEndGroup(); } } Writer.WriteEndGroup(); Writer.WriteKeyword("listid" + list.ListId); Writer.WriteEndGroup(); } Writer.WriteEndGroup(); } // Write list overried table if (ListOverrideTable != null && ListOverrideTable.Count > 0) { if (DebugMode) { Writer.WriteRaw(Environment.NewLine); } Writer.WriteStartGroup(); Writer.WriteKeyword("listoverridetable"); foreach (var listOverride in ListOverrideTable) { if (DebugMode) { Writer.WriteRaw(Environment.NewLine); } Writer.WriteStartGroup(); Writer.WriteKeyword("listoverride"); Writer.WriteKeyword("listid" + listOverride.ListId); Writer.WriteKeyword("listoverridecount" + listOverride.ListOverrideCount); Writer.WriteKeyword("ls" + listOverride.Id); Writer.WriteEndGroup(); } Writer.WriteEndGroup(); } if (DebugMode) { Writer.WriteRaw(Environment.NewLine); } Writer.WriteKeyword("viewkind1"); } }
/// <summary> /// Write /// </summary> /// <param name="writer"></param> public void Write(Writer writer) { writer.WriteStartGroup(); writer.WriteKeyword(Consts.Colortbl); writer.WriteRaw(";"); foreach (var item in _arrayList) { var c = (Color) item; writer.WriteKeyword("red" + c.R); writer.WriteKeyword("green" + c.G); writer.WriteKeyword("blue" + c.B); writer.WriteRaw(";"); } writer.WriteEndGroup(); }
private void WriteTime(Writer writer, string name, DateTime value) { writer.WriteStartGroup(); writer.WriteKeyword(name); writer.WriteKeyword("yr" + value.Year); writer.WriteKeyword("mo" + value.Month); writer.WriteKeyword("dy" + value.Day); writer.WriteKeyword("hr" + value.Hour); writer.WriteKeyword("min" + value.Minute); writer.WriteKeyword("sec" + value.Second); writer.WriteEndGroup(); }
public void Write(Writer writer) { writer.WriteStartGroup(); writer.WriteKeyword("info"); foreach (string strKey in _infoStringDictionary.Keys) { writer.WriteStartGroup(); if (strKey == "edmins" || strKey == "vern" || strKey == "nofpages" || strKey == "nofwords" || strKey == "nofchars" || strKey == "nofcharsws" || strKey == "id") { writer.WriteKeyword(strKey + _infoStringDictionary[strKey]); } else { writer.WriteKeyword(strKey); writer.WriteText(_infoStringDictionary[strKey]); } writer.WriteEndGroup(); } writer.WriteStartGroup(); WriteTime(writer, "creatim", _creationTime); WriteTime(writer, "revtim", _revisionTime); WriteTime(writer, "printim", _printTime); WriteTime(writer, "buptim", _backupTime); writer.WriteEndGroup(); }