使用 C# 编程对 RTF 文档进行操作
上一篇 / 下一篇 2011-09-08 17:39:53 / 个人分类:C# 2010 学习
RTF文档格式是微软提出的一种用于描述带格式文本的文档格式,上个世纪就提出来了,一直用到现在,而且很多程序都支持这种格式,微软的Office软件家族,Windows写字板软件等等都支持,而且Windows操作系统的剪切板和OLE拖拽操作也支持RTF文档,这样就允许不同的软件通过RTF格式相互交流带格式文本。比如我用的VS.NET2003中的C#代码编辑器,在其中复制了一段代码文本,在MS Word中粘贴所得就是具有高亮度显示的文本。因此RTF格式的作用还是不小的,而且RTF格式是纯文本格式,不是二进制格式,读写都不算难。51Testing软件测试网 Deng)^s&?-y f:]}F
kt,BA#KYY1?Ge0 RTF文档格式和HTML,XML之类的标记语言有点类似,原理不复杂,但内容还是比较多的,在微软的MSND中就有文章详细的介绍了RTF格式,地址是 ms-help://MS.MSDNQTR.2003FEB.2052/dnrtfspec/html/rtfspec.htm ,你用记事本打开一个RTF文档,可以发现其中也是纯文本数据,而且一般全是ANSI字符,RTF文档一般采用ASNI字符编码格式进行存储,其中是不能直接保存汉字等编码大于127的字符,要保存得使用转义字符。RTF文档中使用一对花括号"{ }"来定义一个组,组可以套嵌定义;用"\"来开始定义一个指令和转义字符;此外还能包含纯文本数据。所有的指令和转义字符都必须包含在一个组中,一个RTF文档只有一个根组,这点有点类似XML文档只能有一个根节点的规定。51Testing软件测试网*p+x)M/EjE B
r8i `N M&N G:? |0 我们使用Windows写字板新建一个RTF文档,只输入"Hellow"文本,设置文本颜色为蓝色,然后保存,然后使用记事本打开刚刚保存的RTF文件,此时就能看到一个最简单的RTF文档的内容了,其内容如下。51Testing软件测试网KL'\7h8B&vO
/EF6P7GV0 {51Testing软件测试网3V$zti%^/d8}F)f#}!b
51Testing软件测试网 f"f4? U7cy)UF:lKBS\rtf1\ansi\ansicpg936\deff0\deflang1033\deflangfe205251Testing软件测试网 ]w^Ac
#h1rzgX1]0 {\fonttbl
#K9Us\4Ry_ r0,yE_(pu6o,J:i0 {\f0\fmodern\fprq6\fcharset134 \'cb\'ce\'cc\'e5;}
P K6Le$^L051Testing软件测试网kM&x W:w/E*u9Qm"T}
)E0@x1t0W|E051Testing软件测试网X5x7S3M0J{\colortbl ;\red0\green0\blue255;}
TYY,O1A:g051Testing软件测试网4tW2rp/{v.A{\*\generator Msftedit 5.41.15.1507;}
{-N2y:x*S1Tq8H0|}3aYNw Z0 \viewkind4\uc1\pard\cf1\lang2052\f0\fs20 Hellow\cf0\par51Testing软件测试网&}r+S0l&FN9]m
51Testing软件测试网pK!q$E*{p0T3KZ}51Testing软件测试网7Da3i.B'ifx
51Testing软件测试网Aj"z'XFNv`j.E此处为了便于阅读,对代码进行了缩进处理,实际上RTF文档中空白字符是会影响到显示结果的,一般实际生成RTF文档时不要添加额外的空白字符。51Testing软件测试网F HuR&] i
51Testing软件测试网qx v-@:O$\&| E这段RTF代码第一行和最后一行是表示根组的花括号,然后是"\"开头的指令,指令名称全部由英文字母组成,若指令后面跟着若干个数字,则这些数字就是指令的参数。比如"\rtf1",这个指令名称是"rtf",参数值是"1";而"\ansi"指令名称是"ansi",没有参数。
`x?;LF#V6C(E6}HY0Dx*Y%X^/iY(_!P0 指令"\rtf"是每个RTF文档必备的,而且总是第一个指令,因此可以看作RTF文档的文件头标记。若一个RTF文档第一个指令不是"rtf"指令,则可以认为这个RTF文档是不合法的。
1Xz0}Ni.zfS"G6K%c051Testing软件测试网a;E t$sp2S m指令"\ansicpg"就是说明该RTF文档的内容的编码格式,参数就是编码格式编号,例如"\ansicpg936"就是指明编码格式为936号字符集,对于C#程序来说,就是库函数 System.Text.Encoding.GetEncoding( 936 ) 的返回结果,也就是GB2312编码格式。RTF文档本身肯定是使用标准的ANSI格式保存的,此处指明的字符编码格式是用于处理RTF文档中的转义字符的,比如代码中由连续的转义字符 \'cb\'ce\'cc\'e5 ,程序解析RTF文档时,应当将这一串转义字符生成一个字节数组,内容为 0xcb,0xce,0xcc,0xe5,然后使用第936号编码格式对象的GetString( byte[] )函数来还原所存储的字符串,也就是"宋体"两个字。这点比HTML的转义字符处理要麻烦一些,HTML转义字符是一个指令定义一个字符,而RTF中的是一个指令定义一个字节,而汉字是双字节的字符编码,转化前还得设法获得完整的字节序列。51Testing软件测试网2XsJ6])_#q&eee/@
51Testing软件测试网a!v(g&h o2{;R z? }o:t指令"\fonttbl"定义了文档中使用的所有的字体的列表,RTF文本内容引用这个字体列表来获得显示文档使用的字体,这和HTML文档中统一定义CSS样式有点类似。"fonttbl"组中由若干个子组,每个子组定义一个字体,字体定义组的第一个指令为"\f",带有一个参数指明字体的编号,比如"\f0"指明这个字体编号为0,"\f1"指明字体编号为1。字体定义组还定义了关于字体的其他信息,其中最重要的就是最后的字体名称了。此演示文档中,字体的名称就是"\'cb\'ce\'cc\'e5;",经过编码后就是"宋体;",小心后面还有个分号。注意字体编号可能是不连续的,比如可以存在这样的字体表代码"{\f0 ...}{\f1 ...}{\f99 ...}{\f212 ...}",因此解析RTF字体表时要考虑这点。
`$~XkI(bT T051Testing软件测试网*Kl&E