2016-07-04 3 views
5

WebView를 PDF로 저장하고 완전히 멈추는 방법을 알아 내려고 노력 중입니다. 도움이 될만한 점이 있습니까? 제가 OSX에 코코아 & 스위프트이하고 있어요WebView를 PDF에 저장하면 빈 이미지가 반환됩니까?

, 여기에 지금까지 내 코드입니다 :

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

} 

그것의 아주 간단합니다, 나는 웹보기를 만들고 여기에 몇 가지 기본적인 HTML 콘텐츠를 쓰고 뭘하는지 이는이 렌더링 :

View

을 그리고보기를 취하고 PDF 파일에 저장하지만 밖으로 빈 제공 :

PDF

WebView 및 View에서 내용을 가져 왔지만 기쁨은 없었습니다.

여기에 비슷한 문제가 발견되었습니다. How to take a screenshot when a webview finished rending 이미지에 webview를 저장하는 것에 관해서는 알지만, OSX 솔루션에는 별 도움이되지 않습니다.

문서 크기와 관련이있을 수 있습니까? 또는 내용이 하위보기에 있습니까? SubView를 캡처 할 수없는보기를 캡처 한 경우 일 수 있습니까?

아이디어가 있으십니까?

+0

안녕하세요. 문제에 대한 해결책을 찾은 경우 * 답변으로 게시하십시오. * 질문에 추가하지 마십시오. 또한 제목에 "해결"을 추가하지 마십시오. 답변을 게시하고이를 승인 한 것으로 표시하는 것은 질문을 "해결하는"방법입니다. 감사. – Moritz

+0

죄송합니다. –

+0

문제 없습니다. 이미 수정했기 때문에 지금 답변을 게시하면됩니다. 감사! :) – Moritz

답변

1

그래서 그것을 해결하는 방법을 알아 냈습니다. OSX에서 액세스 할 수없고 WKWebView에서 웹보기를 인쇄 할 수없는 것으로 나타났습니다.

WKWebView가 아니라 WebView를 사용해야합니다 (원래 WKWebView로 시작한 것은 제가 읽은 기사 중 일부가이를 사용하기 때문입니다).

웹뷰 객체는 거의 비슷한

:-) 지옥 같은 재미있는 WKWebView 객체에있다 그러나 당신이 그것을 콘텐츠의 인쇄해야합니다 & .frameView을 .mainFrame에 액세스 할 수 있습니다.

는 그때 그냥 그것을 인쇄하기 전에 내용이 렌더링했다 확인하기 위해 1 초 지연을 추가 렌더링 일단
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) 

, 여기

// 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로 저장하면 모든 상황에서 작동한다는 것을 확신합니다.

나는 그것을 향상시킬 수 있다고 확신하고, 지연 해킹이 싫다. 콘텐츠가 완전히로드되었을 때 어떤 종류의 콜백 또는 델리게이트로 교체해야한다.