Question

J'aimerais prendre une entrée RTF et la nettoyer pour supprimer tout le formatage RTF sauf \ul \b \i pour le coller dans Word avec des informations de format mineures.

La commande utilisée pour coller dans Word ressemblera à ceci :oWord.ActiveDocument.ActiveWindow.Selection.PasteAndFormat(0) (avec du texte RTF déjà dans le Presse-papiers)

{\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

Avez-vous une idée sur la façon dont je peux nettoyer le RTF en toute sécurité avec des expressions régulières ou quelque chose du genre ?J'utilise VB.NET pour effectuer le traitement, mais n'importe quel exemple de langage .NET fera l'affaire.

Était-ce utile?

La solution

J'utiliserais une RichTextBox cachée, définirais le membre Rtf, puis récupérerais le membre Text pour nettoyer le RTF d'une manière bien prise en charge.Ensuite, j'utiliserais ensuite pour injecter manuellement le formatage souhaité.

Autres conseils

Je ferais quelque chose comme ceci :

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)

Vous pouvez supprimer les balises avec des expressions régulières.Assurez-vous simplement que vos expressions ne filtreront pas les balises qui étaient en réalité du texte.Si le texte contenait « \b » dans le corps du texte, il apparaîtrait sous la forme \b dans le flux RTF.En d'autres termes, vous feriez correspondre "\b" mais pas "\b".

Vous pourriez probablement prendre un raccourci et filtrer les balises RTF d’en-tête.Recherchez la première occurrence de "\viewkind4" dans l'entrée.Lisez ensuite jusqu'au premier caractère espace.Vous supprimeriez tous les caractères depuis le début du texte jusqu'à ce caractère d'espace inclus.Cela supprimerait les informations d'en-tête RTF (polices, couleurs, etc.).

Regexez-le, il n'analysera absolument pas tout correctement (les tables par exemple) mais fait le travail dans la plupart des cas.

string unformatted = Regex.Replace(rtfString, @"\{\*?\\[^{}]+}|[{}]|\\\n?[A-Za-z]+\n?(?:-?\d+)?[ ]?", "");

Magie =)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top