斯威夫特 4、Xcode 9.2、iOS 11
我生成了一个 HTML 字符串,它代表一堆数据,WKWebView
如下所示:
//I include this so I can reference some images
let bundle = Bundle.main.bundlePath
//Load the HTML
webView.loadHTMLString(htmlString, baseURL: URL(fileURLWithPath: bundle))
在我的WKWebView
didFinish navigation
代表内部,我像这样构建 PDF:
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
// - 1 - Grab the webView's print context
let fmt = webView.viewPrintFormatter()
fmt.perPageContentInsets = UIEdgeInsetsMake(10, 10, 10, 10) //Page margins
// - 2 - Assign print formatter to UIPrintPageRenderer
let render = UIPrintPageRenderer()
render.addPrintFormatter(fmt, startingAtPageAt: 0)
// - 3 - Assign paperRect and printableRect
let page = CGRect(x: 0, y: 0, width: 841.85, height: 595.22) //Page size
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, page, nil) //Set page size to landscape
for i in 0...render.numberOfPages {
UIGraphicsBeginPDFPage()
render.drawPage(at: i, in: UIGraphicsGetPDFContextBounds())
}
UIGraphicsEndPDFContext()
// - 5 - Save the PDF file
let pdfURL = documentsURL.appendingPathComponent("PDF")
let path = pdfURL.appendingPathComponent("MyFile.pdf").path
pdfData.write(toFile: path, atomically: true)
}
这可以很好地处理大约 30 页的 PDF。但是,当我给它一个非常大的网页(40 多页)时,我只会得到一个空白 PDF,最后只有一个页面(没有渲染)。我的怀疑是PDF 渲染器崩溃或内存不足,但日志中没有任何迹象。
当htmlString
我登录时,传入总是完成。只是打印失败。
有没有更有效或更可靠的方法来实现这一目标?或者有什么方法可以更好地解决正在发生的事情?我会很感激一些帮助。:)