rtf格式的一些说明,转载的

RTF是Rich TextFormat的缩写,意即多文本格式。这是一种类似DOC格式(Word文档)的文件,有很好的兼容性,使用Windows“附件”中的“写字板”就能打开并进行编辑。RTF是一种非常流行的文件结构,很多文字编辑器都支持它。一般的格式设置,比如字体和段落设置,页面设置等等信息都可以存在RTF格式中,它能在一定程度上实现word与wps文件之间的互访。

一个RTF文件由未格式化文本、控制字、控制符号和组组成。为了更容易的转换,一个标准的RTF文件应该仅包含7位ASCII码字符。RTF文件没有限制文件的行的最大长度。(再议:maximun line length是指行的字符数还是指文档的行数?)
Delimiter

一个数字或连字符(-), 意味着它是一个数字参数。这数字序列的长度由其后的一个空格或除了字母和数字的其他字符划定。这个参数可以是正数或者负数,它的取值范围通常是从-32767到32767。然而,Word的取值范围可以到达由-31680到31680。Word 允许关键字的小数字参数取值范围在-2,147,483,648到2,147,483,648(特别的,/bin, /revdttm,和一些图像属性)。(再议:a small number of keywords不知所指,应该指这些二进制文件吧。)一个RTF解析器应该能够将一个随意写出的数字字符串转换为一个关键字的合法值。如果一个数值参数紧跟着控制字,这个参数就是控制字的一部分。这时,控制字通过一个空格或非字母数字字符分隔出来,和分隔其他控制字的方式相同。 
      除了字母和数字的其他字符。这种情况下,此分隔字符结束控制字,而它并不属于控制字的一部分。
      如果是第一种情况,空格并不会出现在文档中。分隔符之后的所有字符,包括空格,将被写入文档。基于这个理由,你应该尽在需要的情况下使用空格,不要只是将空格用在分隔RTF代码。

RTF 文件内容

一个 RTF 文件符合以下语法:
< File>‘{‘ <header> <document> ‘}‘ 
本语法是标准的RTF语法,任何RTF查看器都应该可以正确的解释以此语法格式写出的RTF文件。有必要重申的是:RTF查看器没有必要包含所有的控制字,但它必须能够无害的忽略它不知道(或者未使用)的控制字,并且必须能正确的略过被控制字符号标记的部分。然而,生成RTF的编辑器有可能并没完全符合这个语法规范,同样地,RTF查看器应该有足够能力去处理一些细微变更的控制字。虽然如此,如果一个生成RTF的编辑器符合本规范,那么任何一个正确的RTF查看器都应该能够完美的解释它。

RTF文件结构分析及其应用

下面将对RTF文件结构分析及其应用进行讨论。

一、RTF文件结构分析

  RTF的结构并不复杂,但内容繁多,本文不可能一一说明,只能从总体上讨论一下(如果想阅读详尽的RTF文档,则可在Internet上寻找或与笔者联系。)
每个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中是以压缩形式储存的,所以在转换时有一定困难。

  四.RTF格式的扩展

  最后讨论一下RTF格式的扩展。RTF格式作为一个标准应该是统一的,但在
