有什么办法可以从iOs中的XML / HTML模板生成PDF文件
我正在创build一个iPad应用程序,因为我必须使用不同的PDF表单。 我有一些使用Quartz2D通过代码生成PDF文件的方法。 但是我必须通过代码编写完整的表单。 我将来可能需要更新PDF表单,所以我必须再次编写代码。 所以我听说有一个名为iTextSharp的组件.net pdf的创build – 有什么类似的iOS? 这样我可以使用一些XML模板来创buildPDF文件。 请帮忙,谢谢
我在我的应用程序中使用iOS打印子系统和UIMarkupTextPrintFormatter来做到这一点。 诀窍是编写自己的自定义UIPrintPageRenderer,覆盖并从paperRect和numberOfPages返回正确的值。 您将添加您的UIMarkupTextPrintFormatter(s)到您的自定义UIPrintPageRenderer。
然后,在您的自定义UIPrintPageRenderer的上下文中,您将需要类似于此的例程:
- (CGRect) paperRect { if (!_generatingPdf) return [super paperRect]; return UIGraphicsGetPDFContextBounds(); } - (CGRect) printableRect { if (!_generatingPdf) return [super printableRect]; return CGRectInset( self.paperRect, 20, 20 ); } - (NSData*) printToPDF { _generatingPdf = YES; NSMutableData *pdfData = [NSMutableData data]; UIGraphicsBeginPDFContextToData( pdfData, CGRectMake(0, 0, 792, 612), nil ); // letter-size, landscape [self prepareForDrawingPages: NSMakeRange(0, 1)]; CGRect bounds = UIGraphicsGetPDFContextBounds(); for ( int i = 0 ; i < self.numberOfPages ; i++ ) { UIGraphicsBeginPDFPage(); [self drawPageAtIndex: i inRect: bounds]; } UIGraphicsEndPDFContext(); _generatingPdf = NO; // NSString* filename = @"/Volumes/Macintosh HD 2/test.pdf"; // [pdfData writeToFile: filename atomically: YES]; return pdfData; }
@TomSwift:同意他的回答,但我想以更好的方式解释
为了能够从UIWebView
创buildPDF
HTML加载到您的WebView或可能有情况下您的WebView也可以隐藏生成PDF,但过程保持不变
1)添加了用于获取PDF数据的UIPrintPageRenderer
Category
,因为需要使用yourWebView.viewPrintFormatter
@interface UIPrintPageRenderer (PDF) - (NSData*) printToPDF; @end @implementation UIPrintPageRenderer (PDF) - (NSData*) printToPDF { NSMutableData *pdfData = [NSMutableData data]; UIGraphicsBeginPDFContextToData( pdfData, self.paperRect, nil ); [self prepareForDrawingPages: NSMakeRange(0, self.numberOfPages)]; CGRect bounds = UIGraphicsGetPDFContextBounds(); for ( int i = 0 ; i < self.numberOfPages ; i++ ) { UIGraphicsBeginPDFPage(); [self drawPageAtIndex: i inRect: bounds]; } UIGraphicsEndPDFContext(); return pdfData; } @end
2)添加这些定义为A4大小或任何您想要的自定义大小
#define kPaperSizeA4 CGSizeMake(595.2,841.8)
3)处理我们如何创buildPDF
//create print renderer UIPrintPageRenderer *render = [[UIPrintPageRenderer alloc] init]; [render addPrintFormatter:yourWebView.viewPrintFormatter startingAtPageAtIndex:0]; //provide padding ---- increase these values according to your requirement float topPadding = 10.0f; float bottomPadding = 10.0f; float leftPadding = 10.0f; float rightPadding = 10.0f; //provide rect for printing and for actual PDF Rect of page CGRect printableRect = CGRectMake(leftPadding, topPadding, kPaperSizeA4.width-leftPadding-rightPadding, kPaperSizeA4.height-topPadding-bottomPadding); CGRect paperRect = CGRectMake(0, 0, kPaperSizeA4.width, kPaperSizeA4.height); [render setValue:[NSValue valueWithCGRect:paperRect] forKey:@"paperRect"]; [render setValue:[NSValue valueWithCGRect:printableRect] forKey:@"printableRect"]; //category created above is used here NSData *pdfData = [render printToPDF]; //Save PDF to directory for usage if (pdfData) { [pdfData writeToFile:[NSString stringWithFormat:@"%@/tmp.pdf",NSTemporaryDirectory()] atomically: YES]; } else { NSLog(@"PDF couldnot be created"); }