2016-07-04 18 views
5

Próbuję dowiedzieć się, jak zapisać WebView do pliku PDF i całkowicie utknąć, czy naprawdę będzie wdzięczny za pomoc?Zapisywanie WebView do formatu PDF zwraca pusty obraz?

Robię to w Cocoa & Swift na OSX, oto mój kod do tej pory:

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

} 

Jest to dość proste, co robię jest stworzenie WebView i pisanie podstawowe treści HTML do niej co czyni to:

View

a potem zdania i zapisuje je do pliku PDF, ale to wychodzi puste:

PDF

Próbowałem pobrać zawartość z webView i View, ale bez radości.

Znalazłem podobny problem tutaj How to take a screenshot when a webview finished rending dotyczące zapisywania obrazu WWW na obrazie, ale jak dotąd nie ma szczęścia z rozwiązaniem OSX.

Czy może to mieć coś wspólnego z wymiarami dokumentu? lub czy zawartość znajduje się w wydziale? może jeśli przechwycisz widok, nie możesz przechwycić SubView?

Wszelkie pomysły?

+0

Witam. Jeśli znalazłeś rozwiązanie swojego problemu, * opublikuj jako odpowiedź *, nie dodawaj go do swojego pytania. Proszę również nie dodawać "rozwiązanych" do tytułu. Umieszczenie odpowiedzi i oznaczenie jej jako zaakceptowanej jest sposobem na "rozwiązanie" pytania. Dzięki. – Moritz

+0

Przepraszam, zrobię. –

+0

Nie ma problemu - cofnąłem już twoją edycję, musisz tylko opublikować swoją odpowiedź. Dzięki! :) – Moritz

Odpowiedz

1

Więc trochę zorientowałem się, jak go rozwiązać, okazuje się, że nie możesz (zwłaszcza na OSX) uzyskać dostępu i wydrukować widok WWW z WKWebView.

Musisz użyć WebView, a NIE WKWebView (zacząłem od WKWebView, ponieważ kilka artykułów, które przeczytałem, mówiło, że używają tego).

Obiekt WebView jest prawie podobny do obiektu WKWebView, co jest zabawne jak diabli :-)

Ale to daje dostęp do .mainFrame & .frameView której trzeba wydrukować jego zawartość.

Oto mój kod:

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) 

Po to renderowane Potem dodano 1 sekundowe opóźnienie po prostu upewnić się, że treść wydanego przed wydrukować go,

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

Tutaj jestem druk to i zapisanie go jako pliku PDF, więc jestem podwójnie pewien, że działa w każdych okolicznościach.

Jestem pewien, że można go poprawić, nienawidzę hackowania opóźnień, powinienem go zastąpić jakimś callbackiem lub delegatem do uruchomienia po pełnym załadowaniu zawartości.