Вопрос по wpf, c# – преобразование TXT в RTF

5

У меня есть куча текстовых файлов, которые я хочу преобразовать в RTF. Простое изменение расширения в коде не работает, основной файл такой же. Мне нужно, чтобы текст был в формате RTF. Кто-нибудь знает, как я могу это сделать?

Проблема заключается в том, что когда я загружаю простой текстовый файл, RichTextBox не форматирует новые строки, поэтому он загружает его как один непрерывный блок текста, а не вставляет новые строки.

Единственное решение состояло в том, чтобы открыть файл в виде простого текста и & quot; Сохранить как & quot; RTF.

Я обновлю свой ответ Antonio Bakula
Загрузите в richtextbox и затем сохраните как RTF L.B
The issue is when I load up a plain text file the RichTextBox isn't formatting the new lines Вы можете попробовать заменить\r с\r\n (или же\n с\r\n) перед загрузкой в richtextbox L.B

Ваш Ответ

3   ответа
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();
}

Дизайн прост.

  • Begin with a StringBuilder and guess the final string will include the header, the original text, and a 10% buffer for expansion so we do not have multple array copies as the string builder grows. (If our gess is low, it still will work, at the cost of one array copy (likely.)
  • Write out the headder
  • Loop through the string and perform all the escaping in a single pass.
  • If you wanted to add back the polish conversion, it would just be more cases in the switch statement, not more string copies.
  • write out the trailing brace.
  • dump the string builder to a string.
16

Просто добавьте текст в пустой шаблон RTF, обычный текст в любом случае не будет иметь никакого форматирования, поэтому давайте скажем, что шаблон rtf выглядит следующим образом (из примера википедии):

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

Update: Я забыл о новых линиях, брекетах и обратных косых чертах :)

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;
}
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы