2016-08-24 5 views
0

UIWebView에서 PDF를 만드는 데 문제가 있습니다.UIWebView에서 PDF 작성

 let render = UIPrintPageRenderer();  
     /* 1. pdf from webView */ 
     render.addPrintFormatter(webView.viewPrintFormatter(), startingAtPageAtIndex: 0); 

     // 2. Assign paperRect and printableRect 

     let page = CGRect(x: 0, y: 0, width: 595.2, height: 841.8) // A4, 72 dpi */ 

     let printable = CGRectInset(page, 0, 0) 

     render.setValue(NSValue(CGRect: page), forKey: "paperRect") 
     render.setValue(NSValue(CGRect: printable), forKey: "printableRect") 

     // 3. Create PDF context and draw 

     let pdfData = NSMutableData() 
     UIGraphicsBeginPDFContextToData(pdfData, CGRectZero, nil) 


     for i in 1...render.numberOfPages() { 

      UIGraphicsBeginPDFPage(); 
      let bounds = UIGraphicsGetPDFContextBounds() 
      render.drawPageAtIndex(i - 1, inRect: bounds) 
     } 

     UIGraphicsEndPDFContext(); 

     // 4. Save PDF file 
     print("open \(path)"); 
     pdfData.writeToFile(path, atomically: true); 

모든 것이 정상적으로 작동하지만 HTML 내부의 배경 이미지를 사용하면 사라집니다. 누구 잘못 알아요?

당신이 당신의 HTML 코드 작성해야합니다 모든

답변

1

첫째 : 당신이 당신의 ViewController 클래스를 만들 필요가

let webView = UIWebView(frame: self.view.bounds) 
self.view.addSubview(webView) 
webView.delegate = self 
webView.loadHTMLString(html, baseURL: nil) 
// webView.isUserInteractionEnabled = true 

aftr : 다음 사용하여 웹보기를 인스턴스화하는 데 필요한 것보다

var html = "<html><head><meta charset='UTF-8'></head><body>hello from html </body></html>" 

UIWebViewDelegate을 구현하고 func webViewDidFinishLoad(_ webView: UIWebView) 메서드를 구현하고 마지막으로 다음 코드를 webViewDidFinishLoad 메서드에 추가합니다.

func webViewDidFinishLoad(_ webView: UIWebView) { 

    let render = UIPrintPageRenderer() 
    render.addPrintFormatter(webView.viewPrintFormatter(), startingAtPageAt: 0); 


    let page = CGRect(x: 0, y: 10, width: webView.frame.size.width, height: webView.frame.size.height) // take the size of the webView 
    let printable = page.insetBy(dx: 0, dy: 0) 
    render.setValue(NSValue(cgRect: page), forKey: "paperRect") 
    render.setValue(NSValue(cgRect: printable), forKey: "printableRect") 

    // 4. Create PDF context and draw 
    let pdfData = NSMutableData() 
    UIGraphicsBeginPDFContextToData(pdfData, CGRect.zero, nil) 
    for i in 1...render.numberOfPages { 

     UIGraphicsBeginPDFPage(); 
     let bounds = UIGraphicsGetPDFContextBounds() 
     render.drawPage(at: i - 1, in: bounds) 
    } 
    UIGraphicsEndPDFContext(); 
    let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] 

    print(documentsPath) 

    pdfData.write(toFile: "\(documentsPath)/pdfName.pdf", atomically: true) 

    self.pdfPath = "\(documentsPath)/pdfName.pdf" 
    self.pdfTitle = "pdfName" 
    self.performSegue(withIdentifier: "showPDFSegue", sender: nil) 
    webView.removeFromSuperview() 
    self.loadingScreenViewController.view.removeFromSuperview() 
} 

로직을 다시 시작하려면 webView에서 pdf를 생성하려면 HTML 코드를 준비하고 WebView를 만들고 webView 내부에 html 코드를 삽입해야하며 webView didFinishLoading에서 html 코드를 동일한 너비와 높이의 webView.