2016-12-08 28 views
0

是否有可能一個NSattributedString帶附件(RTFD不是RTF)轉換爲ASCII,編輯流,並將其轉換回?到目前爲止,我能夠將RTFD轉換爲String流。但將其重新轉換爲NSData對象不起作用。這是我在操場上使用的代碼。可可轉換RTFD爲ASCII和背部

import Cocoa 

func stream(attr: NSAttributedString) -> String? { 
    if let d = attr.rtfd(from: NSMakeRange(0, attr.length), documentAttributes: [NSDocumentTypeDocumentAttribute: NSRTFDTextDocumentType]) { 
     if let str = String(data: d, encoding: .ascii) { return str } 
     else { 
      print("Unable to produce RTFD string") 
      return nil 
     } 
    } 
    print("Unable to produce RTFD data stream") 
    return nil 
} 


if let im = NSImage(named: "image.png") { 
    let a = NSTextAttachment() 
    a.image = im 

    let s = NSAttributedString(attachment: a) 

    if let str = stream(attr: s) { 
     print("\(str)\n") //prints a string, which contains RTF code combined with NSTextAttachment string representation 

     if let data = str.data(using: .ascii) { //this is where things stop working 
      if let newRTF = NSAttributedString(rtfd: data as Data, documentAttributes: nil) { 
       print(newRTF) 
      } 
      else { print("rtfd was not created") } 
     } 
     else { print("could not make data") } 
    } 
} 

我錯過了什麼?或者我的整個概念在這裏是錯的?我這樣做是爲了解決OS X處理RTF文檔中附加圖像的限制。

編輯: 我試圖解決的限制是設置圖像的尺寸以RTF流。文本處理系統要求我們使用NSTextAttachment。無論何時粘貼圖像,圖像都會根據像素的高度和寬度自動調整圖像的大小。不幸的是,沒有辦法控制這個屬性。我已嘗試here並且還使用所有技術here

至於ASCII流,我並不想編輯圖片附件本身。打印流時,實際的RTF代碼可見且可編輯。這是有效的,對於這個限制是一個很好的解決方法。我需要的只是編輯RTF代碼並更改Apple使用的\width\height屬性。

+0

這似乎並不奇怪,這是失敗的,爲什麼會包含圖像的編碼Unicode字符串能夠被無損轉換爲ASCII字符串?目前尚不清楚你在這裏做什麼。你可能會更好地解釋你所關心的任何限制,並尋求指導來解決它。 (您可以編輯問題或者更好地刪除這個問題並創建一個新問題,請不要在評論中解釋。) – CRD

+0

@CRD你好,我已經更新了問題以包含更多信息。如果我在概念上錯過了一些東西,這是一個非常錯誤的方法,那麼我很樂意學習。 – MAH

回答

0

您的編輯後,我可以看到你正在嘗試做的,有趣的想法,但它不會工作 - 至少不容易。

看一看的d值時,它是不存儲爲Data型(或NSData)的值的ASCII字符串。它是多個項目的序列化表示; RTF流(文本),圖像數據(二進制)。如果將其轉換爲ASCII字符串並再次返回,它將不起作用,除非您對它進行編碼(例如基本64編碼之類的東西),否則不能將任意二進制數據表示爲ASCII。

現在你可以嘗試你正在嘗試的方式略有不同,跳過轉換爲ASCII並直接編輯0​​值。這當然是可能的,但是當你編輯一個你不知道的格式(序列化表示)時,你必須小心......即使你成功地編輯了表示,也不能保證將其轉換回NSAttributedStringNSTextAttachment將保留您的編輯。

我建議你解決這個問題。你有一個NSAttributedString,並且你不喜歡在將它寫入文件後生成的RTF。因此,在編寫RTF之後編輯它,例如打開RTFD包,打開包含的RTF文件(TXT.rtf),編輯它,寫回。

HTH

+0

這就近了。我已經設法編碼.macOSRoman編碼,編輯,然後轉換回NSAttributedString。一旦轉換回來,它總是重置圖像大小。就我而言,這基本上不可能解決。我也試過在rtf文件中改變標籤,但這也不起作用。爲了讓Apple忽略RTF語法中最重要的方面之一就是圖像。現在,我認爲我只需要手動縮放圖像並丟失很多分辨率。 – MAH