通过共享表从 NSData 共享 PDF

Posted

技术标签:

【中文标题】通过共享表从 NSData 共享 PDF【英文标题】:Share PDF from NSData via Share Sheet 【发布时间】:2015-11-09 12:57:39 【问题描述】:

PDF 文件在 Web 服务器上生成并作为 NSData 接收。 Swift 能够打印这个 NSData 对象;但是,通常接受 PDF 的其他应用程序(例如 Google Drive)在共享表上无法识别它。共享表上显示的唯一选项是用于打印和复印。

我尝试了以下方法无济于事:

let dataProvider = CGDataProviderCreateWithCFData(pdfObject)
let pdf = CGPDFDocumentCreateWithProvider(dataProvider)
return pdf!

根据 sbarow 的评论,我也尝试了以下方法,但 retrievePDFFromDisk 函数返回 nil:

func writePDFToDisk () 
    var docURL = (NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)).last! as NSURL
    docURL = docURL.URLByAppendingPathComponent( "myDocument.pdf")
    pdfObject.writeToURL(docURL, atomically: true)


func retrievePDFFromDisk () -> AnyObject 
    let pdf = NSBundle.mainBundle().URLForResource("myDocument", withExtension: "pdf")
    return pdf!

如何将这些数据以 PDF 格式正确地从共享表中发布给其他应用程序?

【问题讨论】:

writeToURL:atomically:NSData写入磁盘,然后使用文件路径共享。 我已编辑问题以显示我根据您的建议尝试过的方法; pdf 虽然返回 nil。一定是在检索中遗漏了一些东西。 试试writeToFile:atomically 【参考方案1】:

成功!见以下代码:

func writePDFToDisk () 
    var docURL = (NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)).last! as NSURL
    docURL = docURL.URLByAppendingPathComponent( "myDocument.pdf")
    pdfObject.writeToURL(docURL, atomically: true)


func retrievePDFFromDisk () -> AnyObject 
    var docURL = (NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)).last! as NSURL
    docURL = docURL.URLByAppendingPathComponent( "myDocument.pdf")
    return docURL

在我的例子中,这可以简化为:

func getPDFAsFile (pdfData:NSData) -> AnyObject 
    var docURL = (NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)).last! as NSURL
    docURL = docURL.URLByAppendingPathComponent( "myDocument.pdf")
    pdfData.writeToURL(docURL, atomically: true)
    return docURL

【讨论】:

以上是关于通过共享表从 NSData 共享 PDF的主要内容,如果未能解决你的问题,请参考以下文章

通过共享扩展从图库中保存照片时 NSData WriteToFile 失败

通过我在 android 上的应用程序共享 pdf 文件

共享 PDF - Mail.app 中的空白但通过 Airdrop 可以

与 UIActivityViewController 共享 PDF - 文件名

iOS,通过 twitter 和 Facebook 共享 webView 内容(长文本或 .pdf)

无法快速共享 pdf(仅限 WhatsApp)