Печать строки HTML в WKWebView не в состоянии печатать большие PDF-файлы

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))

Внутри моего WKWebViewdidFinish 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 ответов

Другие вопросы по тегам