从历史上看,我的应用程序已将确认生成为纯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?任何帮助非常感谢。
答案 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中。
正确设置渲染器的私有属性paperRect
和printableRect
。
numberOfPages
现在有效!
像普通一样设置pdf cgcontext,并使用渲染器的drawPageAtIndex:inRect:
方法绘制页面。圣牛,它有效。
强制性抗议:是的,我知道Apple不希望您提交调用(例如)[ppr setValue:[NSValue valueWithCGRect:page] forKey:@"paperRect"];
的应用并将其反弹。