在WKWebView中打印HTML字符串无法打印大型PDF

时间:2018-01-25 19:54:31

标签: swift wkwebview uigraphicscontext uiprintpagerenderer

Swift 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总是完成的。只是打印失败。

是否有更有效或更可靠的方法来解决这个问题?或者某种方式来更好地解决正在发生的事情?我非常感谢你的帮助。 :)

0 个答案:

没有答案