Swift 如何在 UIWebView 中加载本地 PDF
How to Load Local PDF in UIWebView in Swift
所以我目前正在尝试显示我在 UIWebview 中的本地 PDF,这是我正在使用的代码:
@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);
}
代码将成功构建,但是当我 运行 应用程序时,它会因错误而崩溃:
线程 1:EXC_BAD_INSTRUCTION(代码=EXC-I386_INVOP,子代码=0x0)
我找到了一些关于如何执行此操作的教程,但它们都非常过时或在 Objective-C。
给你:
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)
}
编辑
替代方法是通过 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 特别建议您不要对本地 HTML 文件使用 .loadRequest,同时没有明确将其扩展到其他数据类型。所以我在上面提供了 NSData 路由。如果您希望指定一个 textEncodingName,它可以是 "utf-8"、"utf-16" 等。
编辑:Swift 3
这是代码的 Swift 3 版本,按照 Apple 的建议,使用 WKWebView 代替 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
}
}
}
}
从 Asset.xcassets 访问 PDF (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)
}
对于 Xcode 8.1 和 Swift 3.0
将 PDF 文件保存在 xcode 的任意文件夹中。
假设文件名为'Filename.pdf'
if let pdf = Bundle.main.url(forResource: "Filename", withExtension: "pdf", subdirectory: nil, localization: nil) {
let req = NSURLRequest(url: pdf)
webViewPresentation.loadRequest(req as URLRequest)
}
如果您想打开任何 html 个文件,同样适用。
导入 WebKit
在这里您可以在您的应用程序中加载您的 pdf
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
if let pdfURL = Bundle.main.url(forResource: "food-and-drink-menu-trafalgar-tavern", withExtension: "pdf", subdirectory: nil, localization: nil) {
do {
let data = try Data(contentsOf: pdfURL)
let webView = WKWebView(frame: CGRect(x:0,y:NavigationView.frame.size.height,width:view.frame.size.width, height:view.frame.size.height-NavigationView.frame.size.height))
webView.load(data, mimeType: "application/pdf", characterEncodingName:"", baseURL: pdfURL.deletingLastPathComponent())
view.addSubview(webView)
}
catch {
// catch errors here
}
}
}
对于 Swift 3 使用此代码:
let url = URL(fileURLWithPath: filePath)
let urlRequest = URLRequest(url: url)
webView?.loadRequest(urlRequest)
更新 Swift 3
import UIKit
import WebKit
class ViewController: UIViewController {
let webView = WKWebView()
override func viewDidLoad() {
super.viewDidLoad()
loadPdf()
setupViews()
}
func loadPdf() {
if let pdfUrl = Bundle.main.url(forResource: "YourPdfFileName", withExtension: "pdf", subdirectory: nil, localization: nil) {
do {
let data = try Data(contentsOf: pdfUrl)
webView.load(data, mimeType: "application/pdf", characterEncodingName:"", baseURL: pdfUrl.deletingLastPathComponent())
print("pdf file loading...")
}
catch {
print("failed to open pdf")
}
return
}
print("pdf file doesn't exist")
}
func setupViews() {
title = "View PDF Demo"
view.backgroundColor = .white
view.addSubview(webView)
// setup AutoLayout...
webView.translatesAutoresizingMaskIntoConstraints = false
webView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
webView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
webView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
webView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
}
}
所以我目前正在尝试显示我在 UIWebview 中的本地 PDF,这是我正在使用的代码:
@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);
}
代码将成功构建,但是当我 运行 应用程序时,它会因错误而崩溃: 线程 1:EXC_BAD_INSTRUCTION(代码=EXC-I386_INVOP,子代码=0x0)
我找到了一些关于如何执行此操作的教程,但它们都非常过时或在 Objective-C。
给你:
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)
}
编辑
替代方法是通过 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 特别建议您不要对本地 HTML 文件使用 .loadRequest,同时没有明确将其扩展到其他数据类型。所以我在上面提供了 NSData 路由。如果您希望指定一个 textEncodingName,它可以是 "utf-8"、"utf-16" 等。
编辑:Swift 3
这是代码的 Swift 3 版本,按照 Apple 的建议,使用 WKWebView 代替 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
}
}
}
}
从 Asset.xcassets 访问 PDF (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)
}
对于 Xcode 8.1 和 Swift 3.0
将 PDF 文件保存在 xcode 的任意文件夹中。 假设文件名为'Filename.pdf'
if let pdf = Bundle.main.url(forResource: "Filename", withExtension: "pdf", subdirectory: nil, localization: nil) {
let req = NSURLRequest(url: pdf)
webViewPresentation.loadRequest(req as URLRequest)
}
如果您想打开任何 html 个文件,同样适用。
导入 WebKit
在这里您可以在您的应用程序中加载您的 pdf
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
if let pdfURL = Bundle.main.url(forResource: "food-and-drink-menu-trafalgar-tavern", withExtension: "pdf", subdirectory: nil, localization: nil) {
do {
let data = try Data(contentsOf: pdfURL)
let webView = WKWebView(frame: CGRect(x:0,y:NavigationView.frame.size.height,width:view.frame.size.width, height:view.frame.size.height-NavigationView.frame.size.height))
webView.load(data, mimeType: "application/pdf", characterEncodingName:"", baseURL: pdfURL.deletingLastPathComponent())
view.addSubview(webView)
}
catch {
// catch errors here
}
}
}
对于 Swift 3 使用此代码:
let url = URL(fileURLWithPath: filePath)
let urlRequest = URLRequest(url: url)
webView?.loadRequest(urlRequest)
更新 Swift 3
import UIKit
import WebKit
class ViewController: UIViewController {
let webView = WKWebView()
override func viewDidLoad() {
super.viewDidLoad()
loadPdf()
setupViews()
}
func loadPdf() {
if let pdfUrl = Bundle.main.url(forResource: "YourPdfFileName", withExtension: "pdf", subdirectory: nil, localization: nil) {
do {
let data = try Data(contentsOf: pdfUrl)
webView.load(data, mimeType: "application/pdf", characterEncodingName:"", baseURL: pdfUrl.deletingLastPathComponent())
print("pdf file loading...")
}
catch {
print("failed to open pdf")
}
return
}
print("pdf file doesn't exist")
}
func setupViews() {
title = "View PDF Demo"
view.backgroundColor = .white
view.addSubview(webView)
// setup AutoLayout...
webView.translatesAutoresizingMaskIntoConstraints = false
webView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
webView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
webView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
webView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
}
}