是否可以将带有附件的NSattributedString(RTFD而不是RTF)转换为ASCII,编辑流并将其转换回来?到目前为止,我能够将RTFD转换为String
流。但是将它变回NSData
对象是行不通的。这是我在操场上使用的代码。
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 :(得分:0)
在你编辑之后,我可以看到你想要做什么,有趣的想法,但它不会起作用 - 至少不容易。
查看d
的值,不将ASCII字符串存储为类型Data
(或NSData
)的值。它是多个项目的序列化表示; RTF流(文本),图像数据(二进制)。如果将其转换为ASCII字符串并再次返回它将不起作用,除非您对其进行编码(例如,像base 64编码之类的东西),否则不能将任意二进制数据表示为ASCII。
现在您可以尝试稍微不同的尝试,跳过转换为ASCII并直接编辑Data
值。这当然是可能的,但是当您编辑一个您不知道的格式(序列化表示)时,您必须要小心......即使您成功编辑了表示,也无法保证转换回{ {1}} NSAttributedString
会保留您的修改。
我建议你用另一种方式解决这个问题。您有一个NSTextAttachment
并且您不喜欢将此文件写入文件后生成的RTF。因此,在编写RTF后编辑它,例如打开RTFD包,打开包含的RTF文件(NSAttributedString
),编辑它,写回来。
HTH