技术笔记:RTF文件格式

简介: 技术笔记:RTF文件格式

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 字符下划线语法如下:


控制字

相关文章
|
SQL 网络协议 程序员
计算机网络体系结构图解
计算机网络体系结构图解
922 0
|
Windows Python
Windows下pip设置国内源阿里云镜像加速
Windows下pip设置国内源阿里云镜像加速
5058 0
Windows下pip设置国内源阿里云镜像加速
|
6月前
|
Ubuntu 关系型数据库 MySQL
在Ubuntu 22.04上配置和安装MySQL
以上就是在Ubuntu 22.04上配置和安装MySQL的步骤。这个过程可能看起来有点复杂,但只要按照步骤一步步来,你会发现其实并不难。记住,任何时候都不要急于求成,耐心是解决问题的关键。
651 30
|
11月前
|
机器学习/深度学习 人工智能 大数据
基于深度学习的图像识别技术最新进展####
近年来,深度学习在图像识别领域取得了显著突破,本文综述了该领域的最新研究进展,特别关注卷积神经网络(CNN)的优化与创新、数据集扩充与增强策略、以及模型压缩与加速技术。通过对比分析不同网络结构和训练技巧,揭示了提升图像识别精度与效率的关键因素。此外,探讨了小样本学习、迁移学习在实际应用中的挑战与解决方案,为未来研究方向提供了新的视角和思路。 ####
896 8
|
7月前
|
编解码 Ubuntu Linux
Hyper-V分辨率过低,如何调整有哪些方法?
当Hyper-V虚拟机分辨率过低时,可通过以下方法调整: 1. **增强会话模式(ESM)**:启用ESM后,通过滑块或右键菜单调整分辨率。 2. **虚拟机内部设置**:进入操作系统显示设置,选择合适分辨率并应用。 3. **Linux虚拟机特殊设置**:修改GRUB配置文件,添加`video=hyperv_fb:【分辨率】`,更新GRUB并重启。 4. **PowerShell命令**:使用PowerShell脚本启用ESM。 注意事项:确保系统和Hyper-V版本兼容,安装最新显卡驱动,合理分配资源。
Hyper-V分辨率过低,如何调整有哪些方法?
|
12月前
|
编解码 前端开发 UED
|
Java 测试技术
idea for mac 最全快捷键整理
idea for mac 最全快捷键整理
2693 12
|
开发框架 C语言 开发者
STM32寄存器操作、模板构建
【8月更文挑战第23天】本文档介绍STM32中的寄存器操作方法与模板构建技巧。寄存器是STM32控制内外设的核心,通过直接读写特定内存地址来进行操作。以配置GPIO为例,需定位寄存器地址并写入适当值。文档还提供了一个基本的代码模板,包括包含头文件、时钟配置、外设初始化及主函数流程,帮助开发者快速搭建开发框架,并强调了参考手册的重要性以确保正确使用。
403 1
|
开发者 C# UED
WPF多窗口应用程序开发秘籍:掌握窗口创建、通信与管理技巧,轻松实现高效多窗口协作!
【8月更文挑战第31天】在WPF应用开发中,多窗口设计能显著提升用户体验与工作效率。本文详述了创建新窗口的多种方法,包括直接实例化`Window`类、利用`Application.Current.MainWindow`及自定义方法。针对窗口间通信,介绍了`Messenger`类、`DataContext`共享及`Application`类的应用。此外,还探讨了布局控件与窗口管理技术,如`StackPanel`与`DockPanel`的使用,并提供了示例代码展示如何结合`Messenger`类实现窗口间的消息传递。总结了多窗口应用的设计要点,为开发者提供了实用指南。
834 0
|
Ubuntu Linux
【ubuntu】在 Ubuntu 系统中,查看启动项
【ubuntu】在 Ubuntu 系统中,查看启动项
642 0