C# 将txt转换为rtf

C# 将txt转换为rtf,c#,wpf,rtf,C#,Wpf,Rtf,我有一堆文本文件要转换成rtf。仅仅在代码中更改扩展名是不起作用的,底层文件是相同的。我需要在rtf格式的文本。有人知道我怎么做吗 问题是,当我加载纯文本文件时,RichTextBox不会格式化新行,因此它会将其作为一个连续的文本块加载,而不是插入新行 唯一的解决方案是打开纯文本文件并“另存为”rtf 只需将文本添加到空RTF模板中,纯文本没有任何格式设置,因此假设RTF模板如下所示(来自wikipedia示例): 更新:我忘记了新行、大括号和反斜杠:) Antonio改进的方法(注意,我定义了

我有一堆文本文件要转换成rtf。仅仅在代码中更改扩展名是不起作用的,底层文件是相同的。我需要在rtf格式的文本。有人知道我怎么做吗

问题是,当我加载纯文本文件时,RichTextBox不会格式化新行,因此它会将其作为一个连续的文本块加载,而不是插入新行


唯一的解决方案是打开纯文本文件并“另存为”rtf

只需将文本添加到空RTF模板中,纯文本没有任何格式设置,因此假设RTF模板如下所示(来自wikipedia示例):

更新:我忘记了新行、大括号和反斜杠:)

Antonio改进的方法(注意,我定义了一个代码页\ansicpg1250):

编码字符(波兰语字符)方法:


Zbignew Wiadro答案的一个版本(减去波兰语字符),它试图避免多个字符串分配

 public static string Convert(string s)
{
  var ret = new StringBuilder((int) (71 + (s.Length * 1.1)));
  ret.Append(@"{\rtf1\ansi\ansicpg1250\deff0{\fonttbl\f0\fswiss Helvetica;}\f0\pard ");
  foreach (var letter in s)
  {
    switch (letter)
    {
      case '\\':
      case '{':
      case '}':
        ret.Append('\\');
        break;
      case '\r':
        ret.Append("\\par");
        break;
    }
    ret.Append(letter);
  }
  ret.Append(" }");
  return ret.ToString();
}
设计简单

  • 从StringBuilder开始,猜测最后一个字符串将包括标题、原始文本和10%的扩展缓冲区,这样随着字符串生成器的增长,我们就不会有多个数组副本。(如果我们的GES很低,它仍然可以工作,但代价是一个阵列拷贝(可能)
  • 写下标题
  • 循环遍历字符串并在一次传递中执行所有转义
  • 如果您想添加回波兰语转换,那么在switch语句中只需要更多的情况,而不是更多的字符串副本
  • 写出后面的大括号
  • 将字符串生成器转储为字符串

我找到了一个应该有效的方法。打开纯文本文件(.txt)使用文本编辑。单击左上菜单栏中的“格式”下拉列表。应该有一个名为“生成富文本”的按钮。当您单击该按钮时,它应该将您的所有文本格式化为富文本。切换该按钮使其成为纯文本。它还将文件类型更改为.rtf。除非您有Windows,否则这应该适用于最新的操作系统。

这里是完全可行的打捆功能:

它涵盖所有特殊字符(不仅仅是波兰字符……)

公共静态字符串转换器(字符串文本)
{
//使用wiki中的默认模板
StringBuilder sb=new StringBuilder(@“{\rtf1\ansi\ansicpg1250\deff0{\fonttbl\f0\fswiss Helvetica;}\f0\pard”);
foreach(文本中的字符)
{

如果(字符加载到richtextbox,然后另存为rtf
,问题是当我加载纯文本文件时,richtextbox没有格式化新行
,您可以尝试将
\r
替换为
\r\n
(或
\r\n
替换为
\r\n
),然后再加载到richtextbox,您还需要退出大括号和反斜杠。
public static string PlainTextToRtf(string plainText)
{
  string escapedPlainText = plainText.Replace(@"\", @"\\").Replace("{", @"\{").Replace("}", @"\}");
  string rtf = @"{\rtf1\ansi{\fonttbl\f0\fswiss Helvetica;}\f0\pard ";
  rtf += escapedPlainText.Replace(Environment.NewLine, @" \par ");
  rtf += " }";
  return rtf;
}
public static string PlainTextToRtf(string plainText)
{
    if (string.IsNullOrEmpty(plainText))
        return "";

    string escapedPlainText = plainText.Replace(@"\", @"\\").Replace("{", @"\{").Replace("}", @"\}");
    escapedPlainText = EncodeCharacters(escapedPlainText);

    string rtf = @"{\rtf1\ansi\ansicpg1250\deff0{\fonttbl\f0\fswiss Helvetica;}\f0\pard ";
    rtf += escapedPlainText.Replace(Environment.NewLine, "\\par\r\n ") + ;
    rtf += " }";
    return rtf;
}
private static string EncodeCharacters(string text)
{
    if (string.IsNullOrEmpty(text))
        return "";

    return text
        .Replace("ą", @"\'b9")
        .Replace("ć", @"\'e6")
        .Replace("ę", @"\'ea")
        .Replace("ł", @"\'b3")
        .Replace("ń", @"\'f1")
        .Replace("ó", @"\'f3")
        .Replace("ś", @"\'9c")
        .Replace("ź", @"\'9f")
        .Replace("ż", @"\'bf")
        .Replace("Ą", @"\'a5")
        .Replace("Ć", @"\'c6")
        .Replace("Ę", @"\'ca")
        .Replace("Ł", @"\'a3")
        .Replace("Ń", @"\'d1")
        .Replace("Ó", @"\'d3")
        .Replace("Ś", @"\'8c")
        .Replace("Ź", @"\'8f")
        .Replace("Ż", @"\'af");
}
 public static string Convert(string s)
{
  var ret = new StringBuilder((int) (71 + (s.Length * 1.1)));
  ret.Append(@"{\rtf1\ansi\ansicpg1250\deff0{\fonttbl\f0\fswiss Helvetica;}\f0\pard ");
  foreach (var letter in s)
  {
    switch (letter)
    {
      case '\\':
      case '{':
      case '}':
        ret.Append('\\');
        break;
      case '\r':
        ret.Append("\\par");
        break;
    }
    ret.Append(letter);
  }
  ret.Append(" }");
  return ret.ToString();
}
public static string ConvertToRtf(string text)
{
    // using default template from wiki
    StringBuilder sb = new StringBuilder(@"{\rtf1\ansi\ansicpg1250\deff0{\fonttbl\f0\fswiss Helvetica;}\f0\pard ");
    foreach (char character in text)
    {
        if (character <= 0x7f)
        {
            // escaping rtf characters
            switch (character)
            {
                case '\\':
                case '{':
                case '}':
                    sb.Append('\\');
                    break;
                case '\r':
                    sb.Append("\\par");
                    break;
            }

            sb.Append(character);
        }
        // converting special characters
        else
        {
            sb.Append("\\u" + Convert.ToUInt32(character) + "?");
        }
    }
    sb.Append("}");
    return sb.ToString();
}