2016-07-04 15 views
5

Ich versuche herauszufinden, wie man ein WebView in ein PDF speichern und völlig stecken bleiben, würde wirklich etwas Hilfe zu schätzen wissen?Das Speichern von WebView in PDF gibt ein leeres Bild zurück?

ich dies auf OSX in Cocoa & Swift mache, hier ist mein Code so weit:

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

} 

Es ist ziemlich einfach, was ich tue ist ein WebView zu schaffen und einige grundlegende HTML-Inhalte zu schreiben das macht diese:

View

und nimmt dann die Ansicht und speichert sie in einer PDF-Datei, aber das kommt leer:

PDF

Ich habe versucht, den Inhalt aus dem WebView und View, aber keine Freude zu greifen.

Ich habe ein ähnliches Problem hier How to take a screenshot when a webview finished rending bezüglich des Speicherns des Webview zu einem Bild gefunden, aber bis jetzt kein Glück mit einer OSX Lösung.

Könnte es etwas mit den Dokumentdimensionen zu tun haben? oder dass der Inhalt in einer Unteransicht ist? vielleicht, wenn Sie die Ansicht erfassen können Sie die SubView nicht erfassen?

Irgendwelche Ideen?

+0

Hallo. Wenn Sie eine Lösung für Ihr Problem gefunden haben, * posten Sie es als Antwort *, fügen Sie es nicht zu Ihrer Frage hinzu. Bitte fügen Sie dem Titel auch nicht "gelöst" hinzu. Eine Antwort zu posten und als akzeptiert zu markieren, ist der Weg, eine Frage zu "lösen". Vielen Dank. – Moritz

+0

Entschuldigung, werde ich tun. –

+0

Kein Problem - Ich habe Ihre Bearbeitung bereits rückgängig gemacht, Sie müssen Ihre Antwort jetzt posten. Vielen Dank! :) – Moritz

Antwort

1

Also habe ich herausgefunden, wie man es löst, es stellt sich heraus, dass Sie nicht (vor allem unter OSX) auf eine Webansicht von einem WKWebView zugreifen und drucken können.

Sie müssen ein WebView und kein WKWebView verwenden (ich habe ursprünglich mit WKWebView gestartet, weil einige der Artikel, die ich gelesen habe, das verwenden).

Ein Objekt WebView ist ziemlich ähnlich wie ein WKWebView Objekt, das :-)

höllisch Spaß ist, aber es gibt Ihnen & .frameView .mainFrame zugreifen, die Sie es Inhalt drucken müssen.

Hier ist mein Code:

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) 

Einmal habe ich dann eine Verzögerung von 1 Sekunde hinzugefügt nur sicher, bevor ich es,

drucken gemacht hat der Inhalt zu machen gemacht hat
// 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() 
    } 

Hier Drucken Ich bin es und speichern es als PDF, nur so bin ich mir sicher, dass es unter allen Umständen funktioniert.

Ich bin mir sicher, dass es verbessert werden kann, ich hasse die Verzögerung Hack, sollte das mit einer Art von Callback oder Delegate ersetzen, um zu starten, wenn der Inhalt vollständig geladen ist.