And an html string can be printed using a UIGraphicsBeginPDFContextToData. The disadvantage is that you have to define a fixed page size, but it prints with this solution in an iPad app on the Mac.
- (NSData *)createPDFfromHTML:(NSString *)htmlString
{
UIMarkupTextPrintFormatter *formatter = [[UIMarkupTextPrintFormatter alloc] initWithMarkupText:htmlString];
UIPrintPageRenderer *pageRenderer = [[UIPrintPageRenderer alloc] init];
[pageRenderer addPrintFormatter:formatter startingAtPageAtIndex:0];
NSMutableData *pdfData = [NSMutableData data];
CGRect paperRect = CGRectMake(0, 0, 595.3, 841.9); // A4
CGRect printableRect = CGRectInset(paperRect, 72, 72); // 1-inch margins
UIGraphicsBeginPDFContextToData(pdfData, paperRect, nil);
[pageRenderer setValue:[NSValue valueWithCGRect:paperRect] forKey:@"paperRect"];
[pageRenderer setValue:[NSValue valueWithCGRect:printableRect] forKey:@"printableRect"];
NSInteger pages = [pageRenderer numberOfPages];
for (NSInteger i = 0; i < pages; i++) {
UIGraphicsBeginPDFPageWithInfo(paperRect, nil);
[pageRenderer drawPageAtIndex:i inRect:paperRect];
}
UIGraphicsEndPDFContext();
return pdfData;
}
- (void)printHtmlTest
{
NSString *htmlContent = @"<h1>Hello World</h1>";
NSData * pdfData = [self createPDFfromHTML:htmlContent];
UIPrintInteractionController *printController = [UIPrintInteractionController sharedPrintController];
printController.printingItem = pdfData;
UIViewController *controller = [[UIViewController alloc] init];
[printController presentAnimated:YES completionHandler:^(UIPrintInteractionController *printInteractionController, BOOL completed, NSError *error)
{
//
}];
}