【问题标题】:How to Load Local PDF in UIWebView in Swift如何在 Swift 中的 UIWebView 中加载本地 PDF
【发布时间】:2015-06-23 07:17:37
【问题描述】:

所以我目前正在尝试显示我在 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(code=EXC-I386_INVOP,subcode=0x0)

我找到了一些关于如何做到这一点的教程,但它们都非常过时或在 Objective-C 中。

【问题讨论】:

    标签: ios swift pdf uiwebview


    【解决方案1】:

    给你:

    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 建议您不要将 .loadRequest 用于本地 HTML 文件,同时没有明确地将其扩展到其他数据类型。所以我在上面提供了 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 (Swift 4) 访问 PDF

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

    【讨论】:

    • ViewController 现在将加载而不会崩溃,但 PDF 未加载。我认为该应用可能无法找到文件
    • 为我工作,检查 pdf 的名称
    • 是否可以将pdf文件逐页加载到数组中,并在页面之间进行页面卷曲?
    • @Jorgen 在 OS X 中有 PDFKit - sketchytech.blogspot.co.uk/2015/05/… - 易于使用,但在 iOS 中您需要查看 PDF 文档解析 developer.apple.com/library/ios/documentation/GraphicsImaging/… 并将其与 UIPageViewController - developer.apple.com/library/ios/documentation/UIKit/Reference/… 结合使用/跨度>
    • 谢谢一百万。终于有人可以为我指明正确的方向。我在那里找到了一个教程,它制作了一个很好的翻页 webView,但使用 html 字符串来填充页面。我想在其中放一个 pdf 文档,但找不到将页面拆分为数组的方法。现在我有了!
    【解决方案2】:

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

    【讨论】:

    • 有没有办法在webview里面编辑文档?
    • @iajmeri43 如果我尝试从 'tmp' 文件夹加载 pdf,您的代码有何变化!?
    【解决方案3】:

    对于 Swift 3,请使用以下代码:

    let url = URL(fileURLWithPath: filePath)
    
    let urlRequest = URLRequest(url: url)
    
    webView?.loadRequest(urlRequest)
    

    【讨论】:

      【解决方案4】:

      导入 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
                 }
      
            }
       }
      

      【讨论】:

      • 如果我尝试从 'tmp' 文件夹加载 pdf,您的代码会如何变化!?
      【解决方案5】:

      适用于 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 文件,同样适用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-18
        • 2017-11-22
        • 1970-01-01
        • 2013-09-10
        • 1970-01-01
        • 2014-12-26
        • 1970-01-01
        • 2012-03-22
        相关资源
        最近更新 更多