2015-11-03 63 views
2

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

+0

一旦你有'NSData'对于PDF,使用'NSData'的方法将数据写入路径。 – rmaddy

+0

我有NSData,但是如何将它作为PDF写入路径? – ChallengerGuy

+0

首先查看'NSData'的文档并找到用于将其写入文件的方法。 – rmaddy

回答

16

我用这个代码来创建和保存文件(使用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, startingAtPageAtIndex: 0) 

    // 3. Assign paperRect and printableRect 

    let page = CGRect(x: 0, y: 0, width: 595.2, height: 841.8) // A4, 72 dpi 
    let printable = CGRectInset(page, 0, 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, CGRectZero, nil) 

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

    UIGraphicsEndPDFContext(); 

    // 5. Save PDF file 

    let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] 

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

然后我装成UIWebView从文档目录,此代码:

func loadPDF(filename: String) { 
    let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] 
    let filePath = "\(documentsPath)/\(filename).pdf" 
    let url = NSURL(fileURLWithPath: filePath) 
    let urlRequest = NSURLRequest(URL: url) 
    webView.loadRequest(urlRequest) 
} 
+0

你帮助了我,这是一个很大的帮助。我现在有一个传入的PDF,正在从'NSURL'中查看,我想将它保存为新的PDF。我找不到Swift 2上的任何内容。你能帮忙吗? – ChallengerGuy

+0

您应该使用[Alamofire](https://github.com/Alamofire/Alamofire#downloading-a-file)下载您的PDF。 –

+0

图像不使用这种方法呈现在pdf内部。任何想法 ? – Max

2

对于斯威夫特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") 
} 
+0

这怎么能保存到临时目录? – Derry

相关问题