Java String-字体样式检查

标签 java string clipboard checkstyle

我需要对所选文本区域进行字体样式检查

我使用applescript将突出显示/选定的文本区域复制到剪贴板并在java中检索剪贴板值。我使用 string 来捕获所选/突出显示的值。

有什么方法可以在java中使用String进行样式检查

代码检索剪贴板值:

    String result = "";
    Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();

    //odd: the Object param of getContents is not currently used
    Transferable contents = clipboard.getContents(null);
    boolean hasTransferableText = (contents != null) &&
      contents.isDataFlavorSupported(DataFlavor.stringFlavor);
    if ( hasTransferableText ) {
      try {
        result = (String)contents.getTransferData(DataFlavor.stringFlavor);
      }
      catch (UnsupportedFlavorException ex){
      }
      catch (IOException ex) {
      }
    }
    return result;
  }

字体信息:

{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
{\fonttbl\f0\fnil\fcharset0 Verdana;\f1\fnil\fcharset0 Tahoma;}
{\colortbl;\red255\green255\blue255;}
\deftab720
\pard\pardeftab720\sa280

\f0\i\fs34 \cf0 testing
\f1\i0  hello\'a0
\b Module 
\b0 \ul world}
{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
{\fonttbl\f0\fnil\fcharset0 Verdana;\f1\fnil\fcharset0 Tahoma;}
{\colortbl;\red255\green255\blue255;}
\deftab720
\pard\pardeftab720\sa280

\f0\i\fs34 \cf0 testing
\f1\i0  hello\'a0
\b Module 
\b0 \ul world}

请指教。任何建议/引用都将受到高度赞赏。

最佳答案

您获得的值是富文本格式的语义代码。整个基于 Java 的 rtf 解析器的代码太长,无法在这里发布,但作为引用,有一个 RTFEditorKit Swing 中的 0 和 Tika Apache 的项目有一个 RTFParser。

RTF 使用控制字 - 它们具有类似于其他标记语言的开始和结束标记,例如:

示例:\someAsciiTag1 ...\someAsciiTag1

就您的问题而言:

字体样式就在字体表或 \fnttbl 组中 - 组由大括号{}封装。

字体样式按照类似索引的结构排序,并以 \f*index* 作为控制代码。

下一个代码是\f*font-family*等等。

虽然全局字体样式设置在文件顶部的\fnttbl 中,但可以在纯文本部分(如 html)中进行某些样式修改,例如:\fs20 表示 font-size = 20任何单元都继承到像 css 这样的结构中。

虽然我可以在此处发布 Java 代码来向您展示如何访问特定标记,如果您只需要访问一些全局元素,但我不知道您的范围整个项目,如果您的目标是从文本中获取所有样式,我真的非常强烈地鼓励您使用上面提供的解析器之一,因为 RTF 是一种非常复杂的格式。

如果你对此表示怀疑,这里有一个指向 Microsoft 规范的链接,它大约有 270 页,据我所知,非常接近规范完整的最轻量级实现有超过 9000 行代码,这就是为什么你可能不想自己做。

http://www.microsoft.com/en-us/download/details.aspx?id=10725

编辑:

我意识到我没有完全回答您在上一个答案中的第二个问题

\b 或\b1 = 粗体(true 或 1) AND \b0 = 粗体(false 或 0)

\i 或\i1 = 斜体(true 或 1) AND \i0 = 斜体(false 或 0)

但是,仅供引用,这些并不是设置样式的唯一方法,rtf 允许使用其他不太常见的编程方式来设置这些值。此外,ascii 和 unicode rtf 代码之间也存在差异,因此再次使用解析器。

我仍然包含了字体标签结构,因此如果您需要全局信息,您可以获取它。

<fonttbl>   '{' \fonttbl (<fontinfo> | ('{' <fontinfo> '}'))+ '}'
<fontinfo>  <themefont>? \fN <fontfamily> \fcharsetN? \fprq? <panose>? <nontaggedname>?
    <fontemb>? \cpgN? <fontname> <fontaltname>? ';' 
<themefont> \flomajor | \fhimajor | \fdbmajor | \fbimajor | \flominor | \fhiminor |
    \fdbminor | \fbiminor
<fontfamily>    \fnil | \froman | \fswiss | \fmodern | \fscript | \fdecor | \ftech | 
    \fbidi
<panose>    '{\*' \panose <data> '}'
<nontaggedname> '{\*' \fname #PCDATA ';}'
<fontname>  #PCDATA
<fontaltname>   '{\*' \falt #PCDATA '}'
<fontemb>   '{\*' \fontemb <fonttype> <fontfname>? <data>? '}'
<fonttype>  \ftnil | \fttruetype
<fontfname> '{\*' \fontfile \cpgN? #PCDATA '}'

这是字体数据标签的列表和字体数据的一般结构。希望有帮助。

编辑:跟进

从外观上看,你有一大块 Mac rtfd(额外的标签)

cocoartf1038\cocoasubrtf360 - tells you it's mac encoded

第一部分给出编码 第二个给出了 f0 处的 Verdana 和 f1 处的 Tahoma 两种主要字体样式 第三行告诉你它是白色的 rgb(255,255,255) 等等。 第四和第五定义选项卡和分页。 第六个(非空白)表示 f0\i\fs34 = Verdana,斜体,大小 34\cf0 是黑色前景色 第七个是 Tahoma 斜体,模块周围加粗,世界则加下划线,依此类推,然后重复。

有一个基于 Java 的 rtf 解析器,最近添加了对一些 mac 自定义标签的支持,您可以找到它 on GitHub here连接模块并解析您可能需要的任何文件应该相当简单。

关于Java String-字体样式检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18305798/

相关文章:

c - 使用 strtol 验证 ANSI C 中的整数输入

c# - 如何将 ASP.NET GridView 复制到剪贴板

java - Java中将字符串转换为int数组

java - 使用 AOP 作用域代理在单例 bean 中 Autowiring 原型(prototype) bean

java - android error org.json.JSONException : Value &lt;! java.lang.String类型的DOCTYPE无法转换为JSONObject

javascript - 无法让 "clipboard.js"工作

Android 复制和粘贴多个文本

java - Android java.lang.NullPointer。 Eclipse Juno - JDK7 路径错误?

c# - 如何将 string.join 添加到 foreach 循环

java - 如何将 StringBuilder 标记与多个 java 字符串进行比较?