我有一些输出,这是一个非常简单的RTF文件。当我生成此文档时,用户可以通过电子邮件发送它。所有这些都很好。这个文件看起来不错。一旦我有了NSAttributedString,我就创建了一个NSData块,并将其写入文件,如下所示:
NSData* rtfData = [attrString dataFromRange:NSMakeRange(0, [attrString length]) documentAttributes:@{NSDocumentTypeDocumentAttribute: NSRTFTextDocumentType} error:&error];
此文件可以通过电子邮件发送。当我检查电子邮件时,一切都很好。
现在,我的任务是在文档的顶部添加一个UIImage。很好,所以我创建了一个属性化的字符串,像这样:
NSTextAttachment *attachment = [[NSTextAttachment alloc] init];
UIImage* image = [UIImage imageNamed:@"logo"];
attachment.image = image;
attachment.bounds = CGRectMake(0.0f, 0.0f, image.size.width, image.size.height);
NSMutableAttributedString *imageAttrString = [[NSAttributedString attributedStringWithAttachment:attachment] mutableCopy];
// sets the paragraph styling of the text attachment
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init] ;
[paragraphStyle setAlignment:NSTextAlignmentCenter]; // centers image horizontally
[paragraphStyle setParagraphSpacing:10.0f]; // adds some padding between the image and the following section
[imageAttrString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [imageAttrString length])];
[imageAttrString appendAttributedString:[[NSAttributedString alloc] initWithString:@"\n\n"]];
在这一点上,在Xcode中,我可以对imageAttrString做一个快速查看,它画得很好。
一旦这个字符串被建立,我这样做:
[attrString appendAttributedString:imageAttrString];
然后添加我最初生成的所有其他属性化文本。
当我现在看文件时,没有图像。QuickLook在调试器中看起来不错,但在最终输出中没有图像。
提前感谢您对此的任何帮助。
2条答案
按热度按时间u4dcyp6a1#
正如Andris提到的,苹果RTF实现不支持嵌入式图像。
RTFD并不是一个真实的替代方案,因为只有少数OS X应用程序可以打开RTFD文件。例如,MS Office不能。
在某些情况下,创建一个嵌入图像的HTML文件可能会有帮助,但是-例如-大多数电子邮件客户端不支持嵌入图像的HTML(Apple Mail支持,但Outlook不支持)。
但幸运的是,有一个解决方案来创建嵌入图像的真实的RTF文件!
由于RTF格式当然支持嵌入式图像(只有Apple实现不支持),因此NSAttributedStrings(NSTextString)中的图像可以(手动)编码到RTF流中。
以下类别完成所有需要的工作:
基本思想来自this article。
nfeuvbwi2#
虽然,RTF确实支持Windows上的嵌入式图像,但显然它不支持OS X。RTF由Microsoft开发,他们在1.5版中添加了嵌入式图像(http://en.wikipedia.org/wiki/Rich_Text_Version_changes)。我认为苹果采用了早期版本的格式,他们对文档中图像的解决方案是RTFD。以下是Apple文档对RTF的描述:
富文本格式(RTF)是微软公司开发的一种文本格式语言。您可以使用纯文本以及散布的RTF命令、组和转义序列来表示字符、段落和文档格式属性。RTF被广泛用作文档交换格式,以跨应用程序和计算平台传输文档及其格式信息。Apple已经使用自定义命令扩展了RTF,本章将介绍这些命令。
所以没有提到图像。最后,为了证明RTF不支持Mac上的图像,下载this RTF document-它将在Windows写字板中显示照片,而不会在OS X TextEdit中显示。
因此,正如Larme提到的-您应该在添加附件时选择RTFD文件类型。维基百科:
富文本格式目录,也称为RTFD(由于其扩展名为.rtfd),或富文本格式目录
虽然您可以获得包含文本和图像的NSData对象(根据其大小判断),但通过
dataFromRange:documentAttributes:@{NSDocumentTypeDocumentAttribute: NSRTFDTextDocumentType} error:]
您可能无法保存它以便成功打开它。至少-我没能做到。这可能是因为实际上RTFD不是一种文件格式-它是一种捆绑格式。要检查它,你可以在Mac上使用TextEdit创建一个新文档,向其中添加图像和文本,并将其保存为文件。然后右键单击该文件并选择Show Package Contents,您将注意到该目录包含RTF格式的图像和文本。
但是,您可以使用以下代码成功保存此文档:
因为显然NSFileWrapper知道如何处理RTFD文档,而NSData不知道它包含什么。
然而,主要的问题仍然存在-如何在电子邮件中发送它?因为RTFD文档是一个目录而不是一个文件,我想说它不太适合通过电子邮件发送,但是你可以压缩它并使用扩展名**.rtfd.zip**发送。这里的扩展是至关重要的,因为它会告诉邮件应用程序如何显示附件的内容,当用户点击它。实际上,它也可以在Gmail和iOS上的其他电子邮件应用程序中工作,因为它是UIWebView,知道如何显示. rtfd.zip。这里有一个关于它的技术说明:https://developer.apple.com/library/ios/qa/qa1630/_index.html#//apple_ref/doc/uid/DTS40008749
所以底线是-它可以做到,但RTFD文档将是电子邮件的附件,而不是电子邮件内容本身。如果你想把它作为一个电子邮件内容,你可能应该考虑把你的图像嵌入到HTML中,并以HTML格式发送邮件。