首先可能就是考虑使用 创建文件映象 打开源文件了,然后建一个需要大小的目标文件。
将源文件一部分一部分地分成若干目标文件。但如何断句呢。这些文章在网上有,
http://www.biblioscape.com/rtf15_spec.htm 就是 rtf 格式定义。这里贴个简单的文章:
一、RTF文件结构分析
每个RTF文件都是一个文本文件,显示时由RTF阅读器格式化。文件开始处是{/rtf,它作为RTF文
件的标志是必不可少的,RTF阅读器根据它来判断一个文件是否为RTF格式。然后是文件头和正文,
文件头包括字体表、文件表、颜色表等几个数据结构,正文中的字体、表格的风格就是根据文件
头的信息来格式化的。每个表用一对大括号括起来,当中包含了很多用字符“/”开始的命令。
例如,某个颜色表如下:
{/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;}
开始时用/colortbl标明大括号内是颜色表,接着是/red0/green0/blue0,登记了一种颜色,
这种颜色的红绿蓝分量都为0。其它表依此类推。文件头之后是正文,正文由版面格式化命令、
文字和各种特殊命令组成。其中只有特殊命令用大括号括起来,而版面格式化命令和文字是"开
放式"的,从而把文字和命令分离。文件结束时有一个“}”,和第一个“{”对应。在整个文件
中,“}”和“{”必须一一对应。这种格式是RTF阅读器和转换器算法的基础。
RTF格式还有一个特别之处,就是有些字符在命令中有特殊的含义,所以当它们作为文本出
现时需要在它们的前面加一个“/”,例如“/”本身就要表示为“//”。事实上,这种形式在
大多数编程语言中是很常见的。
二、算法分析
本节介绍的算法虽然是针对RTF的读写,但也是一般文件过滤器通用的方法,适用于各种格
式文件之间的转换。具体来说就是把各种文件都转换成一种中间格式,再根据要求进行显示或
转换。其中有个原则是一定要遵守的:程序必须能过滤掉不认识的格式。各种文件都有其特殊
的格式,在转换过程中不可避免会出现格式损失的现象,在算法中要考虑这种情况。对于RTF这
类格式化文本文件来说,最重要的是要正确地显示或转换文件的大小、颜色、字体等风格。
因此,在程序中应该用一个数据结构把这些信息存起来,这个结构就是所谓的中间格式,怎样
规定悉听尊便。
三、难点分析
在开发过程中我们遇到了不少问题,其中有两个问题特别有意思。
第一个问题是中文的表示方式。在RTF中中文用命令的形式表示:“/'内码”。内码就是汉
字机内码。不过,请注意:RTF是文本文件,内码是用ASCII码来储存的,必须把它转换成数字才
能使用。例如,“电子与电脑”在RTF中的形式是:
/'b5/'e7/'d7/'d3/'d3/'eb/'b5/'e7/'c4/'d4
第二个是图片的问题,这也是本文的重点。RTF中图片以两种方式存在:第一种方式是直接
嵌入,以{/pict开始;第二种方式是作为OLE对象嵌入,这时以{/object开始。当RTF处理器能直
接使用OLE时,RTF文件中提供了OLE的数据;否则,文件中直接提供图片的数据,以{/result开始。
在使用中最常见的图片格式是内含DIB BITMAP的元文件(METAFILE),这种格式在SDK中没有说明,
而且在RTF中是以压缩形式储存的,所以在转换时有一定困难。我们采取了一种比较新的方法:先
把META FILE的数据读出来存成一个文件,然后用GetMetafile和PlayMetafile函数把文件中的图
形打印在一个内存DC上,最后用抓图的方法把它存成BITMAP文件。
四.RTF格式的扩展
最后讨论一下RTF格式的扩展。RTF格式作为一个标准应该是统一的,但在某种情况下进行扩展
是必要的。最明显的例子是微软的WORD,它有自己独有的RTF命令。如果想使自己的软件在技术上占
有优势,也可以通过创造新的RTF命令来实现。例如,如果你希望在软件中支持DHTML,则可在RTF中
嵌入{/dhtml或{/java之类的命令。由于RTF阅读器有过滤不认识命令的功能,所以这样做不会影响
RTF文件的通用性。
了解了它的格式,就大约知道如何断句和添加rtf文件头了。也就有希望将大文件割开来了。
下面是一个 “王” 字的 rtf 储存(只是写字板格式,不是 Word 的):
{
/rtf1/ansi/ansicpg936/deff0/deflang1033/deflangfe2052 // rtf版本、字符、代码页等
{
/fonttbl // 字体属性
{
/f0/fnil/fprq2/fcharset134 /'cb/'ce/'cc/'e5;
}
}
{/colortbl ;/red255/green0/blue0;
// 颜色表
}
/viewkind4/uc1/pard/nowidctlpar/cf1/lang2052/f0/fs20/'cd/'f5/par // 文字
}