Приписанная строка теряет вложение в вставку из картона
Я потратил довольно много дней на поиски решения для размещения атрибутивной строки с вложением на NSPasteboard.
Я могу прочитать RTFD-файл с вложениями, изменить его текст и атрибуты, а затем поместить его на NSPasteboard для использования в других приложениях (например, Mail.app), и это прекрасно работает. Но то, что я хотел бы сделать, это также добавить изображение в какой-то момент в тексте. Я могу сделать это с помощью текста в виде приписанных строк, но если я попытаюсь вставить изображение (как вложение в приписанную строку), изображение никогда не появится (хотя остальное происходит).
Кажется, что RTFD выпускается в разных вариантах, и тот, который мне нужен, сериализуется. Я пробовал много вариантов объявленных типов NSPasteboard, даже используя FileWrappers, но должно быть упущено что-то важное. Неважно, что я делаю, вложение никогда не приходит.
Странно то, что если я читаю RTFD-файл с вложенными изображениями, изменяю его и вставляю в pasteBoard, эти оригинальные вложения работают нормально - если я пытаюсь добавить новые вложения, они этого не делают. Примером является чтение файла RTFD, работа с ним, загрузка монтажного листа и вставка результатов в почту. Отображается весь исходный текст и изображения, а также любой новый измененный или добавленный текст и атрибуты, но прикрепленные изображения просто отсутствуют.
Вот пример кода:
Создайте атрибутивную строку с некоторым текстом, затем добавьте прикрепленное изображение, затем немного больше текста, отобразите его в textView (все, что работает), затем загрузите монтажный картон и вставьте его в textEdit или Mail... прикрепленного изображения нет хотя остальное это:
// get the image
NSImage *myImage = [[NSImage alloc] initWithData: [window dataWithPDFInsideRect:[theImage frame]]];
// set the image as an attachment
NSTextAttachment *myAttachment = [[NSTextAttachment alloc] init];
NSTextAttachmentCell *myAttachmentCell = [[NSTextAttachmentCell alloc] initImageCell:myImage];
[myAttachment setAttachmentCell:myAttachmentCell];
// put image inside attributed string
NSAttributedString *myImageString = [NSAttributedString attributedStringWithAttachment:myAttachment] ;
// make an attributes dictionary (simply makes text blue) as an example
NSDictionary *myAttributesDict = [NSDictionary dictionaryWithObjectsAndKeys:
[NSColor blueColor], NSForegroundColorAttributeName,
nil];
// and add some beginning text
NSMutableAttributedString *theCombinedString = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"Here's an image we just grabbed: \n\n"] attributes:myAttributesDict];
// now append our attached image
[theCombinedString appendAttributedString:myImageString];
// and add some following text as an example
NSMutableAttributedString *endString = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"\n\n How about that!\n"] attributes:myAttributesDict];
// and stick it all together
[theCombinedString appendAttributedString: endString];
// now display it in a textView to make sure we have something
[[junkTextView textStorage] appendAttributedString: theCombinedString];
/// --- works just fine to here --- ///
// the following loads the pastboard, including the added text, but for some reason, leaves out the above attachment
NSPasteboard *thePboard = [NSPasteboard generalPasteboard];
[thePboard clearContents];
NSAttributedString *theContents = [[NSAttributedString alloc] theCombinedString ];
[thePboard writeObjects:[NSArray arrayWithObject:theContents]];
// pasting into mail or textEdit shows the above before and after text, but not the image.
Есть идеи?
Я пытался использовать NSData, сериализовать NSFileWrapper, устанавливать различные типы монтажных карт и многое другое. Пока что ничего не работает. Если я загружаю изображение в виде данных TIFF, оно вставляется нормально, но мне нужно его как приписанную строку, чтобы вставить в большую строку из файла, который уже имеет вложения.
Это моя первая публикация здесь, поэтому, пожалуйста, извините за любые ошибки форматирования - я узнаю, и большое спасибо за любые указатели или помощь, даже если это RTFM, что я сделал, но, возможно, неправильно понял.
1 ответ
Наконец нашел решение, и это был Wrapper в конце концов. Вот код для всех, кто интересуется, работает с изображением, прочитанным из файла или взятым из вашего приложения:
// make a file wrapper
NSFileWrapper* wrapper =[[NSFileWrapper alloc] initRegularFileWithContents:[theImage TIFFRepresentationUsingCompression:NSTIFFCompressionLZW factor:1]];
// -must- have this. used to save your pasted file in some apps
[wrapper setPreferredFilename:@"yourImage.tiff"];
//
NSAttributedString* imageString = [NSAttributedString attributedStringWithAttachment:[[NSTextAttachment alloc] initWithFileWrapper:wrapper]];
// then load pasteboard and paste wherever you wish. You can get fancier using private
// pasteboards and custom data types, of course. This is just a simple example.