WKWebView生成PDF

一、简介

在使用 WKWebView 将网页内容保存为 PDF 文件时,您可以设置打印页面的大小和可打印区域,以确保生成的 PDF 文件符合您的需求。在 WKWebView 中,您可以使用 UIPrintPageRenderer 类的 paperRect 和 printableRect 属性来设置页面的大小和可打印区域。

二、示例代码

下面是一个示例代码,演示如何使用 WKWebView、UIPrintPageRenderer、paperRect 和 printableRect 来保存网页内容为 PDF 文件,并设置页面大小和可打印区域:

import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate {

    var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // 创建 WKWebView
        webView = WKWebView(frame: view.bounds)
        webView.navigationDelegate = self
        view.addSubview(webView)

        // 加载网页
        if let url = URL(string: "https://www.example.com") {
            let request = URLRequest(url: url)
            webView.load(request)
        }
    }

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        // 网页加载完成后保存为 PDF
        webView.createPDF { pdfData in
            guard let pdfData = pdfData else {
                print("Failed to create PDF data")
                return
            }

            // 保存 PDF 数据到本地文件
            let documentsPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
            let pdfPath = documentsPath.appendingPathComponent("webContent.pdf")

            do {
                try pdfData.write(to: pdfPath)
                print("PDF file saved at: \(pdfPath)")
            } catch {
                print("Error saving PDF file: \(error.localizedDescription)")
            }
        }
    }
}

extension WKWebView {
    func createPDF(completion: @escaping (Data?) -> Void) {
        let printPageRenderer = UIPrintPageRenderer()
        printPageRenderer.addPrintFormatter(self.viewPrintFormatter(), startingAtPageAt: 0)

        let paperRect = CGRect(x: 0, y: 0, width: 595.2, height: 841.8) // A4 paper size in points
        let printableRect = paperRect.insetBy(dx: 0, dy: 0)

        printPageRenderer.setValue(NSValue(cgRect: paperRect), forKey: "paperRect")
        printPageRenderer.setValue(NSValue(cgRect: printableRect), forKey: "printableRect")

        let pdfData = printPageRenderer.generatePDF()
        completion(pdfData)
    }
}

extension UIPrintPageRenderer {
    func generatePDF() -> Data {
        let pdfData = NSMutableData()
        UIGraphicsBeginPDFContextToData(pdfData, self.paperRect, nil)

        self.prepare(forDrawingPages: NSMakeRange(0, self.numberOfPages))

        let bounds = UIGraphicsGetPDFContextBounds()
        for i in 0..<self.numberOfPages {
            UIGraphicsBeginPDFPage()
            self.drawPage(at: i, in: bounds)
        }

        UIGraphicsEndPDFContext()
        return pdfData as Data
    }
}

在上面的代码中,我们扩展了 WKWebView 类,并添加了 createPDF 方法来保存网页内容为 PDF 文件。在 createPDF 方法中,我们创建了一个 UIPrintPageRenderer 实例,并设置了页面的大小和可打印区域。最后,我们使用 generatePDF 方法生成 PDF 数据并返回。

使用 WKWebViewUIPrintPageRendererpaperRectprintableRect 在 iOS 中保存网页内容为自定义大小和可打印区域的 PDF 文件。

相关推荐

  1. WKWebView生成PDF

    2024-04-09 06:08:04       35 阅读
  2. Puppeteer 生成图片 生成 PDF

    2024-04-09 06:08:04       21 阅读
  3. js生成pdf

    2024-04-09 06:08:04       105 阅读
  4. android pdf框架-6,文本生成pdf

    2024-04-09 06:08:04       44 阅读
  5. android pdf框架-5,生成pdf

    2024-04-09 06:08:04       44 阅读
  6. qt绘制生成PDF文件

    2024-04-09 06:08:04       46 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-09 06:08:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-09 06:08:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-09 06:08:04       87 阅读
  4. Python语言-面向对象

    2024-04-09 06:08:04       96 阅读

热门阅读

  1. 算力服务器租用的费用包含哪些方面?

    2024-04-09 06:08:04       31 阅读
  2. python实现假设检验-z检验

    2024-04-09 06:08:04       36 阅读
  3. 国内镜像源拉取Ubuntu,并实现网络配置

    2024-04-09 06:08:04       40 阅读
  4. Python的学习之路

    2024-04-09 06:08:04       39 阅读
  5. RFID详解

    2024-04-09 06:08:04       38 阅读
  6. C语言的数组

    2024-04-09 06:08:04       33 阅读
  7. 速盾:游戏cdn什么意思

    2024-04-09 06:08:04       41 阅读
  8. html实现登录界面

    2024-04-09 06:08:04       34 阅读
  9. 中国联通软件研究院春招3场面试Offer面经

    2024-04-09 06:08:04       90 阅读
  10. PyCharm详细安装教程与高效使用指南

    2024-04-09 06:08:04       41 阅读
  11. 【uniapp小程序-跳转另一个小程序】

    2024-04-09 06:08:04       40 阅读
  12. el-table-column 有两个input怎么校验

    2024-04-09 06:08:04       40 阅读