Cocoa将RTFD转换为ASCII并返回

时间:2016-12-08 18:57:01

标签: cocoa ascii nsdata rtf

是否可以将带有附件的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属性。

1 个答案:

答案 0 :(得分:0)

在你编辑之后,我可以看到你想要做什么,有趣的想法,但它不会起作用 - 至少不容易。

查看d的值,将ASCII字符串存储为类型Data(或NSData)的值。它是多个项目的序列化表示; RTF流(文本),图像数据(二进制)。如果将其转换为ASCII字符串并再次返回它将不起作用,除非您对其进行编码(例如,像base 64编码之类的东西),否则不能将任意二进制数据表示为ASCII。

现在您可以尝试稍微不同的尝试,跳过转换为ASCII并直接编辑Data值。这当然是可能的,但是当您编辑一个您不知道的格式(序列化表示)时,您必须要小心......即使您成功编辑了表示,也无法保证转换回{ {1}} NSAttributedString会保留您的修改。

我建议你用另一种方式解决这个问题。您有一个NSTextAttachment并且您不喜欢将此文件写入文件后生成的RTF。因此,在编写RTF后编辑它,例如打开RTFD包,打开包含的RTF文件(NSAttributedString),编辑它,写回来。

HTH