swift - 从 UIWebView 创建 PDF

标签 swift pdf uiwebview uiprintpagerenderer

我在从 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>"

比您需要使用以下实例化您的 WebView :

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 并将 html 代码注入(inject) webView 并在 webView didFinishLoading 中使用与 webView 相同的宽度和高度打印 pdf 中的 html 内容。

关于swift - 从 UIWebView 创建 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39120144/

相关文章:

pdf - 在 Windows 上将 PDF 转换为 PCL5?

objective-c - UIWebView 的后退/前进按钮 - canGoBack 不适用于 ajax 网站

ios - 使用 VideoToolbox API (kVTVideoDecoderBadDataErr) 解码 H264 流

ios - 将图像转换为 CGImage 时丢失图像方向

pdf - 在 Hadoop Map Reduce 中解析 PDF 文件

c# - ITextSharp HTML 到 PDF 转换 CSS 图像在转换后不显示

ios - 以多页形式保存webview为pdf

javascript - 如何在 UIWebview 中访问 javascript 函数变量

ios - 每隔一段时间将内容从 Parse 推送到 iOS 应用程序

ios - 如何将阴影添加到导航栏而不是默认边框