ios - 无法使用共享表 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}
解决方案
您从未保存过 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)
推荐阅读
- java - java.lang.LinkageError: ClassCastException RuntimeDelegate.class
- sonarqube - Sonarqube:忽略 sonarqube 规则的 PHP 等效注释
- html - 使用 CSS 在带有填充的渐变上叠加图像
- java - JPA 未正确更新 SQL 数据库
- internationalization - Flutter 国际化 - 动态字符串
- css - 如何使页脚停留在滚动的末尾
- database - heroku run rails db:migrate 运行 rails
- symfony - Symfony 控制器中服务的 Getter 方法
- azure - Azure 查询分析平均列中的所有值
- java - 类型交集:在相交类型中使用类型变量