首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用UIActivityViewController和UIActivityItemProvider共享PDF

使用UIActivityViewController和UIActivityItemProvider共享PDF
EN

Stack Overflow用户
提问于 2016-06-23 11:46:12
回答 4查看 25.7K关注 0票数 14

我需要在iOS下共享/打开一些不同的文件,例如iCloud的图像或iBooks的pdf。有几个文本和图像的例子,但没有其他的.

我在这里创建了自己的UIActivityItemProvider;简化版本:

代码语言:javascript
复制
class MyItemProvider: UIActivityItemProvider {

  override func item() -> AnyObject {
    self.placeholderItem
  }

  override func activityViewController(activityViewController: UIActivityViewController, dataTypeIdentifierForActivityType activityType: String?) -> String {
    return kUTTypePDF as String
  }

  func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject {
    return self.placeholderItem
  }
}

并开始与如下内容分享:

代码语言:javascript
复制
let myPDF = NSData(contentsOfURL: NSBundle.mainBundle().URLForResource("testpdf", withExtension: "pdf")) {
let activityVC = UIActivityViewController(activityItems: [MyItemProvider(placeHolder: myPDF)], applicationActivities: nil)
self.presentViewController(activityVC, animated: true, completion: nil)

我希望有一个共享对话,比如:

但我得到的只是:

有什么建议吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-12-13 10:57:37

**

在Swift 3中与UIActivityViewController共享PDF

**

我花了很多时间思考如何在从UIWebView加载的http://youPdfFile.pdf中共享一个PDF文件,比如"http://youPdfFile.pdf

几天后,我找到了我认为最合适的方法:

1)必须首先保存在文件系统中。例如,这可以在加载UIWebView:之后完成。

代码语言:javascript
复制
class yourViewController: UIViewController{
       var documentPathToLoad = "http://youPdfFile.pdf"
       ...

       func webViewDidFinishLoad(_ webView: UIWebView) { 
           if yourWebView.isLoading { 
               // still loading 
               return 
           } 

           //Save the pdf document to file system 
           savePdf() 
       }

       func savePdf(){    
           let fileManager = FileManager.default 
           let paths = (NSSearchPathForDirectoriesInDomain((.documentDirectory, .userDomainMask, true)[0] as NSString).appendingPathComponent("documento.pdf") 
           let pdfDoc = NSData(contentsOf:URL(string: documentPathToLoad)!) 
           fileManager.createFile(atPath: paths as String, contents: pdfDoc as Data?, attributes: nil) 
       } 
}

2)读取保存的文件,然后共享它。这种方法在Swift 3.0.1:中适用于我

代码语言:javascript
复制
func loadPDFAndShare(){ 

           let fileManager = FileManager.default 
           let documentoPath = (self.getDirectoryPath() as NSString).appendingPathComponent("documento.pdf") 

           if fileManager.fileExists(atPath: documentoPath){              
                let documento = NSData(contentsOfFile: documentoPath) 
                let activityViewController: UIActivityViewController = UIActivityViewController(activityItems: [documento!], applicationActivities: nil) 
                activityViewController.popoverPresentationController?.sourceView=self.view 
                present(activityViewController, animated: true, completion: nil) 
            } 
            else { 
                print("document was not found") 
            } 
        } 
票数 32
EN

Stack Overflow用户

发布于 2019-11-15 15:58:49

现有的答案演示了如何使用本地文件的URL共享PDF。但是,如果不想创建文件,则不必创建该文件。另一种方法是使用Data表示您的PDF文件。

假设您使用PDFKit在UI中显示PDF。这意味着您将处理具有dataRepresentation()方法的dataRepresentation()类。此方法返回Data,可以传递给UIActivityViewController初始化器。

票数 11
EN

Stack Overflow用户

发布于 2019-02-27 10:00:19

您必须传递pdf文件url的pdf支持的应用程序的选项在UIActivityViewController。

代码语言:javascript
复制
func btnTapped() {
    if let pdf = Bundle.main.url(forResource: "yourPdfFileName", withExtension: "pdf", subdirectory: nil, localization: nil)  {
        self.sharePdf(path: pdf)
    }
}    

func sharePdf(path:URL) {

    let fileManager = FileManager.default

    if fileManager.fileExists(atPath: path.path) {
        let activityViewController: UIActivityViewController = UIActivityViewController(activityItems: [path], applicationActivities: nil)
        activityViewController.popoverPresentationController?.sourceView = self.view
        self.present(activityViewController, animated: true, completion: nil)
    } else {
        print("document was not found")
        let alertController = UIAlertController(title: "Error", message: "Document was not found!", preferredStyle: .alert)
        let defaultAction = UIAlertAction.init(title: "ok", style: UIAlertAction.Style.default, handler: nil)
        alertController.addAction(defaultAction)
        UIViewController.hk_currentViewController()?.present(alertController, animated: true, completion: nil)
    }
}
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37990711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档