2016-07-04 8 views
5

मैं यह पता लगाने की कोशिश कर रहा हूं कि वेबव्यू को पीडीएफ में कैसे सहेजना है और पूरी तरह से अटक गया है, वास्तव में कुछ मदद की सराहना करेंगे?पीडीएफ में वेबव्यू सहेजना रिक्त छवि लौटाता है?

मैं पर 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 सामग्री लिख रहा है जो इस renders:

View

और फिर दृष्टिकोण लेता है और एक पीडीएफ फाइल करने के लिए यह बचाता है, बल्कि यह है कि बाहर खाली आता है:

PDF

मैंने वेब व्यू और व्यू से सामग्री को हथियाने की कोशिश की है लेकिन कोई खुशी नहीं है।

मुझे एक छवि में वेबव्यू सहेजने के संबंध में How to take a screenshot when a webview finished rending जैसी एक ही समस्या मिली है, लेकिन अब तक ओएसएक्स समाधान के साथ कोई भाग्य नहीं है।

क्या यह दस्तावेज़ आयामों के साथ कुछ करने के लिए हो सकता है? या सामग्री एक सबूत में है? शायद यदि आप दृश्य को कैप्चर करते हैं तो आप सबव्यू को कैप्चर नहीं कर सकते हैं?

कोई विचार?

+0

हैलो। अगर आपको अपनी समस्या का हल मिल गया है, * इसे उत्तर के रूप में पोस्ट करें *, इसे अपने प्रश्न में शामिल न करें। कृपया शीर्षक में "हल" जोड़ें। एक उत्तर पोस्ट करना और इसे स्वीकार करने के रूप में चिह्नित करना एक प्रश्न "हल" करने का तरीका है। धन्यवाद। – Moritz

+0

क्षमा करें, करेंगे। –

+0

कोई समस्या नहीं - मैंने पहले से ही आपके संपादन को वापस कर दिया है, आपको अभी अपना जवाब पोस्ट करना होगा। धन्यवाद! :) – Moritz

उत्तर

1

तो मुझे लगता है कि इसे कैसे हल किया जाए, यह पता चला है कि आप (विशेष रूप से ओएसएक्स पर) एक्सेस नहीं कर सकते हैं और WKWebView से वेबव्यू प्रिंट नहीं कर सकते हैं।

आपको वेबव्यू का उपयोग करना है और WKWebView नहीं (मैं मूल रूप से WKWebView के साथ शुरू हुआ था क्योंकि मैंने पढ़े गए कुछ लेखों का उपयोग करने के लिए कहा था)।

वेब दृश्य वस्तु सुंदर एक 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() 
    } 

यहाँ मैं मुद्रण कर रहा हूँ यह और इसे पीडीएफ के रूप में सहेज रहा है, इसलिए मुझे दोगुना यकीन है कि यह सभी परिस्थितियों में काम करता है।

मुझे यकीन है कि इसे बेहतर किया जा सकता है, मुझे देरी हैक से नफरत है, इसे किसी प्रकार के कॉलबैक या प्रतिनिधि को पूरी तरह से लोड होने पर चलाने के लिए प्रतिस्थापित करना चाहिए।

संबंधित मुद्दे