2013-09-25 1 views
4

Я пытаюсь получить информацию о шрифтах из Clipboard с использованием MAC .Below код для получения значения из буфера обмена .Java - Как кодируется MAC декодирует информацию о шрифте

КОД

Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); 
Transferable contents = clipboard.getContents(null); 
DataFlavor dfRTF = new DataFlavor("text/rtf", "Rich Formatted Text"); 
DataFlavor dfTxt = DataFlavor.stringFlavor; 
boolean hasTransferableRTFText = (contents != null) 
       && contents.isDataFlavorSupported(dfRTF); 
boolean hasTransferableTxtText = (contents != null) 
       && contents.isDataFlavorSupported(dfTxt); 
if (hasTransferableRTFText) { 
try { 
result = streamToString((InputStream)contents.getTransferData(dfRTF)); 
System.out.println("dfRTF "+result); 
} catch (Exception ex) { 
ex.printStackTrace(); 
} 
} else if (hasTransferableTxtText) { 
try { 
result = (String)contents.getTransferData(dfTxt); 
System.out.println("dfTxt "+result); 
} catch (Exception ex) { 
ex.printStackTrace(); 
} 
} 

и код возвращается MAC декодированного значения, как показано ниже:

dfRTF {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 
{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 
{\colortbl;\red255\green255\blue255;} 
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural 

\f0\b\fs24 \cf0 Hello WORLD} 
{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 
{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 
{\colortbl;\red255\green255\blue255;} 
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural 

\f0\b\fs24 \cf0 Hello WORLD} 

Я знаю, что \f0\b\fs24 \cf0 Hello WORLD} содержит информацию о шрифте, где \b означает ИТС BOLD.
Как его закодировать, чтобы получить это конкретное значение, например, я хочу знать, BOLDED или NO. Прошу совета.

ответ

0

Если я правильно понял, что вам нужно, вы можете попробовать преобразовать его в html и использовать библиотеку jsoup для извлечения необходимой информации.

Вот пример, чтобы извлечь для первого жирного текста, найденного в буфер обмена

package rtfTest; 


import java.awt.Toolkit; 
import java.awt.datatransfer.Clipboard; 
import java.awt.datatransfer.DataFlavor; 
import java.awt.datatransfer.Transferable; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.Reader; 
import java.io.StringReader; 
import java.io.StringWriter; 
import java.io.Writer; 

import javax.swing.JEditorPane; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.EditorKit; 

import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 



public class TestRtf{ 
    public static void main (String[] args) { 
     TestRtf t = new TestRtf(); 
     t.readClipboard() ; 
    } 

    @SuppressWarnings("resource") 
    static String streamToString(java.io.InputStream is) { 
     java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A"); 
     return s.hasNext() ? s.next() : ""; 
    } 

    public static String rtfToHtml(Reader rtf) throws IOException { // From http://www.codeproject.com/Tips/136483/Java-How-to-convert-RTF-into-HTML 
     JEditorPane p = new JEditorPane(); 
     p.setContentType("text/rtf"); 
     EditorKit kitRtf = p.getEditorKitForContentType("text/rtf"); 
     try { 
      kitRtf.read(rtf, p.getDocument(), 0); 
      kitRtf = null; 
      EditorKit kitHtml = p.getEditorKitForContentType("text/html"); 
      Writer writer = new StringWriter(); 
      kitHtml.write(writer, p.getDocument(), 0, p.getDocument().getLength()); 
      return writer.toString(); 
     } catch (BadLocationException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    public void readClipboard() { 
     String result; 
     Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); 
     Transferable contents = clipboard.getContents(null); 
     DataFlavor dfRTF = new DataFlavor("text/rtf", "Rich Formatted Text"); 
     DataFlavor dfTxt = DataFlavor.stringFlavor; 

     boolean hasTransferableRTFText = (contents != null) 
       && contents.isDataFlavorSupported(dfRTF); 
     boolean hasTransferableTxtText = (contents != null) 
       && contents.isDataFlavorSupported(dfTxt); 
     if (hasTransferableRTFText) { 
      try { 
       // result = streamToString((InputStream)contents.getTransferData(dfRTF)); 
       // Convert rtf to html 
       result = rtfToHtml(new StringReader(streamToString((InputStream)contents.getTransferData(dfRTF)))); 
       // Example of text extraction from html 
       // Parse html 
       Document doc = Jsoup.parse(result); 
       // Select first bold text 
       Element firstBoldElt = doc.select("b").first(); 
       String firstBoldText = firstBoldElt.text(); 

       System.out.println(firstBoldText); 
      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } 
     } else if (hasTransferableTxtText) { 
      try { 
       result = (String)contents.getTransferData(dfTxt); 
       System.out.println("dfTxt "+ result); 
      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } 
     }}} 
+0

любая идея, как мы можем закодировать «Document doc = Jsoup.parse (result);». Как я получу полужирный для всего элемента вместо первого жирного текста? –

0

Для идентификации всех смелое элемент, который вы можете использовать doc.outerHtml() метод, который возвращать весь HTML.

Предположим, что в моем буфере обмена у меня есть копия ниже данных, как

Bold1 Bold2 Bold3 Bold4

теперь, когда вы используете doc.outerHtml() вы получите ответ ниже

<html><head><style><!--p.DefaultaParagraphaFont {bold:normal;italic:;underline:;}--></style></head><body><p class="default"> <span style="color: #000000; font-size: 11pt; font-family: Calibri"> <b>Bold1</b> </span> </p> <p class="default"> <span style="color: #000000; font-size: 11pt; font-family: Calibri"> <b>Bold2</b> </span> </p> <p class="default"> <span style="color: #000000; font-size: 11pt; font-family: Calibri"> Bold3 </span> </p> <p class="default"> <span style="color: #000000; font-size: 11pt; font-family: Calibri"> <b>Bold4</b> </span> </p></body></html> 

Итак, теперь вам просто нужно поместить некоторую логику синтаксического анализа для чтения жирным шрифтом элемент.

+0

Мне нужен код Java, так как я использую java swing для своей разработки. любой, как я получил намек от @fazerty. благодаря –

Смежные вопросы