【问题标题】:How to specify a filename when saving pdf document to iOS Files App?将pdf文档保存到iOS Files App时如何指定文件名?
【发布时间】:2020-03-15 02:53:07
【问题描述】:

我使用 PDFKit 在我的应用程序中创建了一个 pdf 文档。我可以成功地在预览中显示它,并从预览控制器中使用以下代码向用户展示共享操作:

@objc func shareAction(_ sender: UIBarButtonItem)
{
    if let data = documentData
    {
        let vc = UIActivityViewController(activityItems: [data], applicationActivities: [])
        present(vc, animated: true, completion: nil     
    }
}

documentData 包含创建的 pdf 文档。

当用户选择“保存到文件”时,文档将获得默认名称“PDF Document.pdf”,用户可以更改该名称。

如何提供不同的默认文件名?

【问题讨论】:

    标签: ios uiactivityviewcontroller ios-pdfkit files-app


    【解决方案1】:

    不是真正的答案,而是我想出的解决方法:

    而不是使用 PDF 的内存中副本data,我可以将其写入应用程序 tmp 文件夹:

    var fileURL : URL?
    do
    {
        let filename = "myfilename.pdf"
        let tmpDirectory = FileManager.default.temporaryDirectory
        fileURL = tmpDirectory.appendingPathComponent(filename)
        try data.write(to: fileURL!)
    }
    catch
    {
        print ("Cannot write PDF: \(error)")
    }
    

    共享操作将如下所示:

    @objc func shareAction(_ sender: UIBarButtonItem)
    {
        if let url = fileURL
        {
            let vc = UIActivityViewController(activityItems: [url], applicationActivities: [])
            present(vc, animated: true, completion: nil     
        }
    }
    

    现在,当用户选择“保存到文件”操作时,“myfilename.pdf”会显示为默认文件名。

    【讨论】:

      【解决方案2】:

      只是一个额外的帮助。

      你最好在适当的时候删除tmp目录下的PDF文件。

      当 viewController 关闭时我调用这个函数。

      仅供参考

      func deleteAllPDFs() {
          let predicate = NSPredicate(format: "self ENDSWITH '.pdf'")
          let defaultFileManager = FileManager.default
      
          do {
              let tmpDirURL = defaultFileManager.temporaryDirectory
              let contents = try defaultFileManager.contentsOfDirectory(atPath: tmpDirURL.path)
              let pdfs = contents.filter { predicate.evaluate(with: $0) }
              try pdfs.forEach { file in
                  let fileUrl = tmpDirURL.appendingPathComponent(file)
                  try defaultFileManager.removeItem(at: fileUrl)
              }
          }
          catch {
              print ("Failed to delete PDF with error: \(error)")
          }
      }
      

      【讨论】:

      • 是的,谢谢指出。我正在删除 viewcontrollers deinit 中的临时文件,但没有提及。
      猜你喜欢
      • 2020-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-16
      • 1970-01-01
      • 1970-01-01
      • 2020-01-30
      • 1970-01-01
      相关资源
      最近更新 更多