使用iOS 4.2中的新打印内容生成PDF

时间:2010-12-04 23:33:01

标签: iphone pdf-generation ios-4.2 airprint

从历史上看,我的应用程序已将确认生成为纯HTML,并将该HTML传递给普通的MFMailComposeViewController,以便通过电子邮件发送给客户。我想尝试利用iOS 4.2中的新打印类将HTML呈现为PDF,然后将其作为附件发送。

我尝试了以下内容:

NSString *html = /* generate my HTML here */
NSMutableData *pdfData = [NSMutableData data];
UIMarkupTextPrintFormatter *fmt = [[UIMarkupTextPrintFormatter alloc] 
                                   initWithMarkupText:html];

// Render the html into a PDF
UIGraphicsBeginPDFContextToData( pdfData, CGRectZero, nil );

for (NSInteger i=0; i < [fmt pageCount]; i++)
{
    UIGraphicsBeginPDFPage();
    CGRect bounds = UIGraphicsGetPDFContextBounds();
    [fmt drawInRect:bounds forPageAtIndex:i];
}

UIGraphicsEndPDFContext();

问题是[fmt pageCount]总是返回零,因此实际的页面内容都不会呈现到PDF NSData中。

有没有人在实际打印作业之外使用UIMarkupTextPrintFormatter将HTML转换为PDF?任何帮助非常感谢。

3 个答案:

答案 0 :(得分:4)

一旦系统接管并启动打印作业,似乎打印格式化程序(包括UIMarkupTextPrintFormatter)在打印之前才会实际呈现/绘制。 (Apple的文档说drawRect:在打印前调用,以便为打印作业提供内容。)

有人请证明我错了,因为我需要做同样的事情:)

答案 1 :(得分:4)

我在其中一个应用中执行此操作。请参阅我对类似问题的回答:

Is there any way to generate PDF file from a XML/HTML template in iOs

答案 2 :(得分:1)

我做了一个发现:如果您愿意或允许使用私有API,这是可能的。 (例如,在企业应用程序中。)

方法: 像往常一样创建格式化程序;将其安装在UIPrintPageRenderer中。

正确设置渲染器的私有属性paperRectprintableRect

numberOfPages现在有效!

像普通一样设置pdf cgcontext,并使用渲染器的drawPageAtIndex:inRect:方法绘制页面。圣牛,它有效。

强制性抗议:是的,我知道Apple不希望您提交调用(例如)[ppr setValue:[NSValue valueWithCGRect:page] forKey:@"paperRect"];的应用并将其反弹。