iOS中加载含有电子签章的PDF

在iOS开发中,要加载PDF,一般可以直接使用WKWebview来加载。但是PDF中的电子签章常常显示失败。除了使用第三方库来解决之外,有没有其他解决方案呢?我的解决方案是下载PDF文件后保存到本地,然后使用QLPreviewController加载本地文件。

QLPreviewController简介

QLPreviewController API在iOS中用来预览文件,它支持的文件类型有iWork文档、RTF文档、PDF文件、图片、文本文件和CVS文件等。使用的时候需要遵守并实现QLPreviewControllerDataSourceQLPreviewControllerDelegate两个代理的方法。

1
2
3
4
5
6
7
8
9
10
extension WebViewController:QLPreviewControllerDelegate,QLPreviewControllerDataSource {
// 加载的文件个数
func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
return 1
}
// 当前要加载的文件index
func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
return previewURL as QLPreviewItem//previewURL是我的PDF文件的URL
}
}

加载含有电子签章的PDF

  1. 下载PDF并保存到本地

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    // 自定义的下载方法
    NetworkManager.download(url: url, successHandle: { [unowned self] (urlAddress) in
    guard let address = urlAddress else {
    return
    }
    self.previewURL = address
    //初始化QLPreviewController
    if self.previewer == nil {
    self.previewer = QLPreviewController()
    self.previewer?.delegate = self
    self.previewer?.dataSource = self
    self.previewer?.view.frame = (self?.webView.bounds)!
    self.webView.addSubview((self?.previewer!.view)!)
    }
    self.previewer?.refreshCurrentPreviewItem()//刷新or加载当前要显示的url
    }) { (error) in
    print(error.localizedDescription)
    }
  2. 使用QLPreviewController加载文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    // 实现QLPreviewControllerDelegate和QLPreviewControllerDataSource的代理方法
    extension WebViewController:QLPreviewControllerDelegate,QLPreviewControllerDataSource {
    func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
    return 1
    }
    func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
    return previewURL! as QLPreviewItem
    }
    }