使用Cocoa进行RTF到HTML的转换

时间:2014-01-04 16:45:14

标签: cocoa

我是QT程序员,Cocoa对我来说很新。如何在Mac OS X下使用cocoa将富文本格式(带图像和超链接的RTF文本)转换为HTML。我将富文本转换为char类型缓冲区。

3 个答案:

答案 0 :(得分:1)

使用RTF数据创建NSAttributedString实例。遍历字符串的属性范围(包括附件/图片)并转换为HTML(将适当的HTML附加到NSMutableString)。这使您可以转换任何您想要的属性,同时留下您不想要的属性。

一个有用的NSAttributedString方法是-enumerateAttributesInRange:options:usingBlock:。在块内,您可以确定是要处理还是忽略给定属性。有关处理图像的信息,请参阅Handling Attachments部分(在RTFD中视为附件,只是属性字符串中“字符”的另一种属性类型)。

答案 1 :(得分:1)

您可以使用NSAttributedString执行RTF到HTML的转换以及Application Kit提供的对其的添加 - 阅读NSAttributedString Application Kit Additions Reference

从RTF创建NSAttributedString的方法,例如initWithRTF:documentAttributes:initWithURL:documentAttributes:

要创建HTML,您可以使用dataFromRange:documentAttributes:error:指定相应的属性,您至少需要指定NSHTMLTextDocumentType

答案 2 :(得分:0)

真的取决于你的输出要求......我可以将字符串“hello world”转换为有效的html,但它可能不是你所期望的......无论如何作为@Joshua的替代方法......

textutil实用程序可用于各种转换。您可以通过NSTask

从Cocoa中使用它
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath: @"/usr/bin/textutil"];
[task setArguments: @[@"-format", @"rtf", @"-convert", @"html", @"-stdin", @"-stdout"]];
[task setStandardInput:[NSPipe pipe]];
[task setStandardOutput:[NSPipe pipe]];
NSFileHandle *taskInput = [[task standardInput] fileHandleForWriting];
[taskInput writeData:[NSData dataWithBytes:cString length:cStringLength]];
[task launch];
[taskInput closeFile];

的同期

NSData *outData = [[[task standardOutput] fileHandleForReading] readDataToEndOfFile];
NSString *outStr = [[NSString alloc] initWithData:outData encoding:NSUTF8StringEncoding];

或async

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(readCompleted:) name:NSFileHandleReadToEndOfFileCompletionNotification object:[[task standardOutput] fileHandleForReading]];
[[[task standardOutput] fileHandleForReading] readToEndOfFileInBackgroundAndNotify];

- (void)readCompleted:(NSNotification *)notification {
  NSData *outData = [[notification userInfo] objectForKey:NSFileHandleNotificationDataItem];
  NSString *outStr = [[NSString alloc] initWithData:outData encoding:NSUTF8StringEncoding];
  NSLog(@"Read data: %@", outStr);
  [[NSNotificationCenter defaultCenter] removeObserver:self name:NSFileHandleReadToEndOfFileCompletionNotification object:[notification object]];
}

请不要只是复制并粘贴它......它只是一个例子,没有经过测试的生产代码。