将txt转换为rtf

时间:2012-05-23 18:03:34

标签: c# wpf rtf

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

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

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

5 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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");
}

答案 2 :(得分:0)

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

<a class="text-dark" href="">become a driver</a>
<a class="text-dark" href="">driver</a>

设计很简单。

  • 从StringBuilder开始,并猜测最终的字符串将包含标题,原始文本和10%的扩展缓冲区,因此随着字符串构建器的增长,我们将不会获得多个数组副本。 (如果我们的ges很低,它仍然可以工作,但需要一个阵列副本(可能)。
  • 写出标题
  • 在字符串中循环浏览,一次完成所有转义。
  • 如果您想重新添加波兰语转换,那么switch语句中的情况将更多,而字符串副本将更多。
  • 写出大括号。
  • 将字符串生成器转储为字符串。

答案 3 :(得分:0)

我找到了一种可行的方法。使用TextEdit打开纯文本文件(.txt)。点击左上方菜单栏中的格式下拉菜单。应该有一个名为“制作富文本”的按钮。当您单击它时,它应将所有文本格式设置为丰富。切换按钮使其变为纯文本。还将文件类型更改为.rtf。除非您使用Windows,否则它应该可以在最新的操作系统上使用。

答案 4 :(得分: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();
}