5

我有一堆要转换为 rtf 的文本文件。仅更改代码中的扩展名是行不通的,底层文件是相同的。我需要文本为 rtf 格式。有谁知道我该怎么做?

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

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

4

5 回答 5

16

只需将文本添加到空的 RTF 模板中,纯文本无论如何都没有任何格式,所以假设 rtf 模板看起来像这样(来自维基百科示例):

{\rtf1\ansi{\fonttbl\f0\fswiss Helvetica;}\f0\pard _TEXT_CONTENT_HERE_ }

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

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;
}
于 2012-05-23T18:10:04.917 回答
3

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

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");
}
于 2013-01-31T09:10:37.973 回答
0

这是完整的工作功能:

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

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();
}
于 2020-05-14T13:01:37.380 回答
0

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

于 2019-07-27T15:21:41.617 回答
0

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% 的扩展缓冲区,因此随着字符串构建器的增长,我们不会有多个数组副本。(如果我们的 gess 很低,它仍然可以工作,但代价是一个数组副本(很可能。)
  • 写出标题
  • 循环遍历字符串并一次执行所有转义。
  • 如果您想重新添加波兰语转换,那么在 switch 语句中只会有更多的情况,而不是更多的字符串副本。
  • 写出大括号。
  • 将字符串生成器转储为字符串。
于 2019-03-17T07:13:06.367 回答