【问题标题】:Create and store PDF document programmatically using Swift for iOS使用 Swift for iOS 以编程方式创建和存储 PDF 文档
【发布时间】:2016-02-03 20:19:44
【问题描述】:

我有一个可以查看已存储在项目中的 PDF 的应用程序。我希望能够创建一个新的 PDF 文档并将其存储在应用程序目录中,以便以后在现有的查看器中查看。 PDF 将由显示在UITableView 上的数组var todoList: [String] = [] 创建。我知道要创建 PDF,我必须创建文件名、路径和目录。我不知道该怎么做。我看到了对 URL 和 URL 请求的在线参考,但我不确定这是否是我想做的正确途径。有人可以给我一些建议和指导吗?我能找到的一切都是针对 Objective-C 的。

【问题讨论】:

  • 一旦你有了PDF的NSData,使用NSData的方法将数据写入一个路径。
  • 我有 NSData,但如何将其作为 PDF 写入路径?
  • 首先查看NSData 的文档并找到用于将其写入文件的方法。

标签: ios swift uitableview pdf


【解决方案1】:

我使用此代码创建和保存文件(使用 HTML)

func createPDF() {
    let html = "<b>Hello <i>World!</i></b> <p>Generate PDF file from HTML in Swift</p>"
    let fmt = UIMarkupTextPrintFormatter(markupText: html)

    // 2. Assign print formatter to UIPrintPageRenderer

    let render = UIPrintPageRenderer()
    render.addPrintFormatter(fmt, startingAtPageAt: 0)

    // 3. Assign paperRect and printableRect

    let page = CGRect(x: 0, y: 0, width: 595.2, height: 841.8) // A4, 72 dpi
    let printable = page.insetBy(dx: 0, dy: 0)

    render.setValue(NSValue(cgRect: page), forKey: "paperRect")
    render.setValue(NSValue(cgRect: printable), forKey: "printableRect")

    // 4. Create PDF context and draw

    let pdfData = NSMutableData()
    UIGraphicsBeginPDFContextToData(pdfData, .zero, nil)

    for i in 1...render.numberOfPages {
        UIGraphicsBeginPDFPage();
        let bounds = UIGraphicsGetPDFContextBounds()
        render.drawPage(at: i - 1, in: bounds)
    }

    UIGraphicsEndPDFContext();

    // 5. Save PDF file

    let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]

    pdfData.write(toFile: "\(documentsPath)/file.pdf", atomically: true)
}

然后我使用以下代码将其从文档目录加载到UIWebView

func loadPDF(filename: String) {
    let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
    let url = URL(fileURLWithPath: documentsPath, isDirectory: true).appendingPathComponent(filename).appendingPathExtension("pdf")
    let urlRequest = URLRequest(url: url)
    webView.loadRequest(urlRequest)
}

【讨论】:

  • 你帮了我这个忙,这是一个很大的帮助。我现在有一个传入的 PDF,正在从 NSURL 查看,我想将其保存为新的 PDF。我找不到任何关于 Swift 2 的内容。你能帮忙吗?
  • 您应该使用Alamofire 下载您的PDF。
  • 图像不会使用这种方法在 pdf 中呈现。有什么想法吗?
  • 你能分享你的sn-p吗?
  • 要处理电子邮件附件,您可以使用 MFMailComposeViewController developer.apple.com/reference/messageui/…,关于 iBooks 的问题,您可以指导 stackoverflow.com/questions/26343420/…
【解决方案2】:

对于 Swift 3

createPdf() {
    // 1. Create Print Formatter with input text.

    let formatter = UIMarkupTextPrintFormatter(markupText: textView.text)

    // 2. Add formatter with pageRender

    let render = UIPrintPageRenderer()
    render.addPrintFormatter(formatter, startingAtPageAt: 0)


    // 3. Assign paperRect and printableRect

    let page = CGRect(x: 0, y: 0, width: 595.2, height: 841.8) // A4, 72 dpi
    let printable = page.insetBy(dx: 0, dy: 0)

    render.setValue(NSValue(cgRect: page), forKey: "paperRect")
    render.setValue(NSValue(cgRect: printable), forKey: "printableRect")


    // 4. Create PDF context and draw
    let rect = CGRect.zero

    let pdfData = NSMutableData()
    UIGraphicsBeginPDFContextToData(pdfData, rect, nil)


    for i in 1...render.numberOfPages {

        UIGraphicsBeginPDFPage();
        let bounds = UIGraphicsGetPDFContextBounds()
        render.drawPage(at: i - 1, in: bounds)
    }

    UIGraphicsEndPDFContext();


    // 5. Save PDF file

    let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]

    pdfData.write(toFile: "\(documentsPath)/new.pdf", atomically: true)

    print("saved success")
}

【讨论】:

  • 如何保存到临时目录?
  • 创建pdf后如何保存
猜你喜欢
  • 2018-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 2022-07-08
  • 2011-12-12
  • 1970-01-01
  • 2011-03-23
相关资源
最近更新 更多