10

从历史上看,我的应用程序以纯 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?非常感谢任何帮助。

4

3 回答 3

4

我在我的一个应用程序中执行此操作。在此处查看我对类似问题的回答:

有没有办法从 iOs 中的 XML/HTML 模板生成 PDF 文件

于 2012-04-28T03:35:34.510 回答
4

似乎打印格式化程序(包括 UIMarkupTextPrintFormatter)直到打印之前才真正呈现/绘制,一旦系统接管并开始打印作业。(Apple 的文档说 drawRect: 在打印之前调用以提供打印作业的内容。)

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

于 2010-12-08T02:15:00.800 回答
1

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

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

paperRect适当地设置渲染器的私有属性printableRect

numberOfPages现在工作!

像平常一样设置您的pdf cgcontext,并使用渲染器的drawPageAtIndex:inRect:方法绘制页面。圣牛,它奏效了。

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

于 2011-11-15T18:08:39.737 回答