从WKWebView保存PDF

3
这个问题涉及到macOS,而不是iOS。
请注意,这个问题被报告为重复的这个问题。那个页面上的答案要么与iOS无关,要么使用了已经弃用的WebView作为解决方案,这正是我问题的核心所在。
因此,苹果公司已经弃用了WebView,并推荐使用WKWebView,但我没有看到能够从新视图类型中导出(或打印)PDF的有效解决方案。我已经尝试了以下方法(还有更多)在委托方法webView(_ webView:WKWebView,didFinish navigation:WKNavigation!)中:
    let pdfData = webView.dataWithPDF(inside: webView.frame)
    try? pdfData.write(to: URL(fileURLWithPath: "/filepath/to/test.pdf"))

这导致生成一个空的PDF文件。
2. (该段落没有需要翻译的内容)
webView.takeSnapshot(with: nil) { (image, error) in
    if let error = error {
        print("Error: \(error)")
        return
    }
    guard let image = image else {
        print("No image")
        return
    }
    try? image.tiffRepresentation?.write(to: URL(fileURLWithPath: "/path/to/test.tif"))
}

尽管此图像具有实际内容,但它是一个(巨大的)渲染位图图像,已经丢失了所有文本/字符串数据,并且仅显示屏幕上可见的内容,没有窗口边缘之外的任何内容。

与此同时,在网上有许多示例可用,使用WebView效果良好,如预期所述。我是否应该相信苹果发布了一个半熟的替代品来替换一个已弃用的框架,还是我做错了什么?


1
这个回答是否解决了你的问题?将 WebView 保存为 PDF 返回空白图像? - Willeke
不,该页面上的 macOS 答案使用了已弃用的 WebView,而另一个答案是针对 iOS 的,与 Mac 端的情况不同。 - mredig
Marked 2 可能在使用旧的方法。联系 Brett Terpstra 了解一下他正在做什么可能会很有趣:https://marked2app.com - Paul Solt
我也有同样的想法,并已经联系了他!不幸的是,他现在也没有答案。 :( - mredig
1个回答

5

现在使用 WKWebViewcreatePDF 方法可以实现此功能:https://developer.apple.com/documentation/webkit/wkwebview/3650490-createpdf

这是一个示例:

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
  let config = WKPDFConfiguration()
      
  //Set the page size (this can match the html{} size in your CSS
  config.rect = CGRect(x: 0, y: 0, width: 792, height: 612)
      
  //Render the PDF
  webView.createPDF(configuration: config){ result in
    switch result{
      case .success(let data):
        try! data.write(to: URL(fileURLWithPath: "/path/file.pdf"))
      case .failure(let error):
        print(error)
    }
  }
}

我已经将其在macOS和iOS上运行。希望这能有所帮助。


谢谢你的回答!不幸的是,苹果花了这么长时间来修复这个问题,我甚至忘记了我为什么要问这个问题。 - mredig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接