使用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取得層次化模型。
這裏寫圖片描述

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