使用 Swift for iOS 以编程方式创建和存储 PDF 文档

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/33503211/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 08:10:34  来源:igfitidea点击:

Create and store PDF document programmatically using Swift for iOS

iosswiftuitableviewpdf

提问by ChallengerGuy

I have an app that can view a PDF that is already stored within the project. I want to be able to create a new PDF document and store it in the app directory to later view in the already existing viewer. The PDF would be created from an array var todoList: [String] = []that is displayed on a UITableView. I know to create a PDF, I have to create a file name, path, and directory. I don't know how to do this. I saw online reference to URL and URL request, but I'm not sure if this is the correct avenue for what I want to do. Can someone please give me some advice and guidance? Everything I can find is for Objective-C.

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

回答by Danny Narváez

I used this code to create and save the file (using HTML)

我使用此代码创建并保存文件(使用 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)
}

Then I loaded it into UIWebViewfrom the documents directory with this code:

然后我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)
}

回答by Garry

For Swift 3:

对于 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")
}