Rtf(富文本格式)解析

参考了微软《RTF1.7规范》和一些网站的帖子,简单总结一下:

Rtf规范最早是微软编写的关于多媒体存储的一种文档存储格式,后来微软把它开放出来,这样就使得不同的应用程序、操作系统、显示设备之间可以根据Rtf规范进行实现,最终使得同一个Rtf格式的文档在不同的环境有相同的显示效果。

1、RTF文件:使用7-bit ASCII字符格式存储,文件没有限制一行的最大长度。

RTF文件 = 组 + 控制字 + 控制符 + 文档内容

2、控制字:管理文档信息、文档显示格式的命令,一个控制字最长32个字符。

控制字 = \ + 字母序列 + 分隔符

例如:"\fc "代表字体颜色

字母序列 = a~z小写字母中的一个或者多个字符

例如:"\fc "代表字体颜色

分隔符 = 空格 或者 数字 或者 空格和数字 (数字作为控制字的参数)

例如:"\b "代表加粗,"\b0 "代表不加粗

注意:任何非字母和数字的其他字符。这种情况下,此分隔字符结束控制字,而它并不属于控制字的一部分。如果一个空格用于分隔控制字,该空格不会在文档中出现。而任何跟随该分隔符的字符,包括空格,将在文档中出现。因此,你应该只在必要时使用空格,避免仅仅为了分割RTF代码而使用空格。

3、控制符:控制符不需要分隔符

控制符 = \ + 非字母数字字符

例如 “\~”代表不换行空格。

4、组

组 = { 控制字 + 控制符 + 文档内容 }

例如"{\b 这个代表加粗}"会将"这个代表加粗"内容进行加粗

注意:一个组的格式描述只影响组内的文本。通常,一个组中的文本继承前一组的文本格式。但微软的RTF约定,对于脚注、注解、头和尾的组(本章稍后描述)不继承前一组的文本格式。因此, 请确定这些组总能正确格式化,正确做法是用\sectd, \pard\plain控制字将组中的格式设为默认值,然后再增加任何需要的格式。

\sectd : 重新设置为默认的节属性

\pard:重置为默认段落属性

\plain: 重新设定字型(字符)格式化属性为应用程序定义的默认值(例如,粗体、下划线、斜体被禁止;字体大小被重新设定为12磅point)。关联字体(字符)格式化属性也被重新设定。

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android自带的TextView是不支持rtf格式富文本显示的,但是我们可以使用第三方库来实现将富文本存储为rtf格式。 其中一个比较好用的库是javadocx,它能够将富文本转换成rtf文档、docx文档以及pdf文档等格式。javadocx的使用方法如下: 1.添加依赖 在build.gradle文件中添加以下依赖: ``` implementation 'com.documents4j:documents4j-api:1.0.3' implementation 'com.documents4j:documents4j-transformer-msoffice-word:1.0.3' implementation 'fr.opensagres.xdocreport:fr.opensagres.xdocreport.document.docx:1.0.5' implementation 'fr.opensagres.xdocreport:fr.opensagres.xdocreport.converter:1.0.5' ``` 2.将富文本转换为rtf ```java String htmlText = "<p>这是一段<b>加粗</b>的文本。</p>"; // 将html文本转换为rtf IConverter converter = ConverterRegistry.getRegistry().getConverter("html", "rtf"); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); converter.convert(new ByteArrayInputStream(htmlText.getBytes()), outputStream, null); byte[] rtfBytes = outputStream.toByteArray(); // 将rtf保存到文件中 File file = new File(context.getFilesDir(), "rich_text.rtf"); FileOutputStream fos = new FileOutputStream(file); fos.write(rtfBytes); fos.close(); ``` 3.将rtf转换为富文本 ```java // 从文件中读取rtf File file = new File(context.getFilesDir(), "rich_text.rtf"); FileInputStream fis = new FileInputStream(file); byte[] buffer = new byte[fis.available()]; fis.read(buffer); fis.close(); // 将rtf转换为html IConverter converter = ConverterRegistry.getRegistry().getConverter("rtf", "html"); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); converter.convert(new ByteArrayInputStream(buffer), outputStream, null); String htmlText = outputStream.toString(); // 将html显示到TextView中 textView.setText(Html.fromHtml(htmlText)); ``` 值得注意的是,javadocx库是一个较为庞大的库,如果只是为了将富文本存储为rtf格式,可能会显得过于臃肿。如果只是想将富文本显示在TextView中,直接使用TextView的setText()方法即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值