2016-07-04 82 views
5

我想弄清楚如何將WebView保存爲PDF並完全卡住,是否真的會感謝一些幫助?將WebView保存爲PDF將返回空白圖像?

我在可可&斯威夫特在OSX這樣做,這是我到目前爲止的代碼:

import Cocoa 
import WebKit 

class ViewController: NSViewController { 

    override func loadView() { 
     super.loadView() 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     loadHTMLString() 
    } 

    func loadHTMLString() { 
     let webView = WKWebView(frame: self.view.frame) 
     webView.loadHTMLString("<html><body><p>Hello, World!</p></body></html>", baseURL: nil) 
     self.view.addSubview(webView) 
     createPDFFromView(webView, saveToDocumentWithFileName: "test.pdf") 
    } 

    func createPDFFromView(view: NSView, saveToDocumentWithFileName fileName: String) { 
     let pdfData = view.dataWithPDFInsideRect(view.bounds) 
     if let documentDirectories = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first { 
      let documentsFileName = documentDirectories + "/" + fileName 
      debugPrint(documentsFileName) 
      pdfData.writeToFile(documentsFileName, atomically: false) 
     } 
    } 

} 

這很簡單,我在做什麼是創建一個web視圖,寫一些基本的HTML內容,它這使得這樣的:

View

然後採取的觀點,並將其保存爲PDF文件,但散發出來的空白:

PDF

我試過抓取webView和視圖的內容,但沒有喜悅。

我在這裏發現了一個類似的問題How to take a screenshot when a webview finished rending關於將webview保存爲圖片,但到目前爲止沒有運氣與OSX解決方案。

難道這與文檔尺寸有關嗎? 或內容在子視圖中? 也許如果你捕捉視圖,你不能捕獲子視圖?

任何想法?

+0

你好。如果您發現問題的解決方案,*將其作爲答案*發佈,請勿將其添加到您的問題中。也請不要將「解決」添加到標題中。發佈答案並將其標記爲已接受是「解決」問題的方式。謝謝。 – Moritz

+0

對不起,會做。 –

+0

沒問題 - 我已經恢復了你的編輯,你現在只需要發佈你的答案。謝謝! :) – Moritz

回答

1

所以我有點想出如何解決它,事實證明,你不能(特別是在OSX上)訪問和打印從WKWebView的Web視圖。

你必須使用WebView而不是WKWebView(我最初是用WKWebView開始的,因爲我讀過的一些文章說要使用它)。

網頁視圖對象非常類似WKWebView對象,它是地獄:-)

樂趣,但它可以讓你訪問.mainFrame & .frameView,你將需要打印的內容。

這裏是我的代碼:

let webView = WebView(frame: self.view.frame) 
    let localfilePath = NSBundle.mainBundle().URLForResource(fileName, withExtension: "html"); 
    let req = NSURLRequest(URL: localfilePath!); 
    webView.mainFrame.loadRequest(req) 
    self.view.addSubview(webView) 

一旦它的渲染後來我加了1秒的延遲,以確保公正之前,我打印的內容已經呈現,

// needs 1 second delay 
    let delay = 1 * Double(NSEC_PER_SEC) 
    let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)) 
    dispatch_after(time, dispatch_get_main_queue()) { 
     // works! 
     let data = webView.dataWithPDFInsideRect(webView.frame) 
     let doc = PDFDocument.init(data: data) 
     doc.writeToFile("/Users/john/Desktop/test.pdf") 

     // works! 
     let printInfo = NSPrintInfo.sharedPrintInfo() 
     let printOperation = NSPrintOperation(view: webView.mainFrame.frameView, printInfo: printInfo) 
     printOperation.runOperation() 
    } 

這裏我打印並將其保存爲PDF,這樣我就可以確定它在任何情況下都能正常工作。

我相信它可以改進,我討厭延遲黑客,應該用某種回調或委託代替內容完全加載時運行。