将 TXT 转换为 RTF

本文关键字:RTF 转换 TXT | 更新日期: 2023-09-27 18:35:19

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

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

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

将 TXT 转换为 RTF

只需将文本添加到空的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;
}

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");
}

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 语句中增加更多大小写,而不是更多的字符串副本。
  • 写出尾随大括号。
  • 将字符串生成器转储到字符串。

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

这是完全工作的功能:

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

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();
}