ios - 如何使用 swift 下载和共享 pdf 文件

标签 ios swift url

在我正在构建的应用程序中,我必须生成一个 pdf 文件,然后通过电子邮件、WhatsApp 等共享。

目前我已经按照以下代码生成pdf。

    import UIKit

    class ViewController: UIViewController {
        @IBOutlet weak var masterContainerView: UIView!
        @IBOutlet weak var pdfButton: UIButton!

        @IBAction func generatePDFtapped(_ sender: Any) {
            pdfButton.isHidden = true
            generatePDF()
            pdfButton.isHidden = false
        }

        func generatePDF() {
            let pdfWrittenPath = masterContainerView.exportAsPdfFromView()
            print("PDF written at \(pdfWrittenPath)")
        }
    }

上面的代码是 View Controller ,类文件是这样的:

    import Foundation
    import UIKit

    //to call this, use the <viewoutletname>.exportAsPdfFromView()

    extension UIView {
        // Export pdf from Save pdf in directory and return pdf file path


        func exportAsPdfFromView() -> String {
            let pdfPageFrame = self.bounds
            let pdfData = NSMutableData()
            UIGraphicsBeginPDFContextToData(pdfData, pdfPageFrame, nil)
            UIGraphicsBeginPDFPageWithInfo(pdfPageFrame, nil)
            guard let pdfContext = UIGraphicsGetCurrentContext() else { return "" }
            self.layer.render(in: pdfContext)
            UIGraphicsEndPDFContext()
            return self.saveViewPdf(data: pdfData)

        }

        // Save pdf file in document directory
        func saveViewPdf(data: NSMutableData) -> String {
            let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
            let docDirectoryPath = paths[0]
            let pdfPath = docDirectoryPath.appendingPathComponent("viewPdf.pdf")
            if data.write(to: pdfPath, atomically: true) {
                return pdfPath.path
                print("PDF written at path \(pdfPath.path)")
            } else {
                return ""
            }
        }
    }

我在互联网上找到了一个有用的示例,它准确地解释了我必须做什么。但我的问题是,EXAMPLE 开发人员正在访问公共(public) URL,而不是加载保存的 PDF 文件(已存储)。请帮我修改一下代码。

https://github.com/mansi-cherry/iOSHowTo-s/blob/master/documentInteractionDemo/documentInteractionDemo/ViewController.swift


expected output image 这是预期的输出,但不应获取图像文件,而应获取 pdf

最佳答案

那么您只想加载之前保存的文件?

执行相同的操作来访问文件名和路径,然后读取内容。

let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
let docDirectoryPath = paths.first
let pdfPath = docDirectoryPath.appendingPathComponent("viewPdf.pdf")

let data = Data(contentsOf: pdfPath)

完整示例:

class ViewController: UIViewController {

    let dataString = "Helloooooo world"

    override func viewDidLoad() {
        super.viewDidLoad()

        saveFile()
        readFile()
    }

    func saveFile() {
        let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        let docDirectoryPath = paths.first
        let pdfPath = docDirectoryPath?.appendingPathComponent("test.txt")

        let data = dataString.data(using: .utf8)
        try? data?.write(to: pdfPath!)
    }

    func readFile() {
        let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        let docDirectoryPath = paths.first
        let pdfPath = docDirectoryPath?.appendingPathComponent("test.txt")

        let data = try? Data(contentsOf: pdfPath!)
        let str = String(bytes: data!, encoding: .utf8)
        print("[DEBUG] result is \(str)")
    }
}

输出:

[DEBUG] result is Optional("Helloooooo world")

关于ios - 如何使用 swift 下载和共享 pdf 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56034091/

相关文章:

ios - 每个 Apple ID 只允许下载一次

ios - Safari 无法打开页面,因为地址无效

swift - 不使用 .barTintColor 设置导航栏的颜色?

ios - Swift 函数式编程 - 有没有比两个 map 调用更好的方法来翻译嵌套的 for 循环

php - 正向后视中带有字符集的正则表达式,这可能吗?

ios - 分配后,iOS用其他UIImage更新UIImage

javascript - 如何在 expo 中以编程方式启用/禁用 textinput?

ios - 当我的 UITableViewCell 的内容发生变化时,我如何告诉它 "auto-resize"?

java - 如何筛选特定类型文件/响应的 URL?

php - 隐藏图片url的下载脚本