iOS html 转 pdf 实现思路

iOS html 转 pdf 实现思路_第1张图片
2017-10-11 19_15_00ss.gif
最近有一个将网页转成 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];
    }
跪求Star

你可能感兴趣的:(iOS html 转 pdf 实现思路)