Create PDF from UIWebView



从UIWebView创建PDF时遇到问题。

        let render = UIPrintPageRenderer();      
        /* 1. pdf from webView */
        render.addPrintFormatter(webView.viewPrintFormatter(), startingAtPageAtIndex: 0);
        // 2. Assign paperRect and printableRect
        let page = CGRect(x: 0, y: 0, width: 595.2, height: 841.8) // A4, 72 dpi */
        let printable = CGRectInset(page, 0, 0)
        render.setValue(NSValue(CGRect: page), forKey: "paperRect")
        render.setValue(NSValue(CGRect: printable), forKey: "printableRect")
        // 3. Create PDF context and draw
        let pdfData = NSMutableData()
        UIGraphicsBeginPDFContextToData(pdfData, CGRectZero, nil)

        for i in 1...render.numberOfPages() {
            UIGraphicsBeginPDFPage();
            let bounds = UIGraphicsGetPDFContextBounds()
            render.drawPageAtIndex(i - 1, inRect: bounds)
        }
        UIGraphicsEndPDFContext();
        // 4. Save PDF file
        print("open (path)");
        pdfData.writeToFile(path, atomically: true);

一切都很好,但如果我在HTML中使用背景图像,它将消失。有人知道怎么了吗?

首先你需要创建你的html代码:

var html = "<html><head><meta charset='UTF-8'></head><body>hello from html </body></html>"

比你需要实例化你的web视图使用以下:

let webView = UIWebView(frame: self.view.bounds)
self.view.addSubview(webView)
webView.delegate = self
webView.loadHTMLString(html, baseURL: nil)
// webView.isUserInteractionEnabled = true

之后,你需要让你的ViewController类实现UIWebViewDelegate并实现func webViewDidFinishLoad(_ webView: UIWebView)方法最后在webViewDidFinishLoad方法

中添加以下代码
func webViewDidFinishLoad(_ webView: UIWebView) {
    let render = UIPrintPageRenderer()
    render.addPrintFormatter(webView.viewPrintFormatter(), startingAtPageAt: 0);

    let page = CGRect(x: 0, y: 10, width: webView.frame.size.width, height: webView.frame.size.height) // take the size of the webView
    let printable = page.insetBy(dx: 0, dy: 0)
    render.setValue(NSValue(cgRect: page), forKey: "paperRect")
    render.setValue(NSValue(cgRect: printable), forKey: "printableRect")
    // 4. Create PDF context and draw
    let pdfData = NSMutableData()
    UIGraphicsBeginPDFContextToData(pdfData, CGRect.zero, nil)
    for i in 1...render.numberOfPages {
        UIGraphicsBeginPDFPage();
        let bounds = UIGraphicsGetPDFContextBounds()
        render.drawPage(at: i - 1, in: bounds)
    }
    UIGraphicsEndPDFContext();
    let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
    print(documentsPath)
    pdfData.write(toFile: "(documentsPath)/pdfName.pdf", atomically: true)
    self.pdfPath = "(documentsPath)/pdfName.pdf"
    self.pdfTitle = "pdfName"
    self.performSegue(withIdentifier: "showPDFSegue", sender: nil)
    webView.removeFromSuperview()
    self.loadingScreenViewController.view.removeFromSuperview()
}

那么恢复逻辑:要从webView生成pdf,你需要准备html代码,创建webView并在webView中注入html代码,并在webView didFinishLoading中使用与webView相同的宽度和高度打印pdf中的html内容。

最新更新