2009-12-07 7 views
7

Dans mon application, j'utilise un JTextPane pour afficher des informations de journal. Comme je veux mettre en évidence certaines lignes spécifiques dans ce texte (par exemple les messages d'erreur), j'ai défini le contentType comme "text/html". De cette façon, je peux mettre en forme mon texte.Obtention de texte brut à partir de JTextPane

Maintenant, je crée un JButton qui copie le contenu de ce JTextPane dans le presse-papiers. Cette partie est facile, mais mon problème est que quand je l'appelle myTextPane.getText(), je reçois le code HTML, comme:

<html> 
    <head> 

    </head> 
    <body> 
    blabla<br> 
    <font color="#FFCC66"><b>foobar</b></font><br> 
    blabla 
    </body> 
</html> 

au lieu d'obtenir que le contenu brut:

blabla 
foobar 
blabla 

est-il un moyen obtenir uniquement le contenu de mon JTextPane en texte brut? Ou ai-je besoin de transformer le HTML en texte brut par moi-même?

Répondre

5

Sur la base de la réponse acceptée à: Removing HTML from a Java String

MyHtml2Text parser = new MyHtml2Text(); 
try { 
    parser.parse(new StringReader(myTextPane.getText())); 
} catch (IOException ee) { 
    //handle exception 
} 
System.out.println(parser.getText()); 

version légèrement modifiée de la classe Html2Text trouvée sur la réponse que je lié à

import java.io.IOException; 
import javax.swing.text.html.*; 
import javax.swing.text.html.parser.*; 

public class MyHtml2Text extends HTMLEditorKit.ParserCallback { 
    StringBuffer s; 
    public MyHtml2Text() {} 
    public void parse(Reader in) throws IOException { 
     s = new StringBuffer(); 
     ParserDelegator delegator = new ParserDelegator(); 
     delegator.parse(in, this, Boolean.TRUE); 
    } 
    public void handleText(char[] text, int pos) { 
     s.append(text); 
     s.append("\n"); 
    } 
    public String getText() { 
     return s.toString(); 
    } 
} 

Si vous avez besoin d'une manipulation plus fine envisager implémenter plus de l'interface définie par HTMLEditorKit.ParserCallback

2

Vous devez le faire vous-même malheureusement. Imaginez si certains contenus étaient spécifiques au HTML, par exemple des images - la représentation du texte n'est pas claire. Inclure le texte alt ou non par exemple.

2

(Is RegExp permis? Ce n'analyse, ne l'est pas)

Prenez pour filtrer tous les tags le résultat getText() et utiliser String.replaceAll(). Than un trim() pour supprimer les espaces de début et de fin. Pour les espaces entre votre premier et votre dernier 'blabla', je ne vois pas de solution générale. Peut-être que vous pouvez renverser le reste autour de CRLF et couper à nouveau toutes les cordes.

(Je ne suis pas expert en regexp - peut-être quelqu'un peut fournir à l'expression rationnelle et de gagner une certaine réputation;))

Modifier

.. Je supposais que vous n'utilisez pas < et > dans ton texte - sinon c'est ... dis, c'est un défi.

16

Pas besoin d'utiliser le ParserCallback. Il suffit d'utiliser:

textPane.getDocument().getText(0, textPane.getDocument().getLength())); 
+0

C'est en effet une très bonne solution ... sauf que j'ai perdu tous les sauts de ligne, et alors ma chaîne finale est seulement dans une ligne. Dommage, parce que j'ai vraiment aimé cette solution! – romaintaz

+0

Oui, le document ne stocke pas les sauts de ligne, ils sont ajoutés manuellement par l'autre solution. – camickr

Questions connexes