最近有一个将网页转成 pdf 需求,分享一下思路!
参考资料
http://www.cuelogic.com/blog/convert-html-to-pdf-in-ios/
https://stackoverflow.com/questions/6316192/convert-html-file-to-pdf-document-in-ios-using-cocoa-touch
首先我们使用 UIWebView来显示 html 页面
UIWebView *webview = [[UIWebView alloc] initWithFrame:self.view.frame];
webview.delegate = self;
webview.scrollView.pagingEnabled = YES;
[self.view addSubview:webview];
// 如果有中文编码
if (self.html == nil) {
// 传入 url
if ([[self.url absoluteString] hasSuffix:@"txt"]) {
// txt中文自定义一个编码方式
NSData *txtData = [NSData dataWithContentsOfURL:self.url];
[self.webview loadData:txtData
MIMEType:@"text/txt"
textEncodingName:@"GBK"
baseURL:nil];
} else {
[self.webview loadRequest:[NSURLRequest requestWithURL:self.url]];
}
} else {
// 直接传入 html NSString 对象
[self.webview loadHTMLString:self.html baseURL:self.url];
}
显示完 html 文件后我们为 UIPrintPageRenderer 添加以下方法,将 UIWebView 渲染成 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;
}
当然我们需要设置 UIPrintPageRenderer 的一些属性才能正确获取数据。printableRect指定打印的大小,paperRect指定打印纸的大小,addPrintFormatter:startingAtPageAtIndex: 指定要渲染的对象,以及从第几页开始渲染
UIPrintPageRenderer *render = [[UIPrintPageRenderer alloc] init];
[render addPrintFormatter:webView.viewPrintFormatter startingAtPageAtIndex:0];
// 需要打印的frame
CGRect printableRect = CGRectMake(self.pageMargins.left,
self.pageMargins.top,
self.pageSize.width - self.pageMargins.left - self.pageMargins.right,
self.pageSize.height - self.pageMargins.top - self.pageMargins.bottom);
// 打印纸的 frame
CGRect paperRect = CGRectMake(0, 0, self.pageSize.width, self.pageSize.height);
[render setValue:[NSValue valueWithCGRect:paperRect] forKey:@"paperRect"];
[render setValue:[NSValue valueWithCGRect:printableRect] forKey:@"printableRect"];
设置完UIPrintPageRenderer的属性后, 我们就可以使用UIPrintPageRenderer对象 的 printToPDF 方法获取到渲染出来的 NSData 数据,写入 pdf 文件
self.pdfData = [render printToPDF];
if (self.pdfPath) {
[self.pdfData writeToFile:self.pdfPath
atomically: YES];
}
网友评论