RTF文件格式研究.docx
- 文档编号:14191709
- 上传时间:2023-06-21
- 格式:DOCX
- 页数:26
- 大小:26.80KB
RTF文件格式研究.docx
《RTF文件格式研究.docx》由会员分享,可在线阅读,更多相关《RTF文件格式研究.docx(26页珍藏版)》请在冰点文库上搜索。
RTF文件格式研究
这几天正在写一个编辑器,需要研究RTF文件格式,以下是我收集的一个资料,非常实用。
在随后不长的时间内,我将发布一款VB代码格式化的源程序。
RTF文件格式研究报告(代开版辞)
摘要:
本文对RTF文件格式进行分析研究,对RTF文件结构及特性进行了阐述,并分别列举了几个实用性的例子进行详细分析,最终通过VB程序代码实现了一个RTF书写器(不具有所见即所得特性)。
本文对软件开发人员及RTF文件格式感兴趣的人员具有参考价值。
关键字:
RTF、RichTextFormat、Office、文件格式。
一、引言
富文本格式(RTF)规范是为了便于在应用程序之间轻松转储格式化文本和图形的一种编码方法。
现在,用户可以利用特定转换软件,在不同系统如MS-DOS、Windows、OS/2、Macintosh和PowerMacintosh的应用程序之间转移字处理文档。
RTF规范提供一种在不同的输出设备、操作环境和操作系统之间交换文本和图形的一种格式。
RTF使用ANSI,PC-8,Macintosh,或IBMPC字符集控制文档的表示法和格式化,包括屏幕显示和打印。
凭借RTF规范,不同的操作系统和不同的软件程序创建的文档能够在这些操作系统和应用程序之间传递。
将一个格式化的文件转换为RTF文件的软件称为RTF书写器。
RTF书写器用于分离现有文本中的程序控制信息,并且生成一个包含文本和与之相关的RTF组的新文件。
将RTF文件转换成格式化文件的软件则称为RTF阅读器。
二、RTF基本语法
RTF文件由未格式化本文、控制字、控制符和组组成。
RTF文件没有限制文件的行的最大长度。
控制字是RTF用来标记打印控制符和管理文档信息的一种特殊格式的命令。
一个控制字最长32个字符。
控制字的使用格式如下:
\字母序列<分隔符>
注意:
每个控制字均以一个反斜杠\开头。
字母序列由a~z的小写字母组成。
控制字(或者称为关键字)通常应该不包含任何大写字母。
分隔符标记RTF控制字的结束,可以是下列各项之一:
· 一个空格,这时空格是控制字的一部份。
· 一个数字或连字符(-),表示跟随的一个数值参数。
该数字序列的长度由其后的一个空格或除了字母和数字的其他字符划定。
这个参数可以是正数或者负数,它的取值范围通常是从-32767到32767。
· 任何非字母和数字的其他字符。
这种情况下,此分隔字符结束控制字,而它并不属于控制字的一部分。
控制符由一个反斜线\跟随单个非字母字符组成。
例如,\~代表一个不换行空格。
控制符不需要分隔符。
组由包括在({})中的文本、控制字或控制符组成。
左扩符({)表示组的开始,右扩符(})表示组的结束。
每个组包括文本和文本的不同属性。
RTF文件也能同时包括字体、格式、屏幕颜色、图形、脚注、注释(注解)、文件头和文件尾、摘要信息、域和书签的组合,以及文档、区段、段落和字符的格式属性。
如果包括字体、文件、格式、屏幕颜色、校订标记,以及摘要信息组、文档格式属性,则他们一定要在文件的第一纯文本字符之前,这些组形成RTF的文件头。
如果包括字体组,则它应该在格式组之前。
如果组未使用,可以省略。
对于RTF文件的详细语法及关键字说明请参阅《RichTextFormat(RTF)Specificationv1.7》,这里不作更详细的说明。
三、HelloWord
国际惯例,一个HelloWord!
演示例子,内容如下:
{\rtf1\ansi\ansicpg936\deff0\deflang1033\deflangfe2052
{\fonttbl{\f0\fmodern\fprq6\fcharset134\'cb\'ce\'cc\'e5;}}
{\*\generatorMsftedit5.41.21.2500;}\viewkind4\uc1\pard\lang2052\f0\fs20HelloWorld!
\par}
该文件分析如下(红色):
1、文件基本属性:
{\rtf1RTF版本\ansi字符集\ansicpg936简体中文\deff0默认字体0\deflang1033美国英语\deflangfe2052中国汉语
2、字体表:
{\fonttbl{\f0字体0\fmodern\fprq6字体间距为6\fcharset134GB2312国标码\'cb\'ce\'cc\'e5宋体;}}
3、生成器信息:
{\*\generatorMsftedit5.41.21.2500;}
4、文档属性:
\viewkind4正常视图\uc1单字节\pard默认段落属性\lang2052中国汉语\f0字体0\fs20字体大小20磅
5、正文文本:
HelloWorld!
\par段落标记
}文件结束
注意:
在RTF文件中,中文等双字节字符采用其单字节ASCII码序列表示,例如文本“宋体ABC”应该表示为:
\'cb\'ce\'cc\'e5ABC,这就是为什么RTF可读性差的原因。
如果需要通过程序获取某个字符串的合法ASCII序列,可以采用如下的VB函数:
PublicFunctionStrToASC(ByValstrInAsString)AsString
'将中文字符串转换为ASC串(包括英文一起)
'先将特殊字符进行转义:
strIn=Replace(strIn,Chr(9),"\TAB")
strIn=Replace(strIn,Chr(13)+Chr(10),"\par")
DimiAsLong,sAsString,lsCharAsString,lsPart1AsString,lsPart2AsString
DimlsCharHexAsString
Fori=1ToLen(strIn)
lsChar=Mid(strIn,i,1)
IflsChar="?
"Then
lsCharHex=LCase(Hex(Asc(lsChar)))
IfLen(lsCharHex)=4Then
lsCharHex="\'"+Mid(lsCharHex,1,2)+"\'"+Mid(lsCharHex,3,2)
Else
lsCharHex=lsChar
EndIf
s=s+lsCharHex
Else
lsCharHex=LCase(Hex(Asc(lsChar)))
IfLen(lsCharHex)=4Then
lsCharHex="\'"+Mid(lsCharHex,1,2)+"\'"+Mid(lsCharHex,3,2)
Else
lsCharHex=lsChar
EndIf
s=s+lsCharHex
EndIf
Next
StrToASC=s
EndFunction
四、文字的更高级表示
掌握了基本文字表述方法后,你一定会试着进一步探索文本更高级的表示方法,如下划线、颜色、粗体、斜体等等,而这些在V1.7规范中都作了详细描述,本文只列出部分常用关键字,以供参考。
l 对于字体表和颜色表的说明:
对于我们在文档中使用的每一个字体和颜色,我们都必须在文档头的字体表和颜色表中预先定义。
字体表定义的例子如下:
{\fonttbl
{\f0\froman\fcharset0\fprq2{\*\panose02020603050405020304}TimesNewRoman;}
{\f1\fswiss\fcharset0\fprq2{\*\panose020b0604020202020204}Arial;}
{\f10\fnil\fcharset2\fprq2{\*\panose05000000000000000000}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 字符下划线语法如下:
控制字
涵义
\ul
连续的下划线。
\ul0关闭所有下划线。
\ulcN
下划线颜色。
(注意:
大写N表示一个索引数字,下同)
\uld
点下划线。
\uldash
短划下划线。
\uldashd
点划下划线。
\uldashdd
双点划下划线。
\uldb
双下划线。
\ulhwave
加重波浪下划线。
\ulldash
长划下划线。
\ulnone
停止所有下划线。
\ulth
粗下划线。
\ulthd
粗点下划线。
\ulthdash
粗短划下划线。
\ulthdashd
粗点划下划线。
\ulthdashdd
粗双点划下划线。
\ulthldash
粗长划下划线。
\ululdbwave
双波浪下划线。
\ulw
字下加下划线。
\ulwave
波浪下划线。
下划线语法与前面底纹的使用相同。
l 其他文本显示高级属性:
控制字
涵义
\outl
边框。
\outl0关闭之。
\scaps
小体大写字母。
\scaps0关闭之。
\shad
阴影。
\shad0关闭之。
\strike
删除线。
\strike0关闭之。
\striked1
双删除线。
\striked0关闭之。
\sub
按照字体信息的下标文本和缩小点的尺寸。
\super
按照字体信息的上标文本和缩小点的尺寸。
l 对齐方式语法如下:
控制字
涵义
\qc
居中对齐。
\qj
两端对齐。
\ql
左对齐(默认)。
\qr
右对齐。
\qd
分散对齐。
\qkN
使用Kashida规则调整行百分比(0-低、10-中、20-高)。
\qt
.用于泰文的分散对齐。
l 文本缩进语法如下:
控制字
涵义
\fiN
首行缩进(默认为0)。
\cufiN
采用字符单位的百分比的首行缩进值,用以覆盖\fiN的设置,虽然它们可以设为相同值。
\liN
左端缩进(默认为0)。
\linN
从左至右段落的左端缩进值;如果在从右至左段落则表示右端缩进值(默认为0)。
\linN定义了段前空格数。
\culiN
采用字符单位的百分比的左端缩进值,与\linN一样,它用以覆盖\liN和\linN的设置,虽然它们可以设为相同值。
\riN
右缩进(默认为0)。
\rinN
从左至右段落的右端缩进值;如果在从右至左段落则表示左端缩进值(默认为0)。
\rinN定义了段前空格数。
\curiN
采用字符单位的百分比的右端缩进值,与\rinN一样,它用以覆盖\riN和\rinN的设置,虽然它们可以设为相同值。
\adjustright
当文档网格被定义时自动调整右缩进。
l 文本间距语法如下:
\sbN
段后间隔(默认为0)。
\saN
段前间隔(默认为0)。
\sbautoN
自动段前间隔:
0 段前间距取决于\sb。
1 自动段前间距(忽略\sb)。
默认为0。
\saautoN
自动段后间隔:
0 段后间距取决于\sa。
1 自动段后间距(忽略\sa)
默认为0。
\lisbN
采用字符单位的百分比的段前间隔值,用以覆盖\sbN的设置,虽然它们可以设为相同值。
\lisaN
采用字符单位的百分比的段后间隔值,用以覆盖\saN的设置,虽然它们可以设为相同值。
\slN
行间距。
如果没有使用该控制字或者使用\sl0,则行间距将根据行间字符最高值自动取值。
若N为一个正值,则该值将仅仅在该值大于行间字符最高值时才使用(否则,使用字符最高值);分N是一个负值,即使在其小于行间字符最高值时,总是使用N的绝对值。
\slmultN
多倍行间距。
指出当前行间距是单倍行距的倍数。
该控制字只能跟在\sl后,联合作用。
0 “最小”或者是“精确”的行距
1 多倍行距,相对于“单倍”行距。
\nosnaplinegrid
取消对齐网格线。
因为篇幅限制,更详细的文本格式分析请参阅附件里的文本示例分析原文。
五、图片的表示方式
摸清RTF中图片的表示颇费了一番周折,下面的分析希望能够加速你的学习进程。
一个RTF图片数据通常直接嵌入文件中,这些图象可以是16进制(默认的)或2进制格式。
图象属于目标引用,由\pict控制字开始。
如后面的例子中将描述的,\pict关键字应在\*\shppict引用控制关键字之后。
一个图象的例子如下:
{\*\shppict{\pict
{\*\picprop\shplid1025{\sp{\snshapeType}{\sv75}}{\sp{\snfFlipH}{\sv0}}{\sp{\snfFlipV}{\sv0}}{\sp{\snpibFlags}{\sv2}}{\sp{\snfLine}{\sv0}}{\sp{\snfLayoutInCell}{\sv1}}}
\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw4516\pich4516\picwgoal2560\pichgoal2560\jpegblip\bliptag-728883813
{\*\blipuidd48e1d9b2268ef9f2741709749fb439c}
ffd8ffe000104a46494600010101004800480000ffdb0043000604040405040605050609060506090b080606080b0c0a0a0b0a0a0c100c0c0c0c0c0c100c0e0f……}}
{\nonshppict{\pict\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw4516\pich4516\picwgoal2560\pichgoal2560\wmetafile8\bliptag-728883813\blipupi72
{\*\blipuidd48e1d9b2268ef9f2741709749fb439c}
010*********……}}
其分析如下(红色):
{\*\shppict图片(引用)
{\pict图片开始
绘图对象属性(这个组可以省略):
{\*\picprop表示这里是应用于一个内嵌图象的形状属性\shplid1025标识每个图形的唯一数值
{\sp绘图对象属性定义
{\snshapeType}{\sv75}}图片类型为相框
{\sp{\snfFlipH}{\sv0}}水平翻转:
False
{\sp{\snfFlipV}{\sv0}}垂直翻转:
False
{\sp{\snpibFlags}{\sv2}}链接图片标志
{\sp{\snfLine}{\sv0}}具有线条:
False
{\sp{\snfLayoutInCell}{\sv1}}允许图形锚点定位在单元格内部:
True
}绘图对象属性定义结束
图片属性:
\picscalex100水平缩放比例\picscaley100垂直缩放比例
\piccropl0左端剪切值=0\piccropr0右端剪切值=0\piccropt0上端剪切值=0\piccropb0下端剪切值=0
\picw4516图片的像素宽度\pich4516图片的像素高度\picwgoal2560图象期望宽度\pichgoal2560图象期望高度\jpegblip图片源为一个JPEG文件\bliptag图象ID标识-728883813
{\*\blipuidd48e1d9b2268ef9f2741709749fb439c}
图片16进制数据:
ffd8ffe000104a46494600010101004800480000ffdb0043000604040405040605050609060506090b080606080b0c0a0a0b0a0a0c100c0c0c0c0c0c100c0e0f}16进制图片数据结束
}
兼容性wMetaFile文件内容(可用省略):
{\nonshppict只用于兼容,不读取
{\pict图片开始\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw4516\pich4516\picwgoal2560\pichgoal2560\wmetafile8\bliptag-728883813\blipupi72
{\*\blipuidd48e1d9b2268ef9f2741709749fb439c}
下面是MetaFile类型的16进制数据:
0100090000034660000000002160000000000400000003010800050000000b0200000000050000000c02ac00ac00030000001e00040000000701040021600000
}MetaFile类型16进制图片数据结束
}
为了简化分析,我们除去所以可以省略的内容,则一副图片可以这样表示:
{\*\shppict{\pictpiccropl0\piccropr0\piccropt0\piccropb0\picw宽度\pich高度\picwgoal显示宽度\pichgoal显示高度\jpegblipJPEG类型\bliptag-728883813ID值(为一个负的长整形值)
下面是该图片的实际16进制数据:
ffd8ffe0001……}}
如果需要通过程序获取指定图片合法的16进制字符串,可以采用如下的VB函数:
PublicFunctionPicToASC(ByValstrFileNameAsString)AsString
'获取图片16进制数据
DimbData()AsByte
DimiAsLong
DimlNumAsLong
DimstrDataAsString,strTMPAsString
lNum=FreeFile
OpenstrFileNameForBinaryAs#lNum
ReDimbData(LOF(lNum)-1)
Get#lNum,,bData
Close
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- RTF 文件格式 研究