使用Java抽取RTF思想

1 什么RTF文件
也称富文本格式(Rich Text Format, 一般简称为RTF),意为多文本格式是由微软公司开发的跨平台文档格式。大多数的文字处理软件都能读取和保存RTF文档。[1] rtf是一种非常流行的文件结构,很多文字编辑器都支持它,vb等开发工具甚至还提供了richtxtbox的控件。
结构分析

每个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是文本文件,内码是用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中是以压缩形式储存的,所以在转换时有一定困难。
实现一个RTF文件解释器
设计目标:
可以在各个层次上分析RTF数据
把对RTF数据的解析和解释分开
保持解析器和解释器的可扩展性
开放式框架,自定义RTF转换器
开放式的框架如下图所示:
这里写图片描述
RTF解释器结构如下图所示。实际解释过程可以用ParseListener监听。监听器通过观察者模式对某个事件反映并执行相应的动作。系统已经集成解释器监听器RtfParseListenerFileLogger,把RTF元素的结构写入日志文件。
RtfParseListenerStructreBulider根据解析过程碰到的RTF元素生成结构化模型。这些元素表示成IrtfGroup、IrtfTag、IrtfText实例后再通过监听器 RtfParseListenerStructreBulider.StructureRoot取得层次化模型。
这里写图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章