2016-07-04 5 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) 
     } 
    } 

} 

それは私がやっていることのWebViewを作成し、そこにいくつかの基本的なHTMLコンテンツを書いている、非常に簡単ですこれは、このレンダリング:

View

をそしてビューを取り、PDFファイルに保存しますが、それが出てくる空白:

PDF

私はWebViewとViewからコンテンツを取得しようとしましたが、喜びはありませんでした。

私は同じような問題を発見しました。How to take a screenshot when a webview finished rendingウェブビューをイメージに保存することに関しては、これまでOSXソリューションでは不運でした。

文書の寸法と関係がありますか? 、またはコンテンツがサブビュー内にあることを確認しますか? サブビューをキャプチャできないビューをキャプチャしたとしますか?

アイデア?

+0

こんにちは。問題の解決策を見つけた場合は*回答を*として投稿し、質問に追加しないでください。また、タイトルに「解決済み」を追加しないでください。回答を投稿し、それを受け入れられたものとしてマークすることは、質問を「解決する」方法です。ありがとう。 – Moritz

+0

申し訳ありませんが、行います。 –

+0

問題はありません。私はすでにあなたの編集を元に戻しました。今すぐあなたの答えを投稿するだけです。ありがとう! :) – Moritz

答えて

1

私はそれを解決する方法を理解していました.WKWebViewからアクセスしてWebViewを印刷することはできません(特にOSXでは)。

WKWebViewではなく、WebViewを使用する必要があります(私が最初にWKWebViewを使い始めたのは、読んだ記事の中にはそれを使用するためです)。

のWebViewオブジェクトはかなり似て

:-)地獄のように楽しいですWKWebViewオブジェクト、にある。しかし、それはあなたが、それはコンテンツの印刷する必要があります& .frameViewを.mainFrameにアクセスすることができます。

ここに私のコードです:

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として保存するだけで、私はそれがすべての状況でうまく動作することを二重に確信しています。

私はそれを改善できると確信しています。遅延ハックが嫌いです。コンテンツが完全に読み込まれたときに何らかのコールバックやデリゲートで置き換えるべきです。

関連する問題