Pergunta
Gostaria de pegar algumas entradas RTF e limpá-las para remover toda a formatação RTF, exceto \ul \b \i para colá-las no Word com informações de formato secundárias.
O comando usado para colar no Word será algo como:oWord.ActiveDocument.ActiveWindow.Selection.PasteAndFormat(0) (com algum texto RTF já na área de transferência)
{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset0 Courier New;}}
{\colortbl ;\red255\green255\blue140;}
\viewkind4\uc1\pard\highlight1\lang3084\f0\fs18 The company is a global leader in responsible tourism and was \ul the first major hotel chain in North America\ulnone to embrace environmental stewardship within its daily operations\highlight0\par
Você tem alguma ideia de como posso limpar o RTF com segurança com algumas expressões regulares ou algo assim?Estou usando o VB.NET para fazer o processamento, mas qualquer exemplo de linguagem .NET serve.
Solução
Eu usaria um RichTextBox oculto, definiria o membro Rtf e, em seguida, recuperaria o membro Text para limpar o RTF de uma forma bem suportada.Então eu usaria a injeção manual da formatação desejada posteriormente.
Outras dicas
Eu faria algo como o seguinte:
Dim unformatedtext As String
someRTFtext = Replace(someRTFtext, "\ul", "[ul]")
someRTFtext = Replace(someRTFtext, "\b", "[b]")
someRTFtext = Replace(someRTFtext, "\i", "[i]")
Dim RTFConvert As RichTextBox = New RichTextBox
RTFConvert.Rtf = someRTFtext
unformatedtext = RTFConvert.Text
unformatedtext = Replace(unformatedtext, "[ul]", "\ul")
unformatedtext = Replace(unformatedtext, "[b]", "\b")
unformatedtext = Replace(unformatedtext, "[i]", "\i")
Clipboard.SetText(unformatedtext)
oWord.ActiveDocument.ActiveWindow.Selection.PasteAndFormat(0)
Você pode remover as tags com expressões regulares.Apenas certifique-se de que suas expressões não filtrarão tags que na verdade eram texto.Se o texto tivesse "\b" no corpo do texto, ele apareceria como \b no fluxo RTF.Em outras palavras, você corresponderia a "\b", mas não a "\b".
Você provavelmente poderia pegar um atalho e filtrar as tags RTF do cabeçalho.Procure a primeira ocorrência de "\viewkind4" na entrada.Em seguida, leia adiante até o primeiro caractere de espaço.Você removeria todos os caracteres desde o início do texto até o caractere de espaço, inclusive.Isso eliminaria as informações do cabeçalho RTF (fontes, cores, etc.).
Regex, ele não analisa absolutamente tudo corretamente (tabelas, por exemplo), mas faz o trabalho na maioria dos casos.
string unformatted = Regex.Replace(rtfString, @"\{\*?\\[^{}]+}|[{}]|\\\n?[A-Za-z]+\n?(?:-?\d+)?[ ]?", "");
Magia =)