iOS html 转 pdf 实现思路

作者: 一只代码狗 | 来源:发表于2017-08-22 14:28 被阅读85次
    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 实现思路

        本文链接:https://www.haomeiwen.com/subject/rrvhdxtx.html