Swift:使用 WKWebView 的 createPdf 创建 pdf

2023-11-29

Edit:

在找到问题 2 的解决方案后(并且给人的印象是问题 1 没有简单的、开箱即用的解决方案),我决定关闭这个问题,而专门针对分页问题创建另一个问题。


我有两个问题WKWebViews createPDF(configuration:completionHandler:):

  1. 没有分页(我知道这个问题已经被其他人提出,而且似乎没有自动解决方案 - 我想分页将是一个手动工作......)
  2. 我加载的 html 似乎用新行替换空格

下面的代码...

import SwiftUI
import WebKit

@main
struct PdfCreatorSOApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

struct ContentView: View {
    var body: some View {
        Button("Create PDF") {
            savePdf()
        }
            .padding()
    }
    
    private func savePdf() {
        if let downloadDir = FileManager.default.urls(for: .downloadsDirectory, in: .userDomainMask).first {
            let savePath = downloadDir.appendingPathComponent("swiftPdf").appendingPathExtension("pdf")
            
            let webViewConfiguration = WKWebViewConfiguration()//do I need to set s.th. here?
            
            let webView = WKWebView(frame: .zero, configuration: webViewConfiguration)
            
            let pdfConfiguration = WKPDFConfiguration()
            pdfConfiguration.rect = CGRect(x: 0, y: 0, width: 595.28, height: 841.89)
            
            webView.loadHTMLString(html, baseURL: nil)
            
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
                webView.createPDF(configuration: pdfConfiguration) { result in
                    switch result {
                    
                    case .success(let data):
                        do {
                            try data.write(to: savePath)
                            print("Successfully created and saved pdf…")
                        } catch let error {
                            print("Could not _save_ pdf: \(error)")
                        }
                    case .failure(let error):
                        print("Could not create pdf: \(error)")
                    }
                }
            }
        }
    }
}

let html = """
<html>
<body>
<h1>Some Title</h1>
<p>
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Tellus integer feugiat scelerisque varius. Nunc faucibus a pellentesque sit. Sagittis vitae et leo duis. Posuere lorem ipsum dolor sit amet consectetur. Porta non pulvinar neque laoreet suspendisse interdum. Dui faucibus in ornare quam viverra orci. Nulla facilisi etiam dignissim diam quis enim. Elementum pulvinar etiam non quam lacus suspendisse. Donec enim diam vulputate ut pharetra sit amet aliquam. Nunc mattis enim ut tellus elementum sagittis vitae. Vitae semper quis lectus nulla at volutpat diam ut. Enim eu turpis egestas pretium aenean pharetra magna ac.

    Cras sed felis eget velit aliquet sagittis id consectetur purus. Urna nunc id cursus metus aliquam eleifend mi. Interdum varius sit amet mattis vulputate enim nulla aliquet. At risus viverra adipiscing at in tellus integer feugiat. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Interdum velit euismod in pellentesque massa placerat duis ultricies. Amet facilisis magna etiam tempor orci eu. Proin fermentum leo vel orci porta non pulvinar neque. Et magnis dis parturient montes nascetur ridiculus mus mauris vitae. Sagittis orci a scelerisque purus.
</p>
</body>
</html>
"""

…produces this output: enter image description here

我的身上是否缺少了什么WKWebViewConfiguration()?


EDITED:

这只是一个猜测,但我不认为它用换行符替换空格。它尽可能窄地包装它认为狭窄的网页(每个单词)。

尝试调整 webView 的框架大小,看看是否有帮助?

let webView = WKWebView(frame: .zero,... // per comments this didn't help.

或者尝试通过CSS调整网页的大小:

<p> <div **style='width: 600'**> lorem.... </div> // per comments this did
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift:使用 WKWebView 的 createPdf 创建 pdf 的相关文章

随机推荐