不依赖System.Windows.Forms的.NET Standard RTF转纯文本实现方案
无Windows Forms依赖的RTF转纯文本实现方案
微软官方目前没有推出可跨平台用于.NET Standard的System.Text.Rtf类库,以下是两种可行的落地方式:
方案1:使用第三方跨平台类库(推荐)
推荐使用兼容.NET Standard的开源RTF处理库RtfPipe,可直接通过NuGet安装,调用逻辑非常简单:
private static string RtfToPlainText(string rtf) { return RtfPipe.Rtf.ToText(rtf); }
该库无需依赖任何Windows专属组件,对RTF格式的兼容度也比较高,满足绝大多数常规场景的转换需求。
方案2:轻量自定义实现(无第三方依赖)
如果你的场景中RTF格式相对简单,不想引入额外依赖,可以自己实现基础的RTF标记剔除逻辑,示例代码如下:
using System.Text; private static string RtfToPlainText(string rtf) { if (string.IsNullOrEmpty(rtf)) return string.Empty; var plainText = new StringBuilder(); bool inGroup = false; bool inCommand = false; for (int i = 0; i < rtf.Length; i++) { char c = rtf[i]; switch (c) { case '{': inGroup = true; inCommand = false; break; case '}': inGroup = false; inCommand = false; break; case '\\': if (inGroup) { inCommand = true; // 处理Unicode转义特殊逻辑 if (i + 1 < rtf.Length && rtf[i + 1] == 'u') { i += 2; int numStart = i; while (char.IsDigit(rtf[i])) i++; if (int.TryParse(rtf.AsSpan(numStart, i - numStart), out int unicodeVal)) { plainText.Append((char)unicodeVal); } if (rtf[i] == '?') i++; inCommand = false; } } break; case ' ': if (inCommand) { inCommand = false; break; } goto default; default: if (!inGroup || inCommand) continue; plainText.Append(c); break; } } return plainText.ToString().Trim(); }
注意:该自定义实现仅支持常规简单RTF格式转换,复杂格式(如嵌套表格、特殊样式、嵌入对象等)可能存在转换误差,建议仅在可控场景下使用。
内容的提问来源于stack exchange,提问作者Thorberg
相关产品推荐
相关产品推荐