某种情况下进行扩展是必要的。最明显的例子是微软的WORD,它有自己独有的RTF命令。如果想使自己的软件在技术上占有优势,也可以通过创造新的RTF命令来实现。例如,如果你希望在软件中支持DHTML,则可在RTF中嵌入{/dhtml或{/java之类的命令。由于RTF阅读器有过滤不认识命令的功能,所以这样做不会影响RTF文件的通用性。

RTF文件格式学习与应用

一、引言

操作系统之间交换文本和图形的一种格式。RTF使用ANSI, PC-8, Macintosh, 或IBM PC字符集控制文档的表示法和格式化,包括屏幕显示和打印。凭借RTF规范,不同的操作系统和不同的软件程序创建的文档能够在这些操作系统和应用程序之间传递。
      将一个格式化的文件转换为RTF文件的软件称为RTF书写器。RTF书写器用于分离现有文本中的程序控制信息,并且生成一个包含文本和与之相关的RTF组的新文件。将RTF文件转换成格式化文件的软件则称为RTF阅读器。

控制字是RTF用来标记打印控制符和管理文档信息的一种特殊格式的命令。一个控制字最长32个字符。控制字的使用格式如下: 
/字母序列<分隔符>
注意:每个控制字均以一个反斜杠/开头。字母序列由a~z 的小写字母组成。控制字(或者称为关键字)通常应该不包含任何大写字母。
分隔符标记RTF控制字的结束, 可以是下列各项之一:
·      一个空格,这时空格是控制字的一部份。
·      一个数字或连字符(-), 表示跟随的一个数值参数。该数字序列的长度由其后的一个空格或除了字母和数字的其他字符划定。这个参数可以是正数或者负数,它的取值范围通常是从-32767到32767。
·      任何非字母和数字的其他字符。这种情况下,此分隔字符结束控制字,而它并不属于控制字的一部分。
控制符由一个反斜线/跟随单个非字母字符组成。例如,/~代表一个不换行空格。控制符不需要分隔符。
组由包括在({})中的文本、控制字或控制符组成。左扩符({)表示组的开始,右扩符(})表示组的结束。每个组包括文本和文本的不同属性。RTF文件也能同时包括字体、格式、屏幕颜色、图形、脚注、注释(注解)、文件头和文件尾、摘要信息、域和书签的组合,以及文档、区段、段落和字符的格式属性。如果包括字体、文件、格式、屏幕颜色、校订标记,以及摘要信息组、文档格式属性,则他们一定要在文件的第一纯文本字符之前,这些组形成RTF的文件头。如果包括字体组,则它应该在格式组之前。如果组未使用,可以省略。
对于RTF文件的详细语法及关键字说明请参阅《Rich Text Format (RTF) Specification v1.7》,这里不作更详细的说明。

三、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可读性差的原因。

四、文字的更高级表示

掌握了基本文字表述方法后,你一定会试着进一步探索文本更高级的表示方法,如下划线、颜色、粗体、斜体等等,而这些在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/chbghoriz/‘bb/‘aa/‘ce/‘c4/‘d6/‘d0/‘cb/‘ce 即可。
l        字符下划线语法如下:

=========================================================================
/ul     连续的下划线。/ul0关闭所有下划线。
 
/ulcN     下划线颜色。(注意:大写N表示一个索引数字,下同)
 
/uld     点下划线。
 
/uldash     短划下划线。

/uldashdd    双点划下划线。

/ulhwave    加重波浪下划线。

/ulnone     停止所有下划线。
 
/ulth     粗下划线。

/ulthdash     粗短划下划线。

/ulthdashdd     粗双点划下划线。

/ululdbwave    双波浪下划线。

/ulwave     波浪下划线。
  
下划线语法与前面底纹的使用相同。

控制字      涵义
====================================================
/outl     边框。/ outl 0关闭之。
 
/scaps     小体大写字母。/ scaps 0关闭之。
 
/shad     阴影。/ shad 0关闭之。
 
/strike     删除线。/strike0关闭之。
 
/striked1    双删除线。/striked0关闭之。
 
/sub     按照字体信息的下标文本和缩小点的尺寸。
 
/super     按照字体信息的上标文本和缩小点的尺寸。

控制字      涵义
======================================================================
/qc     居中对齐。

/ql     左对齐(默认)。

/qd     分散对齐。
 
/qkN     使用Kashida规则调整行百分比(0-低、10-中、20-高)。

l        文本缩进语法如下:
控制字      涵义
========================================================================
/fiN     首行缩进(默认为0)。
 
/cufiN     采用字符单位的百分比的首行缩进值,用以覆盖/fiN的设置,虽然它们可以设为相同值。
 
/liN     左端缩进(默认为0)。

/culiN     采用字符单位的百分比的左端缩进值,与/linN一样,它用以覆盖/liN和/linN的设置,虽然它们可以设为相同值。

/rinN     从左至右段落的右端缩进值;如果在从右至左段落则表示左端缩进值(默认为0)。/rinN定义了段前空格数。

/adjustright    当文档网格被定义时自动调整右缩进。
l        文本间距语法如下:
/sbN     段后间隔(默认为0)。

/sbautoN    自动段前间隔:

1  自动段前间距(忽略/sb)。

/saautoN    自动段后间隔:

1 自动段后间距(忽略/sa)
 默认为0。

/lisaN   采用字符单位的百分比的段后间隔值,用以覆盖/saN的设置,虽然它们可以设为相同值。

/slmultN  多倍行间距。指出当前行间距是单倍行距的倍数。该控制字只能跟在/sl后,联合作用。
 0       “最小”或者是“精确”的行距
 1       多倍行距,相对于“单倍”行距。

五、图片的表示方式

一个图象的例子如下:
{/*/shppict{/pict 
{/*/picprop/shplid1025{/sp{/sn shapeType}{/sv 75}}{/sp{/sn fFlipH}{/sv 0}}{/sp{/sn fFlipV}{/sv 0}}{/sp{/sn pibFlags}{/sv 2}}{/sp{/sn fLine}{/sv 0}}{/sp{/sn fLayoutInCell}{/sv 1}}}
/picscalex100/picscaley100/piccropl0/piccropr0/piccropt0/piccropb0/picw4516/pich4516/picwgoal2560/pichgoal2560/jpegblip/bliptag-728883813
{/*/blipuid d48e1d9b2268ef9f2741709749fb439c}
ffd8ffe000104a46494600010101004800480000ffdb0043000604040405040605050609060506090b080606080b0c0a0a0b0a0a0c100c0c0c0c0c0c100c0e0f… …}}
{/nonshppict {/pict /picscalex100/picscaley100/piccropl0/piccropr0/piccropt0/piccropb0/picw4516/pich4516/picwgoal2560/pichgoal2560/wmetafile8/bliptag-728883813/blipupi72
{/*/blipuid d48e1d9b2268ef9f2741709749fb439c}
0100090000034660000000002160000000000400000003010800050000000b0200000000050000000c02ac00ac00030000001e00040000000701040021600000… …}}
其分析如下(红色):
{/*/shppict图片(引用)
{/pict图片开始
绘图对象属性(这个组可以省略):
{/*/picprop表示这里是应用于一个内嵌图象的形状属性/shplid1025标识每个图形的唯一数值
{/sp绘图对象属性定义
{/sn shapeType}{/sv 75}} 图片类型为相框
{/sp{/sn fFlipH}{/sv 0}} 水平翻转:False
{/sp{/sn fFlipV}{/sv 0}} 垂直翻转:False
{/sp{/sn pibFlags}{/sv 2}} 链接图片标志
{/sp{/sn fLine}{/sv 0}}具有线条:False
{/sp{/sn fLayoutInCell}{/sv 1}}允许图形锚点定位在单元格内部:True
}绘图对象属性定义结束
图片属性:
/picscalex100水平缩放比例/picscaley100垂直缩放比例
/piccropl0左端剪切值=0/piccropr0右端剪切值=0/piccropt0上端剪切值=0/piccropb0下端剪切值=0
/picw4516图片的像素宽度/pich4516图片的像素高度/picwgoal2560图象期望宽度/pichgoal2560图象期望高度/jpegblip图片源为一个JPEG文件/bliptag图象ID标识-728883813
{/*/blipuid d48e1d9b2268ef9f2741709749fb439c}
图片16进制数据:
ffd8ffe000104a46494600010101004800480000ffdb0043000604040405040605050609060506090b080606080b0c0a0a0b0a0a0c100c0c0c0c0c0c100c0e0f}16进制图片数据结束
}
兼容性wMetaFile文件内容(可用省略):
{/nonshppict只用于兼容,不读取
{/pict图片开始/picscalex100/picscaley100/piccropl0/piccropr0/piccropt0/piccropb0/picw4516/pich4516/picwgoal2560/pichgoal2560/wmetafile8/bliptag-728883813/blipupi72
{/*/blipuid d48e1d9b2268ef9f2741709749fb439c}
下面是MetaFile类型的16进制数据:
0100090000034660000000002160000000000400000003010800050000000b0200000000050000000c02ac00ac00030000001e00040000000701040021600000
}MetaFile类型16进制图片数据结束
}
为了简化分析,我们除去所以可以省略的内容,则一副图片可以这样表示:
{/*/shppict{/pict piccropl0/piccropr0/piccropt0/piccropb0/picw宽度/pich高度/picwgoal显示宽度/pichgoal显示高度/jpegblipJPEG类型/bliptag-728883813ID值(为一个负的长整形值)
下面是该图片的实际16进制数据:
ffd8ffe0001… …}}

六、表格基本表示方法

一个简单表格例子如下: 
1,1  1,2  1,3 
2,1  2,2  2,3
 RTF内容如下:
/trowd /irow0/irowband0/ts15/trgaph108/trleft-108/trbrdrt
/brdrs/brdrw10 /trbrdrl/brdrs/brdrw10 /trbrdrb/brdrs/brdrw10 /trbrdrr/brdrs/brdrw10 /trbrdrh/brdrs/brdrw10 /trbrdrv/brdrs/brdrw10 
/trftsWidth1/trftsWidthB3/trautofit1/trpaddl108/trpaddr108/trpaddfl3/trpaddft3/trpaddfb3/trpaddfr3/tblrsid2113686/tbllkhdrrows/tbllklastrow/tbllkhdrcols/tbllklastcol /clvertalt/clbrdrt/brdrs/brdrw10 /clbrdrl/brdrs/brdrw10 /clbrdrb/brdrs/brdrw10 /clbrdrr
/brdrs/brdrw10 /cltxlrtb/clftsWidth3/clwWidth2840/clshdrawnil /cellx2732/clvertalt/clbrdrt/brdrs/brdrw10 /clbrdrl/brdrs/brdrw10 /clbrdrb/brdrs/brdrw10 /clbrdrr/brdrs/brdrw10 /cltxlrtb/clftsWidth3/clwWidth2841/clshdrawnil /cellx5573/clvertalt/clbrdrt
/brdrs/brdrw10 /clbrdrl/brdrs/brdrw10 /clbrdrb/brdrs/brdrw10 /clbrdrr/brdrs/brdrw10 /cltxlrtb/clftsWidth3/clwWidth2841/clshdrawnil /cellx8414/pard/plain /qj /li0/ri0/nowidctlpar/intbl/aspalpha/aspnum/faauto/adjustright/rin0/lin0/yts15 
/fs21/lang1033/langfe2052/kerning2/loch/af0/hich/af0/dbch/af13/cgrid/langnp1033/langfenp2052 {/insrsid2113686 /hich/af0/dbch/af13/loch/f0 1,1/cell /hich/af0/dbch/af13/loch/f0 1,2/cell /hich/af0/dbch/af13/loch/f0 1,3/cell }/pard/plain 
/ql /li0/ri0/widctlpar/intbl/aspalpha/aspnum/faauto/adjustright/rin0/lin0 /fs21/lang1033/langfe2052/kerning2/loch/af0/hich/af0/dbch/af13/cgrid/langnp1033/langfenp2052 {/insrsid2113686 /trowd /irow0/irowband0/ts15/trgaph108/trleft-108/trbrdrt
/brdrs/brdrw10 /trbrdrl/brdrs/brdrw10 /trbrdrb/brdrs/brdrw10 /trbrdrr/brdrs/brdrw10 /trbrdrh/brdrs/brdrw10 /trbrdrv/brdrs/brdrw10 
/trftsWidth1/trftsWidthB3/trautofit1/trpaddl108/trpaddr108/trpaddfl3/trpaddft3/trpaddfb3/trpaddfr3/tblrsid2113686/tbllkhdrrows/tbllklastrow/tbllkhdrcols/tbllklastcol /clvertalt/clbrdrt/brdrs/brdrw10 /clbrdrl/brdrs/brdrw10 /clbrdrb/brdrs/brdrw10 /clbrdrr
/brdrs/brdrw10 /cltxlrtb/clftsWidth3/clwWidth2840/clshdrawnil /cellx2732/clvertalt/clbrdrt/brdrs/brdrw10 /clbrdrl/brdrs/brdrw10 /clbrdrb/brdrs/brdrw10 /clbrdrr/brdrs/brdrw10 /cltxlrtb/clftsWidth3/clwWidth2841/clshdrawnil /cellx5573/clvertalt/clbrdrt
/brdrs/brdrw10 /clbrdrl/brdrs/brdrw10 /clbrdrb/brdrs/brdrw10 /clbrdrr/brdrs/brdrw10 /cltxlrtb/clftsWidth3/clwWidth2841/clshdrawnil /cellx8414/row }/pard/plain /qj /li0/ri0/nowidctlpar/intbl/aspalpha/aspnum/faauto/adjustright/rin0/lin0/yts15 
/fs21/lang1033/langfe2052/kerning2/loch/af0/hich/af0/dbch/af13/cgrid/langnp1033/langfenp2052 {/insrsid2113686 /hich/af0/dbch/af13/loch/f0 2,1/cell /hich/af0/dbch/af13/loch/f0 2,2/cell /hich/af0/dbch/af13/loch/f0 2,3/cell }/pard/plain 
/ql /li0/ri0/widctlpar/intbl/aspalpha/aspnum/faauto/adjustright/rin0/lin0 /fs21/lang1033/langfe2052/kerning2/loch/af0/hich/af0/dbch/af13/cgrid/langnp1033/langfenp2052 {/insrsid2113686 /trowd /irow1/irowband1/lastrow /ts15/trgaph108/trleft-108/trbrdrt
/brdrs/brdrw10 /trbrdrl/brdrs/brdrw10 /trbrdrb/brdrs/brdrw10 /trbrdrr/brdrs/brdrw10 /trbrdrh/brdrs/brdrw10 /trbrdrv/brdrs/brdrw10 
/trftsWidth1/trftsWidthB3/trautofit1/trpaddl108/trpaddr108/trpaddfl3/trpaddft3/trpaddfb3/trpaddfr3/tblrsid2113686/tbllkhdrrows/tbllklastrow/tbllkhdrcols/tbllklastcol /clvertalt/clbrdrt/brdrs/brdrw10 /clbrdrl/brdrs/brdrw10 /clbrdrb/brdrs/brdrw10 /clbrdrr
/brdrs/brdrw10 /cltxlrtb/clftsWidth3/clwWidth2840/clshdrawnil /cellx2732/clvertalt/clbrdrt/brdrs/brdrw10 /clbrdrl/brdrs/brdrw10 /clbrdrb/brdrs/brdrw10 /clbrdrr/brdrs/brdrw10 /cltxlrtb/clftsWidth3/clwWidth2841/clshdrawnil /cellx5573/clvertalt/clbrdrt
/brdrs/brdrw10 /clbrdrl/brdrs/brdrw10 /clbrdrb/brdrs/brdrw10 /clbrdrr/brdrs/brdrw10 /cltxlrtb/clftsWidth3/clwWidth2841/clshdrawnil /cellx8414/row }
是不是很复杂?不过没关系,我们通过对其进行分段,并加入适当注释,你就会对RTF文件中的表结构一目了然。首先需要声明的是,RTF1.7规范中规定,表行的格式如下:(<tbldef> <cell>+ <tbldef> /row) | (<tbldef> <cell>+ /row) | (<cell>+ <tbldef> /row),目前Word2003采用的方式就是第一种,即“定义+内容+重复定义”,如此一来就会有很大的数据冗余,这就是为什么Word2003的一个简单文档都会很大的原因,不过为了兼容性考虑,这样处理也是必要的。其定义也由“行定义+单元格定义”组成,其中单元格定义可用重复。
分析代码如下(红色):

表格行1
/trowd表行1开始
表格属性
/trgaph108表中单元格半间距/trleft-108表的最左边位置
行边框设置
/trbrdrt行的上边框/brdrs单倍厚度/brdrw10线宽
/trbrdrl行的左边框/brdrs单倍厚度/brdrw10线宽
/trbrdrb行的下边框/brdrs单倍厚度/brdrw10线宽
/trbrdrr行的右边框/brdrs单倍厚度/brdrw10线宽
单元格1边框设置
/clbrdrt单元格上边框/brdrw15线宽/brdrs单倍厚度
/clbrdrl单元格左边框/brdrw15线宽/brdrs单倍厚度
/clbrdrb单元格下边框/brdrw15线宽/brdrs单倍厚度
/clbrdrr单元格右边框/brdrw15线宽/brdrs单倍厚度
/cellx2732单元格右边界
单元格2边框设置
/clbrdrt单元格上边框/brdrw15线宽/brdrs单倍厚度
/clbrdrl单元格左边框/brdrw15线宽/brdrs单倍厚度
/clbrdrb单元格下边框/brdrw15线宽/brdrs单倍厚度
/clbrdrr单元格右边框/brdrw15线宽/brdrs单倍厚度
/cellx5573单元格右边界
单元格3边框设置
/clbrdrt单元格上边框/brdrw15线宽/brdrs单倍厚度
/clbrdrl单元格左边框/brdrw15线宽/brdrs单倍厚度
/clbrdrb单元格下边框/brdrw15线宽/brdrs单倍厚度
/clbrdrr单元格右边框/brdrw15线宽/brdrs单倍厚度
/cellx8414单元格右边界
行1数据
/pard重置段落属性/intbl段落是表的一部分/kerning2紧缩字符尺寸/f0字体0/fs21尺寸21 
1,1 1,1 /cell表单元格1结束
1,2 1,2 /cell表单元格2结束
1,3 1,3 /cell表单元格3结束
/f1字体1
/row表行1结束
/f0字体0
表格行2
/trowd表行2开始
/trgaph108表中单元格半间距/trleft-108表的最左边位置
行边框设置
/trbrdrt/brdrs/brdrw10 
/trbrdrl/brdrs/brdrw10 
/trbrdrb/brdrs/brdrw10 
/trbrdrr/brdrs/brdrw10 
单元格1边框设置
/clbrdrt/brdrw15/brdrs
/clbrdrl/brdrw15/brdrs
/clbrdrb/brdrw15/brdrs
/clbrdrr/brdrw15/brdrs 
/cellx2732
单元格2边框设置
/clbrdrt/brdrw15/brdrs
/clbrdrl/brdrw15/brdrs
/clbrdrb/brdrw15/brdrs
/clbrdrr/brdrw15/brdrs 
/cellx5573
单元格3边框设置
/clbrdrt/brdrw15/brdrs
/clbrdrl/brdrw15/brdrs
/clbrdrb/brdrw15/brdrs
/clbrdrr/brdrw15/brdrs 
/cellx8414
行2数据
/intbl 段落是表的一部分
2,1 2,1/cell表单元格1结束
2,2 2,2/cell表单元格2结束
2,3 2,3/cell表单元格3结束
/f1字体1
/row表行2结束
至此,你应该对RTF表格输出有一定认识了吧。当然在表格中插入图片、嵌入表格等的实现方法同理,嵌入的图片可以等同于一段文本来处理,但是嵌套表格的实现可能比较复杂,因为它涉及段落文本嵌套层次等高级问题,这里不再详述,有兴趣的读者可以参考《Rich Text Format (RTF) Specification v1.7》。

RTF文件<File>

RTF版本/rtf
     字符集<charset>
     默认字体区域设置<deffont>
     默认字体号/deff?
     字体表<fonttbl>
     文件表<filetbl>?
     颜色表<colortbl>?
     样式表<stylesheet>?
     编目表<listtables>?
         编目表{ /*/listtable }
         编目替换表{ /*/listoverridetable }
     段落组属性{ /*/pgptbl }
     跟踪修订<revtbl>?
     RSID表<rsidtable>?
     生成器信息<generator>?
