3

斯威夫特 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我登录时,传入总是完成。只是打印失败。

有没有更有效或更可靠的方法来实现这一目标?或者有什么方法可以更好地解决正在发生的事情?我会很感激一些帮助。:)

4

0 回答 0