Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-如何编码MAC解码字体信息_Java_Macos_Clipboard_Encode_Checkstyle - Fatal编程技术网

Java-如何编码MAC解码字体信息

Java-如何编码MAC解码字体信息,java,macos,clipboard,encode,checkstyle,Java,Macos,Clipboard,Encode,Checkstyle,我正在尝试使用MAC从剪贴板获取字体信息。下面是从剪贴板获取值的代码 代码 Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); Transferable contents = clipboard.getContents(null); DataFlavor dfRTF = new DataFlavor("text/rtf", "Rich Formatted Text"); DataFlavor dfTxt

我正在尝试使用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();
}
}
代码返回的解码值如下所示:

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
表示其
粗体


如何对其进行编码以获得特定值,例如,我想知道它是粗体还是否。
请给出建议。

如果我不清楚您需要什么,您可以尝试将其转换为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();
            }
        }}}

要标识全部粗体元素,可以使用doc.outerHtml()方法,该方法返回整个html

假设在我的剪贴板中有如下复制数据

粗体1 粗体2 黑体字3 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>

Bold1

Bold2

Bold3

Bold4


因此,现在您只需要为读取粗体元素添加一些解析逻辑。

知道如何循环
文档doc=Jsoup.parse(result)。我如何检查整个元素的粗体而不是第一个粗体文本?我需要java代码,因为我使用java swing进行开发。我是怎么从@fazerty那里得到暗示的。谢谢