Как преобразовать строку в RTF в C#?
вопрос
как преобразовать строку " Européen "в строку в формате RTF"Europ'e9en"?
[TestMethod]
public void Convert_A_Word_To_Rtf()
{
// Arrange
string word = "Européen";
string expected = "Europ'e9en";
string actual = string.Empty;
// Act
// actual = ... // How?
// Assert
Assert.AreEqual(expected, actual);
}
то, что я нашел до сих пор
RichTextBox
RichTextBox может использоваться для определенных вещей. Пример:
RichTextBox richTextBox = new RichTextBox();
richTextBox.Text = "Européen";
string rtfFormattedString = richTextBox.Rtf;
но тогда rtfFormattedString оказывается весь RTF-форматированный документ, а не только строка "Европ'e9en".
Stackoverflow
- вставить строку со специальными символами в RTF
- как вывести строку unicode в RTF (используя C#)
- вывод RTF специальных символов в Unicode
- преобразование специальных символов для RTF (iPhone)
Я также нашел кучу других ресурсов в интернете, но ничего не решило мою проблему.
ответ
пришлось добавить Trim()
чтобы удалить предшествующее пространство в result
. Кроме этого, решение Брэда Кристи, похоже, работает.
Я буду работать с этим решением сейчас, хотя у меня плохое предчувствие, так как мы должны подстроки и обрезать черт из RichTextBox, чтобы получить RTF-формат строка.
тест:
[TestMethod]
public void Test_To_Verify_Brad_Christies_Stackoverflow_Answer()
{
Assert.AreEqual(@"Europ'e9en", "Européen".ConvertToRtf());
Assert.AreEqual(@"d'e9finitif", "définitif".ConvertToRtf());
Assert.AreEqual(@"'e0", "à".ConvertToRtf());
Assert.AreEqual(@"H'e4user", "Häuser".ConvertToRtf());
Assert.AreEqual(@"T'fcren", "Türen".ConvertToRtf());
Assert.AreEqual(@"B'f6den", "Böden".ConvertToRtf());
}
логика как метод расширения:
public static class StringExtensions
{
public static string ConvertToRtf(this string value)
{
RichTextBox richTextBox = new RichTextBox();
richTextBox.Text = value;
int offset = richTextBox.Rtf.IndexOf(@"f0fs17") + 8; // offset = 118;
int len = richTextBox.Rtf.LastIndexOf(@"par") - offset;
string result = richTextBox.Rtf.Substring(offset, len).Trim();
return result;
}
}
6 ответов
не RichTextBox
всегда имеют одинаковые колонтитулы? Вы можете просто прочитать содержимое на основе заданного местоположения и продолжить использовать его для анализа. (Я думаю? пожалуйста, поправьте меня, если я ошибаюсь)
есть доступные библиотеки, но мне никогда не везло с ними лично (хотя всегда просто находил другой метод, прежде чем полностью исчерпать возможности). Кроме того, большинство из лучших, как правило, включают номинальный плата.
редактировать
Вид взлома, но это должно помочь вам пройти через то, что вам нужно пройти (я надеюсь):
RichTextBox rich = new RichTextBox();
Console.Write(rich.Rtf);
String[] words = { "Européen", "Apple", "Carrot", "Touché", "Résumé", "A Européen eating an apple while writing his Résumé, Touché!" };
foreach (String word in words)
{
rich.Text = word;
Int32 offset = rich.Rtf.IndexOf(@"\f0\fs17") + 8;
Int32 len = rich.Rtf.LastIndexOf(@"\par") - offset;
Console.WriteLine("{0,-15} : {1}", word, rich.Rtf.Substring(offset, len).Trim());
}
правка 2
на разбивка кодов RTF контрольный код следующим образом:
-
\f0
- используйте шрифт 0-index (первый шрифт в списке, который обычно является Microsoft без засечек (отмечено в шрифте таблица в заголовке:{\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;}}
)) -
\fs17
- форматирование шрифта, укажите размер 17 (17 в полутонах) - подвал
-
\par
указывает, что это конец абзаца.
-
надеюсь, это прояснит некоторые вещи. ;-)
вот как я пошел:
private string ConvertString2RTF(string input)
{
//first take care of special RTF chars
StringBuilder backslashed = new StringBuilder(input);
backslashed.Replace(@"\", @"\");
backslashed.Replace(@"{", @"\{");
backslashed.Replace(@"}", @"\}");
//then convert the string char by char
StringBuilder sb = new StringBuilder();
foreach (char character in backslashed.ToString())
{
if (character <= 0x7f)
sb.Append(character);
else
sb.Append("\u" + Convert.ToUInt32(character) + "?");
}
return sb.ToString();
}
Я думаю, используя RichTextBox
- это:
1) перебор
2) мне не нравится RichTextBox
после нескольких дней попыток заставить его работать с RTF-документом, созданным в Word.
Ниже приведен уродливый пример преобразования строки в строку RTF:
class Program
{
static RichTextBox generalRTF = new RichTextBox();
static void Main()
{
string foo = @"Européen";
string output = ToRtf(foo);
Trace.WriteLine(output);
}
private static string ToRtf(string foo)
{
string bar = string.Format("!!@@!!{0}!!@@!!", foo);
generalRTF.Text = bar;
int pos1 = generalRTF.Rtf.IndexOf("!!@@!!");
int pos2 = generalRTF.Rtf.LastIndexOf("!!@@!!");
if (pos1 != -1 && pos2 != -1 && pos2 > pos1 + "!!@@!!".Length)
{
pos1 += "!!@@!!".Length;
return generalRTF.Rtf.Substring(pos1, pos2 - pos1);
}
throw new Exception("Not sure how this happened...");
}
}
Я знаю, что прошло некоторое время, надеюсь, это поможет..
этот код работает для меня после попытки каждого кода преобразования, на который я мог бы наложить руки:
titleText и contentText-это простой текст, заполненный обычным текстовым полем
var rtb = new RichTextBox();
rtb.AppendText(titleText)
rtb.AppendText(Environment.NewLine);
rtb.AppendText(contentText)
rtb.Refresh();
rtb.rtf теперь содержит текст rtf.
следующий код сохранит текст rtf и позволит вам открыть файл, отредактировать его и снова загрузить в RichTextBox:
rtb.SaveFile(path, RichTextBoxStreamType.RichText);
Я нашел хорошее решение, которое фактически использует сам RichTextBox для преобразования:
private static string FormatAsRTF(string DirtyText)
{
System.Windows.Forms.RichTextBox rtf = new System.Windows.Forms.RichTextBox();
rtf.Text = DirtyText;
return rtf.Rtf;
}
http://www.baltimoreconsulting.com/blog/development/easily-convert-a-string-to-rtf-in-net/
не самый элегантный, но вполне оптимальный и быстрый метод:
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");
}