【问题标题】:How to attach CGPDFDocument/CGPDFPage to MFMailComposeViewController如何将 CGPDFDocument/CGPDFPage 附加到 MFMailComposeViewController
【发布时间】:2012-09-28 09:43:13
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ios core-graphics nsdata mfmailcomposeviewcontroller cgpdfdocument


    【解决方案1】:

    CGPDF 主要用于在 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);
    

    【讨论】:

    • outputData 可以声明为 NSMutableData *outputData;
    【解决方案2】:

    这是你要做的:

       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];
    

    【讨论】:

      猜你喜欢
      • 2013-01-20
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多