2011-01-25 53 views
12

PreguntaCómo convertir una cadena a RTF en C#?

¿Cómo convierto la cadena "Européen" a la cadena con formato 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); 
} 

Lo que he encontrado hasta ahora

RichTextBox

RichTextBox se puede utilizar para ciertas cosas. Ejemplo:

RichTextBox richTextBox = new RichTextBox(); 
richTextBox.Text = "Européen"; 
string rtfFormattedString = richTextBox.Rtf; 

Pero entonces rtfFormattedString resulta ser todo el documento con formato RTF, no sólo la cadena "Europ \ 'e9en".

Stackoverflow

Google

También encontré muchos otros recursos en la web, pero nada solucionó mi problema.

respuesta

Brad Christie's answer

tuvo que añadir Trim() para eliminar el espacio precedente en result. Aparte de eso, la solución de Brad Christie parece funcionar.

Me ejecutaré con esta solución por ahora, aunque tengo una mala intuición, ya que tenemos que SubString y Trim the RichtextBox para obtener una cadena con formato RTF.

caso de prueba:

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

Lógica como un método de extensión:

public static class StringExtensions 
{ 
    public static string ConvertToRtf(this string value) 
    { 
     RichTextBox richTextBox = new RichTextBox(); 
     richTextBox.Text = value; 
     int offset = richTextBox.Rtf.IndexOf(@"\f0\fs17") + 8; // offset = 118; 
     int len = richTextBox.Rtf.LastIndexOf(@"\par") - offset; 
     string result = richTextBox.Rtf.Substring(offset, len).Trim(); 
     return result; 
    } 
} 
+0

posible duplicado de [caracteres especiales de salida RTF a Unicode] (http: // sta ckoverflow.com/questions/1310694/output-rtf-special-characters-to-unicode) –

+0

@Abe Miessler: He visto esa pregunta y he agregado el enlace a mi pregunta anterior. Sin embargo, no veo muy bien cómo eso resuelve mi problema (probablemente sí, pero no lo entiendo). ¿Podría quizás proporcionar un fragmento de código que haga que el método de prueba anterior pase? – Lernkurve

+0

Revisa mi respuesta nuevamente, he publicado una solución (hacky) para tu pregunta. Mi esperanza es que solo traduzcas algunas cosas menores/más simples. –

Respuesta

6

no siempre RichTextBox tiene el mismo encabezado/pie de página? Podrías leer el contenido según la ubicación establecida y continuar utilizándolo para analizar. (Creo que por favor corrígeme si estoy equivocado)

Hay bibliotecas disponibles, pero nunca he tenido buena suerte con ellas personalmente (aunque siempre encontré otro método antes de agotar completamente las posibilidades). Además, la mayoría de los mejores suelen incluir una tarifa nominal.


EDITAR
especie de corte, pero esto debe conseguir a través de lo que necesita para obtener a través de (espero):

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

EDIT 2

El breakdown of the codes RTF control code son los siguientes:

  • Cabecera
    • \f0 - Utilice la fuente 0-índice (primera fuente de la lista, que es típicamente Microsoft Sans Serif (se señala en la tabla de caracteres en el encabezado: {\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;}}))
    • \fs17 - Fuente formato, especifique el tamaño es 17 (17 estar en medias puntos)
  • pie de página
    • \par es especificando t que es el final de un párrafo.

Esperemos que borra algunas cosas. ;-)

+0

Su método fallará si la longitud del encabezado alguna vez cambia. Mi método fallará si el encabezado alguna vez incluye la cadena, "!! @@ !!" (pero no fallará si la cadena de entrada contiene "!! @@ !!"). – Brian

+0

@Brian: mis encabezados cambian. la diferencia entre sacar "Apple" y "Européen" hace que el encabezado cambie. –

+0

@Brad Christie: Quiero decir si "\ fo \ fs17" alguna vez cambia. Admito que esto es poco probable. Supongo que simplemente tengo una aversión a depender de los detalles de implementación. – Brian

1

A continuación se muestra un ejemplo feo de convertir una cadena a una cadena 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("[email protected]@!!{0}[email protected]@!!", foo); 
     generalRTF.Text = bar; 
     int pos1 = generalRTF.Rtf.IndexOf("[email protected]@!!"); 
     int pos2 = generalRTF.Rtf.LastIndexOf("[email protected]@!!"); 
     if (pos1 != -1 && pos2 != -1 && pos2 > pos1 + "[email protected]@!!".Length) 
     { 
      pos1 += "[email protected]@!!".Length; 
      return generalRTF.Rtf.Substring(pos1, pos2 - pos1); 
     } 
     throw new Exception("Not sure how this happened..."); 
    } 
} 
+0

Gracias por tomarse el tiempo para publicar el código. Tendré que echarle un vistazo. Las exclamaciones parecen aterradoras ... – Lernkurve

+2

@Lernkurve: The "!! @@ !!" es un delimitador arbitrario y realmente pertenece a 'const String'. – Brian

+0

Gracias por la explicación. Debería haberlo visto yo mismo. :-) – Lernkurve

-1

No es el más elegante, pero bastante óptimo y rápido método:

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

.

caracteres Codificar método (los polacos):

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

Con su solución, ¿cómo sabe que ha cubierto todos los caracteres especiales posibles? Si un personaje no está en la lista de reemplazo de los personajes de códigos, entonces saldrá mal, ¿no? – Lernkurve

3

Ésta es la forma en que fui:

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

Creo que el uso de un RichTextBox es:
1) exageración
2) Pongo Me gusta RichTextBox después de pasar días tratando de hacerlo funcionar con un documento RTF creado en Word.

1

Sé que ha pasado un tiempo, espero que esto ayude ..

Este código está trabajando para mí después de haber probado todos los códigos de conversión que podría poner en mis manos:

TitleText y contentText son texto simple llena en un cuadro de texto normal

var rtb = new RichTextBox(); 
rtb.AppendText(titleText) 
rtb.AppendText(Environment.NewLine); 
rtb.AppendText(contentText) 

rtb.Refresh(); 

rtb.rtf ahora tiene el texto RTF.

El siguiente código guardar el texto RTF y permitirá abrir el archivo, editarlo y que cargarlo de nuevo en un RichTextBox de nuevo:

rtb.SaveFile(path, RichTextBoxStreamType.RichText); 
Cuestiones relacionadas