将txt转换为rtf

问题描述 投票:5回答:3

我有一堆文本文件要转换为rtf。只是更改代码中的扩展名不起作用,底层文件是相同的。我需要文本是rtf格式。谁知道我怎么做到这一点?

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

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

c# wpf rtf
3个回答
16
投票

只需将文本添加到空RTF模板中,纯文本无论如何都没有任何格式化,所以让我们说rtf模板看起来像这样(来自wikipedia示例):

{\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;
}

3
投票

安东尼奥的改进方法(注意我定义了一个代码页\ 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");
}

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语句中只会出现更多情况,而不是更多的字符串副本。
  • 写出尾随支架。
  • 将字符串生成器转储为字符串。

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.