RTF文件格式研究报告(代开版辞)

摘要:本文对RTF文件格式进行分析研究,对RTF文件结构及特性进行了阐述,并分别列举了几个实用性的例子进行详细分析,最终通过VB程序代码实现了一个RTF书写器(不具有所见即所得特性)。本文对软件开发人员及RTF文件格式感兴趣的人员具有参考价值。

关键字:RTF、Rich Text Format、Office、文件格式。

一、引言

富文本格式(RTF)规范是为了便于在应用程序之间轻松转储格式化文本和图形的一种编码方法。现在,用户可以利用特定转换软件,在不同系统如MS-DOS、Windows、OS/2、Macintosh和Power

Macintosh的应用程序之间转移字处理文档。RTF规范提供一种在不同的输出设备、操作环境和操作系统之间交换文本和图形的一种格式。RTF使用ANSI,

PC-8, Macintosh, 或IBM PC字符集控制文档的表示法和格式化,包括屏幕显示和打印。凭借RTF规范,不同的操作系统和不同的软件程序创建的文档能够在这些操作系统和应用程序之间传递。

将一个格式化的文件转换为RTF文件的软件称为RTF书写器。RTF书写器用于分离现有文本中的程序控制信息,并且生成一个包含文本和与之相关的RTF组的新文件。将RTF文件转换成格式化文件的软件则称为RTF阅读器。

二、RTF基本语法

RTF文件由未格式化本文、控制字、控制符和组组成。RTF文件没有限制文件的行的最大长度。

控制字是RTF用来标记打印控制符和管理文档信息的一种特殊格式的命令。一个控制字最长32个字符。控制字的使用格式如下:

