首页 > 解决方案 > 无法使用共享表 Swift 共享 PDF 文件

问题描述

我正在尝试使用视觉套件创建 PDF 并使用共享表共享它。创建 PDF 后,共享表就会显示并显示选项,但是当我继续单击其中一个项目时,它会给我一个错误,提示“无法共享此项目。请选择其他项目。”

目前我在代码或终端中找不到任何差异。

以下是用于创建和共享 PDF 的代码:

   
        func createNewPDF(arrImage: [UIImage]) -> Data? {
            
            let pdfDocument = PDFDocument()
            for i in 0...arrImage.count-1 {
                let pdfPage = PDFPage(image: arrImage[i])
                pdfDocument.insert(pdfPage!, at: i)
            }
            let pdfData = pdfDocument.dataRepresentation()
            
            

            let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).map(\.path)
            let documentsDirectory = paths[0]
            let fullPath = URL(fileURLWithPath: documentsDirectory).appendingPathComponent("\(pdfnameing).pdf") as URL
            let fullPathf = URL(fileURLWithPath: documentsDirectory).appendingPathComponent("\(pdfnameing).pdf").path
            let urll = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("\(pdfnameing).pdf") as NSURL
            do {
                   let data = try Data(contentsOf: fullPath)

                   try data.write(to: urll as URL)

                   let activitycontroller = UIActivityViewController(activityItems: [urll], applicationActivities: nil)
                   if activitycontroller.responds(to: #selector(getter: activitycontroller.completionWithItemsHandler))
                   {
                       activitycontroller.completionWithItemsHandler = {(type, isCompleted, items, error) in
                           if isCompleted
                           {
                               print("completed")
                           }
                       }
                   }
                
                if let popoverController = activitycontroller.popoverPresentationController {
                popoverController.sourceView = self.view
                  popoverController.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)
                  popoverController.permittedArrowDirections = []

              }
                   activitycontroller.popoverPresentationController?.sourceView = self.view
                   self.present(activitycontroller, animated: true, completion: nil)

               }
               catch {
                   //ERROR
               }
            

           let activityItems = [tempURL]
        let activityViewController = UIActivityViewController(activityItems: activityItems, applicationActivities: nil)

     if let popoverController = activityViewController.popoverPresentationController {
           popoverController.sourceView = self.view
          popoverController.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)
       popoverController.permittedArrowDirections = []

  }

   self.present(activityViewController, animated: true, completion: nil)

            
            return pdfData
        }

'pdfnameing' 是用于命名 PDF 文件的字符串

这是错误的图片

我在这里先向您的帮助表示感谢!

编辑: 建议更改后,我仍然遇到与上图相同的错误。

修改后的代码:


        
        func createNewPDF(arrImage: [UIImage]) -> Data? {
            
            let pdfDocument = PDFDocument()
            for i in 0...arrImage.count-1 {
                let pdfPage = PDFPage(image: arrImage[i])
                pdfDocument.insert(pdfPage!, at: i)
            }
            let pdfData = pdfDocument.dataRepresentation()
            let tempURL = FileManager.default.temporaryDirectory
                .appendingPathComponent("\(pdfnameing).pdf")
            do {
         

                   let activitycontroller = UIActivityViewController(activityItems: [tempURL], applicationActivities: nil)
                   if activitycontroller.responds(to: #selector(getter: activitycontroller.completionWithItemsHandler))
                   {
                       activitycontroller.completionWithItemsHandler = {(type, isCompleted, items, error) in
                           if isCompleted
                           {
                               print("completed")
                           }
                       }
                   }

                if let popoverController = activitycontroller.popoverPresentationController {
                popoverController.sourceView = self.view
                  popoverController.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)
                  popoverController.permittedArrowDirections = []

              }
                   activitycontroller.popoverPresentationController?.sourceView = self.view
                   self.present(activitycontroller, animated: true, completion: nil)

               }
               catch {
                   //ERROR
               }
            
      let anURL = URL(fileURLWithPath: tempURL)

           let activityItems = [anURL]
            
        let activityViewController = UIActivityViewController(activityItems: activityItems, applicationActivities: nil)

     if let popoverController = activityViewController.popoverPresentationController {
           popoverController.sourceView = self.view
          popoverController.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)
       popoverController.permittedArrowDirections = []

  }

   self.present(activityViewController, animated: true, completion: nil)



            return pdfData
        }
    

调试器日志:

The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
2020-11-03 15:57:48.058158+0530 Scan Box[4068:1060013] [] Trying to load recrop for scan, but the quad is nil, setting starting UI recrop to a 95% unit rect
Success
2020-11-03 15:58:10.127405+0530 Scan Box[4068:1060013] [core] SLRemoteComposeViewController: (this may be harmless) viewServiceDidTerminateWithError: Error Domain=_UIViewServiceErrorDomain Code=1 "(null)" UserInfo={Terminated=disconnect method}

标签: iosswift

解决方案


您从未保存过 pdfData。有很多无意义的代码,您尝试从磁盘加载数据,但您的 pdfData 变量中已经有了数据。

只需删除这些行

let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).map(\.path)
let documentsDirectory = paths[0]
let fullPath = URL(fileURLWithPath: documentsDirectory).appendingPathComponent("\(pdfnameing).pdf") as URL
let fullPathf = URL(fileURLWithPath: documentsDirectory).appendingPathComponent("\(pdfnameing).pdf").path
let urll = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("\(pdfnameing).pdf") as NSURL
do {
    let data = try Data(contentsOf: fullPath)
    try data.write(to: urll as URL)

并将其替换为:

let pdfData = pdfDocument.dataRepresentation()
let tempURL = FileManager.default.temporaryDirectory
    .appendingPathComponent("\(pdfnameing).pdf")
do {
    try pdfData.write(to: tempURL) 

推荐阅读