WPF RichTextBox转化为rtf格式,以及加载,压缩

简介:

在wpf中RichTextBox式一个富文本控件,在其中我们可以添加图片等内部控件,以及控制段落块的字体等。我们可以采用System.Windows.Markup.XamlWriter.Save(object,stream);来保存,但是例如我们的image(数据源为二进制)内部控件等,这对象无法序列化。这是我们可以采用rtf结构保存和传输,并在另一台机子加载上展现出现。只是rtf数据可能太大,此时我们可以采用ms内置的System.IO.Compression.DeflateStream 压缩压缩后在发送。

关于System.IO.Compression.DeflateStream,msdn上有一句描述如下:

此类表示 Deflate 算法,这是无损压缩和解压缩文件的行业标准算法。 它结合了 LZ77 算法和霍夫曼编码。 只能使用以前绑定的中间存储量来产生或使用数据,即使对于任意长度的、按顺序出现的输入数据流也是如此。 这种格式可以通过不涉及专利使用权的方式轻松实现。 有关更多信息,请参见 RFC 1951。" DEFLATE Compressed Data Format Specification version 1.3(DEFLATE 压缩数据格式规范版本 1.3)。"此类不能用于压缩大于 4 GB 的文件。

此类原本并不提供用来向 .zip 存档中添加文件或从 .zip 存档中提取文件的功能。(原链接

1:存储和导入rtf的代码:

 
  1. 代码   
  2.  
  3.  public static class RichTextBoxEx  
  4.     {  
  5.         public static string RTF(this RichTextBox richTextBox)  
  6.         {  
  7.             string rtf = string.Empty;  
  8.             TextRange textRange = new TextRange(richTextBox.Document.ContentStart, richTextBox.Document.ContentEnd);  
  9.             using (MemoryStream ms = new MemoryStream())  
  10.             {  
  11.                 textRange.Save(ms, System.Windows.DataFormats.Rtf);  
  12.                 ms.Seek(0, SeekOrigin.Begin);  
  13.                 StreamReader sr = new StreamReader(ms);  
  14.                 rtf = sr.ReadToEnd();  
  15.             }  
  16.  
  17.             return rtf;  
  18.         }  
  19.  
  20.         public static void LoadFromRTF(this RichTextBox richTextBox, string rtf)  
  21.         {  
  22.             if (string.IsNullOrEmpty(rtf))  
  23.             {  
  24.                 throw new ArgumentNullException();  
  25.             }  
  26.             TextRange textRange = new TextRange(richTextBox.Document.ContentStart, richTextBox.Document.ContentEnd);  
  27.             using (MemoryStream ms = new MemoryStream())  
  28.             {  
  29.                 using (StreamWriter sw = new StreamWriter(ms))  
  30.                 {  
  31.                     sw.Write(rtf);  
  32.                     sw.Flush();  
  33.                     ms.Seek(0, SeekOrigin.Begin);  
  34.                     textRange.Load(ms, DataFormats.Rtf);  
  35.                 }  
  36.             }  
  37.         }  
  38.  
  39.     } 

2:压缩的简单封装,转化为二进制,以及二进制转化为Base64String等

 
  1. ::代码   
  2.  
  3. public class StringCompress  
  4.     {  
  5.         public static string Decompress(byte[] bys)  
  6.         {  
  7.             return Decompress(Convert.ToBase64String(bys));  
  8.         }  
  9.         public static string Decompress(string strSource)  
  10.         {  
  11.             return Decompress(strSource, (3 * 1024 * 1024 + 256));//字符串不会超过3M  
  12.         }  
  13.         public static string Decompress(string strSource, int length)  
  14.         {  
  15.             byte[] buffer = Convert.FromBase64String(strSource);  
  16.  
  17.             System.IO.MemoryStream ms = new System.IO.MemoryStream();  
  18.             ms.Write(buffer, 0, buffer.Length);  
  19.             ms.Position = 0;  
  20.             System.IO.Compression.DeflateStream stream = new System.IO.Compression.DeflateStream(ms, System.IO.Compression.CompressionMode.Decompress);  
  21.             stream.Flush();  
  22.  
  23.             int nSize = length;  
  24.             byte[] decompressBuffer = new byte[nSize];  
  25.             int nSizeIncept = stream.Read(decompressBuffer, 0, nSize);  
  26.             stream.Close();  
  27.  
  28.             return System.Text.Encoding.Unicode.GetString(decompressBuffer, 0, nSizeIncept);//转换为普通的字符串  
  29.         }  
  30.  
  31.  
  32.         public static byte[] Compress(string strSource)  
  33.         {  
  34.             if (strSource == null)  
  35.                 throw new System.ArgumentException("字符串为空!");  
  36.  
  37.             System.Text.Encoding encoding = System.Text.Encoding.Unicode;  
  38.             byte[] buffer = encoding.GetBytes(strSource);  
  39.  
  40.             System.IO.MemoryStream ms = new System.IO.MemoryStream();  
  41.             System.IO.Compression.DeflateStream stream = new System.IO.Compression.DeflateStream(ms, System.IO.Compression.CompressionMode.Compress, true);  
  42.             stream.Write(buffer, 0, buffer.Length);  
  43.             stream.Close();  
  44.  
  45.             buffer = ms.ToArray();  
  46.             ms.Close();  
  47.  
  48.             return buffer;  
  49.             // return Convert.ToBase64String(buffer); //将压缩后的byte[]转换为Base64String  
  50.         }  
  51.  
  52.     }  
  53.  
  54.  
  55. 复制代码  
  56.    

 



 本文转自 破狼 51CTO博客,原文链接:http://blog.51cto.com/whitewolfblog/835099,如需转载请自行联系原作者




相关文章
|
2月前
|
编解码 API C#
浅谈WPF之利用RichTextBox实现富文本编辑器
在实际应用中,富文本随处可见,如留言板,聊天软件,文档编辑,特定格式内容等,在WPF开发中,如何实现富文本编辑呢?本文以一个简单的小例子,简述如何通过RichTextBox实现富文本编辑功能,主要实现复制,剪切,粘贴,撤销,重做,保存,打开,文本加粗,斜体,下划线,删除线,左对齐,居中对齐,右对齐,两端对齐,缩进,减少缩进,项目符号,数字符号,上标,下标,背景色,前景色,图片,打印等功能,仅供学习分享使用,如有不足之处,还请指正。
54 0
|
8月前
|
C# Windows
WPF技术之RichTextBox控件
WPF RichTextBox是Windows Presentation Foundation (WPF)中提供的一个强大的文本编辑控件,它可以显示富文本格式的文本,支持多种文本处理操作。
345 0
|
C# 前端开发
WPF加载等待动画
原文:WPF加载等待动画 原文地址:https://www.codeproject.com/Articles/57984/WPF-Loading-Wait-Adorner 界面遮罩 等待动画全局颜色 ...
3314 0
WPF从外部文件或者程序集加载样式或其他静态资源
WPF从外部文件或者程序集加载样式或其他静态资源
WPF从外部文件或者程序集加载样式或其他静态资源
|
大数据 C# 数据库
WPF DataGrid 性能加载大数据
原文:WPF DataGrid 性能加载大数据 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010265681/article/details/76651725  WPF(Windows Presentation Foundation)应用程序在没有图形加速设备的机器上运行速度很慢是个公开的秘密,给用户的感觉是它太吃资源了,WPF程序的性能和硬件确实有很大的关系,越高档的机器性能越有优势。
2092 0
|
C#
关于WPF的ComboBox中Items太多而导致加载过慢的问题
原文:关于WPF的ComboBox中Items太多而导致加载过慢的问题                                     【WFP疑难】关于WPF的ComboBox中Items太多而导致加载过慢的问题                                      ...
1291 0
|
C# 前端开发 Android开发
WPF 客户端浏览器 添加Loading加载进度
原文:WPF 客户端浏览器 添加Loading加载进度 在windows开发界面时,使用浏览器来请求和显示网页内容,是比较常见的。 但是在请求网页内容时,因网速或者前端功能复杂加载较慢,亦或者加载时遇到各种问题,如空白/黑屏/加载不完整/证书问题等。
1646 0
|
C#
WPF loading加载动画库
原文:WPF loading加载动画库 1. 下载Dll        https://pan.baidu.com/s/1wKgv5_Q8phWo5CrXWlB9dA 2.
2218 0
|
C#
WPF 仪表盘 刻度盘 动态 加载中 开源
原文:WPF 仪表盘 刻度盘 动态 加载中 开源  1. 表盘   参数可以设置, codeproject上写的。网址在这里。 源码里有demo,很详细。 源码在这里。 2. 动态Loading  截图效果跟实际有点不一样。
1618 0
|
C# .NET 开发框架
WPF笔记 ( xmlns引用,Resource、Binding 前/后台加载,重新绑定) 2013.6.7更新
原文:WPF笔记 ( xmlns引用,Resource、Binding 前/后台加载,重新绑定) 2013.6.7更新 1、xmlns Mapping URI的格式是 clr-namespace:[;assembly=] (1)如果自定义类和XAML处在同一个Assembly之中,只还需要提供clr-namespace值。
1397 0