在iOS上发送PDF文件

时间:2015-06-23 16:13:18

标签: ios email pdf

我正在编写一个通过电子邮件发送pdf文件的功能。在iOS上,我遇到一个问题,即生成pdf文件并将其附加到电子邮件并成功发送,但收到的电子邮件由于某种原因不包含原始pdf文件。

这是我使用MFMailComposeViewController的实现。

MFMailComposeViewController *mailer = [[[MFMailComposeViewController alloc] init] autorelease];
[mailer setMailComposeDelegate: id(m_delegate)];
[mailer setSubject:subject.toNSString()];
NSMutableArray *toRecipients = [[NSMutableArray alloc] init];
for(int i = 0; i < recipients.length(); i++)
{
    [toRecipients addObject:recipients.at(i).toNSString()];
}
[mailer setToRecipients:toRecipients];
NSString *emailBody = body.toNSString();
[mailer setMessageBody:emailBody isHTML:NO];


// Determine the file name and extension
attachedFile = "/var/mobile/Containers/Data/Application/1DFBF012-4838-4350-B465-ECF247831EB3/Library/Application Support/test.pdf";
NSArray *filepart = [attachedFile.toNSString() componentsSeparatedByString:@"."];
NSString *filename = [filepart objectAtIndex:0];
NSString *extension = [filepart objectAtIndex:1];

// Get the resource path and read the file using NSData
NSString *filePath = [[NSBundle mainBundle] pathForResource:filename ofType:extension];
NSData *fileData = [NSData dataWithContentsOfFile:filePath];

// Determine the MIME type
NSString *mimeType;
if ([extension isEqualToString:@"jpg"]) {
    mimeType = @"image/jpeg";
} else if ([extension isEqualToString:@"png"]) {
    mimeType = @"image/png";
} else if ([extension isEqualToString:@"doc"]) {
    mimeType = @"application/msword";
} else if ([extension isEqualToString:@"ppt"]) {
    mimeType = @"application/vnd.ms-powerpoint";
} else if ([extension isEqualToString:@"html"]) {
    mimeType = @"text/html";
} else if ([extension isEqualToString:@"pdf"]) {
    mimeType = @"application/pdf";
}

// Add attachment
[mailer addAttachmentData:fileData mimeType:mimeType fileName:filename];


[qtController presentViewController:mailer animated:YES completion:nil];

我能够看到该文件附加到电子邮件并发送。我能够收到发送的电子邮件。但是,当我打开电子邮件时,它不包含附加的文件。

有什么建议我可以解决这个问题吗?

以下是我保存PDF文件的实现,该文件遵循用于保存应用程序数据的标准文件系统路径。

/* Generate PDF file for sharing */
CGRect pageRect = CGRectMake(0, 0, 640, 480);
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSString * newFilePath = [documentPath stringByAppendingPathComponent:@"test.pdf"];
NSString *strFilename = newFilePath;
MyCreatePDFFile(pageRect, [strFilename UTF8String]);

我一直在寻找是否有办法获取为解决问题而生成的PDF文件。它位于Application Support目录中,由于沙盒策略,其他应用程序无法访问该目录。最快的方法是为我的应用启用文件共享。这是一个有用的链接,教你如何为我的应用程序启用文件共享。

How to enable file sharing for my app?

所以我通过iTune共享从应用程序到我的MAC从iPAD中取出PDF文件。我能够附上相同的文件并通过电子邮件发送到我的MAC上。

MFMailComposeViewController似乎没有抱怨该文件但是静默拒绝它。这被认为是一个错误吗?

1 个答案:

答案 0 :(得分:0)

该错误是由于附件文件路径未指向想要附加的pdf文件。这是它的修复:

// Get the resource path and read the file using NSData
NSString *filePath = newFilePath; // corrected the attachment file path
NSData *fileData = [NSData dataWithContentsOfFile:filePath];

应该运行以下实现。

/* Generate PDF file for sharing */
CGRect pageRect = CGRectMake(0, 0, 640, 480);
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSString * newFilePath = [documentPath stringByAppendingPathComponent:@"test.pdf"];
NSString *strFilename = newFilePath;
MyCreatePDFFile(pageRect, [strFilename UTF8String]);

/* Attach PDF file generated */
NSString *emailTitle = @"Email PDF as attachment";
NSString *messageBody = @"Hey, check this out!";
NSArray *toRecipents = [NSArray arrayWithObject:@"grace@abc.com"];

//Implementation using MFMailComposeViewController
MFMailComposeViewController *mc = [[MFMailComposeViewController alloc] init];
mc.mailComposeDelegate = self;
[mc setSubject:emailTitle];
[mc setMessageBody:messageBody isHTML:NO];
[mc setToRecipients:toRecipents];

// Determine the file name and extension
NSArray *filepart = [strFilename componentsSeparatedByString:@"."];
NSString *filename = [filepart objectAtIndex:0];
NSString *extension = [filepart objectAtIndex:1];

// Get the resource path and read the file using NSData
NSString *filePath = newFilePath;
NSData *fileData = [NSData dataWithContentsOfFile:filePath];

// Determine the MIME type
NSString *mimeType;
if ([extension isEqualToString:@"jpg"]) {
    mimeType = @"image/jpeg";
} else if ([extension isEqualToString:@"png"]) {
    mimeType = @"image/png";
} else if ([extension isEqualToString:@"doc"]) {
    mimeType = @"application/msword";
} else if ([extension isEqualToString:@"ppt"]) {
    mimeType = @"application/vnd.ms-powerpoint";
} else if ([extension isEqualToString:@"html"]) {
    mimeType = @"text/html";
} else if ([extension isEqualToString:@"pdf"]) {
    mimeType = @"application/pdf";
}

// Add attachment
[mc addAttachmentData:fileData mimeType:mimeType fileName:filename];

// Present mail view controller on screen
[self presentViewController:mc animated:YES completion:NULL];