Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Load Local PDF in UIWebView in Swift

Tags:

So I am currently trying to display a local PDF I have in UIWebview and this is the code I'm using:

@IBOutlet weak var webView:UIWebView! override func viewDidLoad() {     super.viewDidLoad()      var pdfLoc = NSURL(fileURLWithPath:NSBundle.mainBundle().pathForResource("Sample", ofType:"pdf")!)  var request = NSURLRequest(URL: pdfLoc); self.webView.loadRequest(request); } 

The code will successfully build, but when I run the app, it will crash with the error: Thread 1: EXC_BAD_INSTRUCTION(code=EXC-I386_INVOP,subcode=0x0)

I have found a few tutorials on how to do this, but they are all very outdated or in Objective-C.

like image 886
dannysandler Avatar asked Apr 16 '15 17:04

dannysandler


People also ask

What is WebView in Swift?

Basic Swift Code for iOS Apps As an iOS developer, you will come across multiple scenarios where you have to display something in web, for that we use WebView. As per Apple, − It is an object that displays interactive web content, such as for an in-app browser.


1 Answers

Here you go:

if let pdf = NSBundle.mainBundle().URLForResource("myPDF", withExtension: "pdf", subdirectory: nil, localization: nil)  {             let req = NSURLRequest(URL: pdf)             let webView = UIWebView(frame: CGRectMake(20,20,self.view.frame.size.width-40,self.view.frame.size.height-40))             webView.loadRequest(req)             self.view.addSubview(webView)         } 

Edit

The alternative is via NSData:

if let pdfURL = NSBundle.mainBundle().URLForResource("myPDF", withExtension: "pdf", subdirectory: nil, localization: nil),data = NSData(contentsOfURL: pdfURL), baseURL = pdfURL.URLByDeletingLastPathComponent  {     let webView = UIWebView(frame: CGRectMake(20,20,self.view.frame.size.width-40,self.view.frame.size.height-40))     webView.loadData(data, MIMEType: "application/pdf", textEncodingName:"", baseURL: baseURL)     self.view.addSubview(webView) } 

Apple make a point of advising you to not use .loadRequest for local HTML files, while not clearly extending this to other data types. So I've provided the NSData route above. If you wish to specify a textEncodingName it can be "utf-8", "utf-16", etc.

Edit: Swift 3

Here's a Swift 3 version of the code using, as Apple advise, WKWebView in place of UIWebView.

import UIKit import WebKit  class ViewController: UIViewController {     override func viewDidLoad() {         super.viewDidLoad()         // Do any additional setup after loading the view, typically from a nib.          if let pdfURL = Bundle.main.url(forResource: "myPDF", withExtension: "pdf", subdirectory: nil, localization: nil)  {             do {                 let data = try Data(contentsOf: pdfURL)                 let webView = WKWebView(frame: CGRect(x:20,y:20,width:view.frame.size.width-40, height:view.frame.size.height-40))                 webView.load(data, mimeType: "application/pdf", characterEncodingName:"", baseURL: pdfURL.deletingLastPathComponent())                view.addSubview(webView)              }             catch {                 // catch errors here             }          }     }  } 

Accessing the PDF from Asset.xcassets (Swift 4)

if let asset = NSDataAsset(name: "myPDF") {             let url = Bundle.main.bundleURL             let webView = WKWebView(frame: CGRect(x:20,y:20,width:view.frame.size.width-40, height:view.frame.size.height-40))             webView.load(asset.data, mimeType: "application/pdf", characterEncodingName:"", baseURL:url)             view.addSubview(webView)        } 
like image 150
sketchyTech Avatar answered Oct 03 '22 16:10

sketchyTech