2010-03-30 96 views
13

按照manpbpaste的,获取RTF数据从Mac OS X的纸板(剪贴板)

-Prefer {txt | rtf | ps} 
      tells pbpaste what type of data to look for in the pasteboard 
      first. As stated above, pbpaste normally looks first for plain 
      text data; however, by specifying -Prefer ps you can tell 
      pbpaste to look first for Encapsulated PostScript. If you spec- 
      ify -Prefer rtf, pbpaste looks first for Rich Text format. In 
      any case, pbpaste looks for the other formats if the preferred 
      one is not found. The txt option replaces the deprecated ascii 
      option, which continues to function as before. Both indicate a 
      preference for plain text. 

但是(在我和10.6雪豹至少经验),pbpaste -Prefer rtf永远不会放弃的RTF数据,即使它存在于粘贴板上。是否有任何其他简单的方法来获取任何准备好粘贴的RTF文本?

我试过AppleScript,但osascript -e 'the clipboard as «class RTF »'给出了响应«data RTF 7B吨的十六进制编码垃圾7D»。 AppleScript可以将这个hexdata转换成我可以玩的文本吗?

回答

11

我看不出有什么办法从里面的AppleScript做到这一点,但因为你是在外壳的工作,无论如何,我正后处理它:“十六进制编码垃圾”是你想要的RTF数据。我能想到的最简单的脚本是

perl -ne 'print chr foreach unpack("C*",pack("H*",substr($_,11,-3)))' 

的解释:substr($_,11,-3)剥去«data RTF»\n位(每个guillemets的是两个字节); pack("H*", ...)将十六进制编码的数据打包到字节流中; unpack("C*", ...)将字节流解包为字符值数组; print chr foreach ...将数组中的每个整数转换为其对应的字符并打印出来;并且-ne选项会评估为每行提供的脚本,并将该行隐式存储在$_中。 (如果你想在自己的文件,脚本,只需确保家当线#!/usr/bin/perl -ne)。然后,运行

osascript -e 'the clipboard as «class RTF »' | \ 
    perl -ne 'print chr foreach unpack("C*",pack("H*",substr($_,11,-3)))' 

会给你生RTF输出。

+1

聪明的做法。稍微简化一下就是用''RTF''替换''RTF类''(注意在任何情况下在结束分隔符之前所需的尾部空格):'osascript -e'剪贴板为“RTF” perl -ne'print chr foreach unpack(“C *”,pack(“H *”,substr($ _,11,-3)))'' - 可以工作(至少)10.8+。另请注意 - 按设计 - 如果剪贴板上没有RTF数据,则AppleScript命令将报告错误。 – mklement0 2014-06-10 03:18:53

+0

我已经将这个非常方便的别名添加到我的'.profile'中:''alias pbpaste-rtf =“osascript -e'剪贴板为\”RTF \“'| perl -ne'print chr foreach unpack(\”C * \“,pack(\”H * \“,substr(\ $ _,11,-3)))'”'。 – 2016-06-14 19:15:08

0

我发现了一个conversation这个具有快速谷歌搜索

+0

“但是,您将无法将RTF作为字符串操作AppleScript的。“ 在我发布问题之前,我看到在我的搜索中发现了这个问题,但我发现无法在没有写入文件的情况下获取RTF数据,这让人难以置信。 (我想在STDOut上使用RTF,所以我可以对它进行进一步的修改。)有谁知道AppleScript知道这是否属实? – Carl 2010-03-30 19:32:59

+0

假设有一种获取数据的方法,您希望对rtf数据做些什么? – mcgrailm 2010-03-30 21:55:47

+1

将其转换为HTML,然后将HTML转换为Markdown。显然,我可以在某处写入tempfile,但我真的不想出于性能原因和美学原因。似乎AppleScript应该有一种方法来解除数据本身的十六进制。或者还有其他一些工具可用于从粘贴板获取数据。 – Carl 2010-03-31 02:14:04

8

我认为,至少在OS X 10.8,如果你复制了Chrome的HTML内容这会工作:

osascript -e 'the clipboard as "HTML"'|perl -ne 'print chr foreach unpack("C*",pack("H*",substr($_,11,-3)))' 
+0

+1;仍然在10.9上运行。 – mklement0 2014-06-10 03:19:26

+0

仍然在10.10。 – 2017-08-01 01:39:07

0

它是通过AppleScript的(在10.11埃尔卡皮坦测试)非常简单:

set the clipboard to (the clipboard as «class RTF ») 

您可以通过创建的Automator服务:

  1. 开放的Automator
  2. 作出新的服务( “丁斯特” 在德语)
  3. 加上 “执行的AppleScript”
  4. 输入:无;输出;替代选择

脚本:

-- name: convert to RTF 
on run {input, parameters} 
    set the clipboard to (the clipboard as «class RTF ») 
    return the clipboard 
end run 

完成。现在保存新的服务并尝试:选择一个文本,然后进入应用程序菜单并选择“服务”>“convert to RTF”