如何通过WKWebView的printOperation实现打印、PDF导出及报错处理
解决方案
你遇到的两个报错分别对应两个配置缺陷:
- 直接调用
operation.run()会因为WKPrintingView未绑定到窗口视图层级、未完成初始化触发frame错误 - 禁用打印面板后未指定输出类型为PDF,系统默认查找实体打印机触发无设备报错
完整实现代码
import WebKit import AppKit func exportWebViewToPDF(webView: WKWebView, savePath: URL) { // 1. 配置打印参数,指定输出为PDF let printInfo = NSPrintInfo.shared printInfo.jobType = .saveAsPDF printInfo.pdfURL = savePath // 可选配置:调整纸张大小、边距等 printInfo.paperSize = NSSize(width: 595.28, height: 841.89) // A4尺寸,单位磅 printInfo.topMargin = 20 printInfo.bottomMargin = 20 printInfo.leftMargin = 20 printInfo.rightMargin = 20 // 2. 生成打印操作实例 let operation = webView.printOperation(with: printInfo) // 3. 可选配置:不需要弹出打印面板则设为false,需要用户手动选路径则保留默认true operation.showsPrintPanel = false // 4. 绑定到当前窗口执行,解决frame初始化错误 guard let window = webView.window else { return } operation.runModal(for: window, delegate: nil, didRun: nil, contextInfo: nil) }
注意事项
- 调用导出方法前需确保WKWebView已经完成内容加载,建议在
WKNavigationDelegate的webView(_:didFinish:)代理方法中触发导出 - 调用时WKWebView必须已经被添加到当前窗口的视图层级中,未渲染的离线WebView调用会依然触发frame相关报错
- 该方案仅支持macOS 11.0及以上系统版本
内容的提问来源于stack exchange,提问作者Vicente Garcia
相关产品推荐
相关产品推荐

