在C#开发中,处理RTF富文本文件时,提取其中的纯文本内容是常见需求,RTF格式包含大量格式控制标记,直接读取文件会得到包含这些标记的乱码内容,需要通过特定方式剥离格式信息。

方法一:使用RichTextBox控件提取
Windows Forms自带的RichTextBox控件内置了RTF解析能力,可以很方便地获取纯文本内容,适合Windows桌面应用开发场景。
实现步骤
- 创建
RichTextBox实例 - 将RTF内容加载到控件中
- 读取控件的
Text属性即可得到纯文本
代码示例
using System;
using System.Windows.Forms;
namespace RtfExtractDemo
{
public class RtfExtractor
{
// 从RTF字符串中提取纯文本
public static string ExtractPlainTextFromRtfString(string rtfContent)
{
using (RichTextBox rtb = new RichTextBox())
{
// 加载RTF内容
rtb.Rtf = rtfContent;
// 返回纯文本
return rtb.Text;
}
}
// 从RTF文件中提取纯文本
public static string ExtractPlainTextFromRtfFile(string filePath)
{
using (RichTextBox rtb = new RichTextBox())
{
// 加载RTF文件
rtb.LoadFile(filePath);
// 返回纯文本
return rtb.Text;
}
}
}
}
注意事项
这种方法依赖Windows的RichTextBox组件,在非Windows环境或者ASP.NET等服务端场景下无法使用,同时如果RTF内容包含特殊格式,可能会出现解析偏差。
方法二:手动解析RTF标记提取
如果需要在跨平台场景或者服务端使用,可以手动解析RTF的格式标记,剥离所有以反斜杠开头的控制字符和分组标记,只保留可见文字内容。
实现逻辑
RTF的核心格式标记都以开头,比如b表示加粗,par表示换行,我们只需要过滤掉所有开头的标记,以及{、}分组符号,就可以得到纯文本。
代码示例
using System;
using System.Text;
namespace RtfExtractDemo
{
public class ManualRtfExtractor
{
public static string ExtractPlainText(string rtfContent)
{
if (string.IsNullOrEmpty(rtfContent))
{
return string.Empty;
}
StringBuilder result = new StringBuilder();
int index = 0;
int length = rtfContent.Length;
while (index < length)
{
char currentChar = rtfContent[index];
// 处理转义字符,比如\表示反斜杠本身
if (currentChar == '\')
{
// 跳过反斜杠,处理后续的控制字符或者转义内容
index++;
if (index >= length)
{
break;
}
char nextChar = rtfContent[index];
// 如果是转义的特殊字符,比如{、}、\,直接跳过
if (nextChar == '{' || nextChar == '}' || nextChar == '\')
{
index++;
continue;
}
// 跳过整个控制词,直到遇到空格、非字母或者结束
while (index < length && ((rtfContent[index] >= 'a' && rtfContent[index] <= 'z') || (rtfContent[index] >= 'A' && rtfContent[index] <= 'Z')))
{
index++;
}
// 跳过控制词后的空格
if (index < length && rtfContent[index] == ' ')
{
index++;
}
}
// 跳过分组符号
else if (currentChar == '{' || currentChar == '}')
{
index++;
}
// 普通可见字符,添加到结果
else
{
result.Append(currentChar);
index++;
}
}
return result.ToString().Trim();
}
}
}
注意事项
这种手动解析的方式适配性更强,但是无法处理所有复杂的RTF格式,比如嵌套的格式标记、特殊编码的字符等,适合处理格式简单的RTF文件。
两种方法的对比
| 对比项 | RichTextBox方法 | 手动解析方法 |
|---|---|---|
| 适用场景 | Windows桌面应用 | 跨平台、服务端场景 |
| 解析准确性 | 高,依赖系统原生解析 | 一般,仅适配简单格式 |
| 依赖项 | 依赖Windows Forms组件 | 无额外依赖 |
| 性能 | 较低,需要创建控件实例 | 较高,纯字符串处理 |
总结
如果是Windows桌面应用开发,优先选择RichTextBox的方式,实现简单且解析准确;如果是跨平台或者服务端场景,且RTF格式比较简单,可以选择手动解析的方式。开发者可以根据实际的业务场景选择合适的实现方案,满足C#提取RTF纯文本的需求。