/字母序列[/span>分隔符

注意:每个控制字均以一个反斜杠/开头。字母序列由a~z 的小写字母组成。控制字(或者称为关键字)通常应该不包含任何大写字母。

分隔符标记RTF控制字的结束, 可以是下列各项之一:

· 一个空格,这时空格是控制字的一部份。

· 一个数字或连字符(-), 表示跟随的一个数值参数。该数字序列的长度由其后的一个空格或除了字母和数字的其他字符划定。这个参数可以是正数或者负数,它的取值范围通常是从-32767到32767。

· 任何非字母和数字的其他字符。这种情况下,此分隔字符结束控制字,而它并不属于控制字的一部分。

控制符由一个反斜线/跟随单个非字母字符组成。例如,/~代表一个不换行空格。控制符不需要分隔符。

组由包括在({})中的文本、控制字或控制符组成。左扩符({)表示组的开始,右扩符(})表示组的结束。每个组包括文本和文本的不同属性。RTF文件也能同时包括字体、格式、屏幕颜色、图形//代码效果参考:http://www.jhylw.com.cn/410528089.html

、脚注、注释(注解)、文件头和文件尾、摘要信息、域和书签的组合,以及文档、区段、段落和字符的格式属性。如果包括字体、文件、格式、屏幕颜色、校订标记,以及摘要信息组、文档格式属性,则他们一定要在文件的第一纯文本字符之前,这些组形成RTF的文件头。如果包括字体组,则它应该在格式组之前。如果组未使用,可以省略。

对于RTF文件的详细语法及关键字说明请参阅《Rich Text Format (RTF) Specification

v1.7》,这里不作更详细的说明。

三、Hello Word

国际惯例,一个Hello Word!演示例子,内容如下:

{/rtf1/ansi/ansicpg936/deff0/deflang1033/deflangfe2052

{/fonttbl{/f0/fmodern/fprq6/fcharset134 /'cb/'ce/'cc/'e5;}}

{//generator Msftedit 5.41.21.2500;}/viewkind4/uc1/pard/lang2052/f0/fs20 Hello World!/par}

该文件分析如下(红色):

1、文件基本属性:

{/rtf1 RTF版本/ansi字符集/ansicpg936简体中文/deff0默认字体0/deflang1033美国英语/deflangfe2052中国汉语

2、字体表:

{/fonttbl{/f0字体0/fmodern/fprq6字体间距为6/fcharset134GB2312国标码 /'cb/'ce/'cc/'e5宋体;}}

3、生成器信息:

{//generator Msftedit 5.41.21.2500;}

4、文档属性:

/viewkind4正常视图/uc1单字节/pard默认段落属性/lang2052中国汉语/f0字体0/fs20字体大小20磅

5、正文文本:

Hello World!/par段落标记

}文件结束

注意:在RTF文件中,中文等双字节字符采用其单字节ASCII码序列表示,例如文本“宋体ABC”应该表示为:/'cb/'ce/'cc/'e5ABC,这就是为什么RTF可读性差的原因。如果需要通过程序获取某个字符串的合法ASCII序列,可以采用如下的VB函数:

Public Function StrToASC(ByVal strIn As String) As String

'将中文字符串转换为ASC串(包括英文一起)

'先将特殊字符进行转义:

strIn = Replace(strIn, Chr(9), "/TAB ")

strIn = Replace(strIn, Chr(13) + Chr(10), "/par ")

Dim i As Long, s As String, lsChar As String, lsPart1 As String, lsPart2 As String

Dim lsCharHex As String

For i = 1 To Len(strIn)

lsChar = Mid(strIn, i, 1)

If lsChar = "?" Then

lsCharHex = LCase(Hex(Asc(lsChar)))

If Len(lsCharHex) = 4 Then

lsCharHex = "/'" + Mid(lsCharHex, 1, 2) + "/'" + Mid(lsCharHex, 3, 2)

Else

lsCharHex = lsChar

End If

s = s + lsCharHex

Else

lsCharHex = LCase(Hex(Asc(lsChar)))

If Len(lsCharHex) = 4 Then

lsCharHex = "/'" + Mid(lsCharHex, 1, 2) + "/'" + Mid(lsCharHex, 3, 2)

Else

lsCharHex = lsChar

End If

s = s + lsCharHex

End If

Next

StrToASC = s

End Function

四、文字的更高级表示

掌握了基本文字表述方法后,你一定会试着进一步探索文本更高级的表示方法,如下划线、颜色、粗体、斜体等等,而这些在V1.7规范中都作了详细描述,本文只列出部分常用关键字,以供参考。

l 对于字体表和颜色表的说明:

对于我们在文档中使用的每一个字体和颜色,我们都必须在文档头的字体表和颜色表中预先定义。

字体表定义的例子如下:

{/fonttbl

{/f0/froman/fcharset0/fprq2{//panose 02020603050405020304}Times New Roman;}

{/f1/fswiss/fcharset0/fprq2{//panose 020b0604020202020204}Arial;}

{/f10/fnil/fcharset2/fprq2{/*/panose 05000000000000000000}Wingdings;}

… …

}

我们在使用字体时,就可以直接指定字体表的一个索引,如:“/f1Happy”表示字体为Arial 的文本Happy。如果我们想加入其他字体,如“华文中宋”,那么只需要在字体表中加入该字体说明,并在需要时引用该字体索引值即可。方法为(华文中宋的ASCII串为“/'bb/'aa/'ce/'c4/'d6/'d0/'cb/'ce”):{f222/fnil/fcharset134/fprq2/'bb/'aa/'ce/'c4/'d6/'d0/'cb/'ce;},然后通过/f222来引用该字体即可。

颜色表定义的例子如下:

{/colortbl;/red0/green0/blue0;/red0/green0/blue255;/red0/green255/blue255;/red0/green255/blue0;/red255/green0/blue255;/red255/green0/blue0;/red255/green255/blue0;/red255/green255/blue255;/red0/green0/blue128;/red0/green128/blue128;/red0/green128/blue0;/red128/green0/blue128;/red128/green0/blue0;/red128/green128/blue0;/red128/green128/blue128;/red192/green192/blue192;

… …}

颜色表中每个颜色值采用RGB格式书写,每个颜色用分号格开,注意第一个颜色值/c0为空,表示系统默认颜色(一般为黑色)。依次为:/0、/1、/2、… …。我们在使用颜色时(如字体颜色)就可以指定某一个颜色索引值,如“/cf2Sunday”表示字体颜色为RGB(0,0,255)蓝色的文字Sundy。“/cb6ABC”表示字体背景色为RGB(255,0,0)的文字“ABC”。如果我们需要加入其他颜色值,只需要在颜色表中加入颜色定义,并通过相应的索引值来引用它即可。

l 字符底纹语法如下:

控制字

涵义

/chbrdr

字符边框(每边均有边框)。

/chshdngN

字符阴影。参数N的值文字阴影的百分比。

/chcfpatN

N是背景图案的颜色,指定文档颜色表的一个索引。

/chcbpatN

N是填充色,指定文档颜色表的一个索引。

/chbghoriz

指定水平线文本背景图案。

/chbgvert

指定垂直线文本背景图案。

/chbgfdiag

指定正向对角线文本背景图案(////)。

/chbgbdiag

指定反向对角线文本背景图案(////)。

/chbgcross

指定十字线文本背景图案。

/chbgdcross

指定对角十字线文本背景图案。

/chbgdkhoriz

指定粗水平线文本背景图案。

/chbgdkvert

指定粗垂直线文本背景图案。

/chbgdkfdiag

指定粗前斜线文本背景图案(////)。

/chbgdkbdiag

指定粗后斜线文本背景图案(////)。

/chbgdkcross

指定粗十字线文本背景图案。

/chbgdkdcross

指定粗对角十字线文本背景图案。

假设我们希望得到背景为水平线、字体为华文中宋(字体索引为222)、颜色为红色(颜色索引为6)的文本“星期天”,则只需输入:/f222/cf6/'bb/'aa/'ce/'c4/'d6/'d0/'cb/'ce 即可。

l 字符下划线语法如下:

控制字