C#读取RTF文件内容 C#如何提取.rtf富文本格式中的纯文本

5次阅读

rtf文件不能用file.readalltext直接读取纯文本,因其含控制字和编码问题;应使用richtextbox(winforms)或rtfpipe库(跨平台)解析,且需注意rtf声明的字符集编码。

C#读取RTF文件内容 C#如何提取.rtf富文本格式中的纯文本

RTF文件不能直接用File.ReadAllText读取纯文本

RTF不是纯文本格式,哪怕文件后缀是.rtf,里面也混着大量控制字(比如{b bold}{fs24}),直接用File.ReadAllText会得到一乱码+格式指令,根本没法用。

常见错误现象:读出来全是{rtf1ansiansicpg936deff0...这种开头,或者中文显示成问号、方块——这是编码没解对,更本质的是你压根没解析RTF结构。

  • 必须走系统级RTF解析路径,.NET本身不提供轻量RTF转文本API
  • RichTextBoxwindows Forms里最稳定、兼容性最好的方案(支持老版本RTF 1.0到1.9)
  • 别指望RichTextBox.LoadFile自动帮你“提取文本”,它只是加载;真正要文本得读RichTextBox.Text属性

RichTextBox加载并提取纯文本(WinForms环境)

这是最省心、出错率最低的做法,尤其适合桌面工具或内部小工具。核心逻辑就三步:新建控件 → 加载RTF → 读.Text

注意:这个控件不需要显示在界面上,可以全程隐藏运行。

  • 必须引用System.Windows.Forms,即使你在控制台项目里也要加(NuGet包System.Windows.Forms,.NET 5+需启用Windows兼容模式)
  • 加载前记得设RichTextBox.Rtf而不是.Text,否则会把RTF内容当纯文本渲染,导致格式崩坏
  • 如果RTF含图片或OLE对象.Text会自动跳过它们,只留文字——这反而是优点
RichTextBox rtb = new(); rtb.Rtf = File.ReadAllText(@"C:doc.rtf"); // 注意:这里必须用Rtf属性赋值 string plainText = rtb.Text; // 这才是你要的纯文本

非WinForms环境(如.NET Core控制台/ASP.NET)怎么处理

没有RichTextBox?那就得自己解析RTF。但别手写——RTF语法嵌套深、转义多、历史变体杂,自己啃标准文档基本是自找麻烦。

推荐用开源库RtfPipe(MIT协议,NuGet可装),它不依赖Windows Forms,纯C#实现,专注“RTF → 文本”这一件事。

  • 安装:dotnet add package RtfPipe
  • 它不支持所有RTF扩展(比如某些word专有字段),但日常办公RTF 99%能应付
  • 遇到加密RTF或损坏文件会抛RtfParseException,建议try/catch兜底
  • 性能比RichTextBox略慢(毕竟纯托管解析),但差异在毫秒级,一般无感
using RtfPipe;  string rtfContent = File.ReadAllText(@"C:doc.rtf"); string plainText = Rtf.ToText(rtfContent);

编码问题和特殊字符容易被忽略

RTF本身声明字符集(比如ansicpg1252utf8),但File.ReadAllText默认用UTF-8读,可能错解非ASCII部分——尤其是中文RTF常带ansicpg936(GBK)。

这不是“提取逻辑”问题,是“读入第一步”就错了。

  • 先用File.ReadAllBytes读原始字节,再按RTF头里的ansicpg值选编码(查表映射:936→GBK,1252→Windows-1252)
  • 或者偷懒点:统一用Encoding.default(即系统当前ANSI编码),对中文Windows通常就是GBK,兼容性反而好
  • RtfPipe内部已处理编码探测,所以推荐优先用它;自己用RichTextBox时,务必确认File.ReadAllText传了正确Encoding

最稳妥的一行写法:File.ReadAllText(path, Encoding.GetEncoding(936)) —— 如果你知道源RTF是中文版Word生成的。

text=ZqhQzanResources