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.

Foi útil?

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 =)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top