如何将CGPDFDocument / CGPDFPage附加到MFMailComposeViewController

我有一个存储在本地存储上的多页PDF文档。 我想从该pdf文档中提取任何页面并将其转换为NSData以将其附加到“MFMailComposeViewController”。 使用以下代码行,我可以轻松地检索所需的页面…

CGPDFDocumentRef pdfDoc=CGPDFDocumentCreateWithURL(pdfURL); CGPDFPageRef pdfPage = CGPDFDocumentGetPage(pdfDoc, pageNumber); 

但我无法找到将pdfPage转换为NSData的方法,以便我可以将其附加到邮件中。

注意:要求是以PDF格式附加页面,因此请不要建议将PDF转换为PNG或JPEG。

CGPDF主要用于绘制PDF和PDF,而不是用于转换PDF数据。 因此,如果要提取页面,则必须绘制它。 用例如:

 // input CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)inputData); CGPDFDocumentRef document = CGPDFDocumentCreateWithProvider(provider); CGPDFPageRef page = CGPDFDocumentGetPage(document, pageIndex); CGRect mediaBox = CGPDFPageGetBoxRect(page, kCGPDFMediaBox); // output CGDataConsumerRef consumer = CGDataConsumerCreateWithCFData((__bridge CFMutableDataRef)outputData); CGContextRef context = CGPDFContextCreate(consumer, &mediaBox, NULL); // draw CGContextBeginPage(context, &mediaBox); CGContextDrawPDFPage(context, page); CGContextEndPage(context); // cleanup CGDataProviderRelease(provider); CGPDFDocumentRelease(document); CGDataConsumerRelease(consumer); CGContextRelease(context); 

这是你做的:

  NSMutableData *pdfData = [[NSMutableData alloc] init]; CGDataConsumerRef dataConsumer = CGDataConsumerCreateWithCFData((CFMutableDataRef)pdfData); const CGRect mediaBox = CGRectMake(0.0f, 0.0f, drawingWidth, drawingHeight); CGContextRef pdfContext = CGPDFContextCreate(dataConsumer, &mediaBox, NULL); UIGraphicsPushContext(pdfContext); CGContextBeginPage(pdfContext, &mediaBox); CGContextDrawPDFPage(pdfcontext, pdfPage); CGContextEndPage(pdfContext); CGPDFContextClose(pdfContext); UIGraphicsPopContext(); CGContextRelease(pdfContext); CGDataConsumerRelease(dataConsumer); // Mail part MFMailComposeViewController *mailViewController = [[MFMailComposeViewController alloc] init]; mailViewController.mailComposeDelegate = self; NSString *mime=@"application/pdf"; [mailViewController setSubject:@"Subject"]; [mailViewController setMessageBody:@"Message Body" isHTML:NO]; [mailViewController addAttachmentData:[pdfData copy] mimeType:mime fileName:@"page.pdf"]; [self presentModalViewController:mailViewController animated:YES];