文档区<document>
     文档信息区<info>?
         标题<title>?
         主题<subject>?
         作者<author>?
         经理<manager>?
         公司<company>?
         最后修改者<operator>?
         文档类别<category>?
         关键字<keywords>?
         注释<comment>?
         文档的版本号/version?
         Word摘要信息中的注释<doccomm>?
         内部版本号/vern?
         创建时间<creatim>?
         修订时间<revtim>?
         最后打印时间<printim>?
          备份时间<buptim>?
          总编辑时间(单位:分钟)/edmins?
         页数/nofpages?
         字数/nofwords?
         包含空格的总字符数/nofchars?
         内部ID号/id?
     文档格式属性<docfmt>*
         节文本<section>+
              节格式属性<secfmt>*
              页眉页脚设置<hdrftr>?
         段落文本<para>+
              文本<textpar>|
                   项目符号与编号<pn>?
                   段落边框<brdrdef>?
                   段落格式属性<parfmt>*
                   定位对象与边框<apoctl>*
                   制表位设置<tabdef>?
                   段落底纹<shading>?
                   隐藏与否(/v /spv)?
              表格<row>
                   行开始/trowd
                   行定义<tbldef>
                   单元格<cell>+
                       单元格定义+
                       单元格内容+
                   重复行定义<tbldef>
                   行结束/row
         字符文本<char>+
         图片<pict>
              图片开始{/*/shppict {/pict  }
              图片属性
              图片数据
         对象<obj>
         绘图对象/shp
         脚注/footnote
         注释<annot>
         域<field>

时间: 2024-10-25 05:56:42

rtf格式的一些说明,转载的的相关文章

报表XML导出rtf格式,结果在浏览器中打开XML文件。用360浏览器下载rtf文件打开后出现Authentication failed 问题

报表XML导出rtf格式,结果在浏览器中打开XML文件.用360浏览器下载rtf文件打开后出现Authentication failed 问题 直接上问题图: 问题描述:在Oracle EBS中执行"资源事务处理 XML"请求,选择输出rtf格式,完成后查看输出,却在浏览器中打开了XML文件.        提示:需要检查一下是否有对应的模板文件和模板定义有效时间.        解决方案:1. 查看日志. 从中可以看出出错原因,以及模板代码.2. 添加Oracle XML Publi

HTML5时代的纯前端上传图片预览及严格图片格式验证函数(转载)

原文地址:http://www.2cto.com/kf/201401/274752.html 一.要解决什么样的问题? 在写这个函数之前,有们童鞋在群里问如何纯前端严格验证图片格式.这在html5时代之前,那是不可能实现的,必须要上传到后台,由后台脚本读取文本流后进一步验证.这样就造成了一定的服务器资源浪费.但是html5时代,这个工作我们完全可以交给前端来做了. 另一方面,html5时代,许多我们原来的图片预览方案都失效了.究其原因,其实是现代浏览器出于对用户隐私的保护,file控件不再提供真

php 实现html转为rtf格式

前期准备工作 下载Html2Rtf.dll,以管理员的身份运行cmd,进入Html2Rtf.dll所在目录-->输入Regsvr32 Html2Rtf.dll 核心代码: <?php $html2RTFCom = new COM("HTML2RTF.Converter"); $html2RTFCom->PreserveImages = true; $html2RTFCom->PageNumbers = 1; $html2RTFCom->PageNumber

rtf格式 C#设置字间距 CharacterSpacing

richtextbox空间中操作行间距段间距都可以用发送消息解决,但是字间距却鲜有人关注,无法通过PARAFORMAT2消息解决,只能直接操作rtf格式 字间距主要就是要控制 expand expandtw 这些rtf属性 下面给出一个插入代码,只能对简单点的rtf进行操作,word保存出来的rtf不一定可以 操作rtf格式的类库使用RtfTree public void SetCharacterSpacing(int spacing) { spacing--; if (spacing < 0)

如何在CRichEditCtrl控件中直接读如RTF格式的文件(这个是通过流的方式来读取文件)

如何在CRichEditCtrl控件中直接读如RTF格式的文件 Inserting an RTF string using StreamIn -------------------------------------------------------------------------------- When inserting Rich Text Formatted text into the control there are two approaches you can take. In

centos7(linux)挂载ntfs格式的移动硬盘(转载)

为了方便在linux系统上方便的使用NTFS格式的U盘与移动硬盘,故写下留作记录,方便查看. 首先要在linux系统上挂载NTFS格式的移动硬盘,需要安装ntfs-3g软件,下载地址为: http://linux.softpedia.com/get/System/Hardware/ntfs-3g-15028.shtml 接下来进行解压与安装 $ tar -xzvf ntfs-3g**.tar.gz $ cd ntfs-sg** $ ./configure $ make $ make instal

日期格式字符说明【转载】

(:) 时间分隔符.在某些区域设置中,可以使用其他字符表示时间分隔符.时间分隔符在格式化时间值时分隔小时.分钟和秒.格式化输出中用作时间分隔符的实际字符由您的应用程序的当前区域性值确定. (/) 日期分隔符.在某些区域设置中,可以使用其他字符表示日期分隔符.日期分隔符在格式化日期值时分隔日.月和年.格式化输出中用作日期分隔符的实际字符由您的应用程序的当前区域性确定. (%) 用于表明不论尾随什么字母,随后字符都应该以单字母格式读取.也用于表明单字母格式应以用户定义格式读取.有关更多详细信息,请参

c++ 字符串流 sstream(常用于格式转换) 【转载】

使用stringstream对象简化类型转换C++标准库中的<sstream>提供了比ANSI C的<stdio.h>更高级的一些功能,即单纯性.类型安全和可扩展性.在本文中,我将展示怎样使用这些库来实现安全和自动的类型转换. 为什么要学习 如果你已习惯了<stdio.h>风格的转换,也许你首先会问:为什么要花额外的精力来学习基于<sstream>的类型转换呢?也许对下面一个简单的例子的回顾能够说服你.假设你想用sprintf()函数将一个变量从int类型转

c#-RTF文本编辑器

1".RTF"什么? 多信息文本格式 (RTF) 是一种方便于不同的设备.系统查看的文本和图形文档格式. RTF 使用美国国内标准协会 (ANSI). PC-8. Macintosh(mac苹果),或 IBM 的 PC 字符设置控制显示形式和打印形式. 在不同的操作系统下创建的RTF文档能够在多种操作系统和应用程序之间互相传输.查看. 当前,作为 MS-DOS. Microsoft Windows. OS/2. Macintosh苹果系统,应用程序之间处理文档的特殊翻译软件. RTF是