将 WebView 中传入的 PDF 保存到内存

Save incoming PDF in WebView to Memory

我有一个与打开 PDF 文件相关的项目。这是在 Info.plist 中设置的。当我在电子邮件中收到 PDF 附件时,我可以将手指放在 PDF 附件上,然后在我的应用程序中 'Open in'。在我的 AppDelegate 中,我添加了以下内容:

func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {
    incomingTransfer = URL
    return true
}

incomingTransferGlobal Variable 在另一个 ViewController 中声明为 NSURL。此 ViewController 也有一个 UIWebViewincomingTransfer 加载到其中,我可以看到新的 PDF 文件。我的目标是有一个按钮,允许用户将传入的 PDF 保存为 PDF。我遇到了麻烦。我以为我已经弄清楚了,但它根本没有另存为 PDF,而是另存为 String。有谁可以帮助我吗?我的目标是将传入的 PDF 文件作为 PDF 保存到应用程序内存中,最好在 DocumentDirectory 中。我很难尝试将 Objective C 转换为 Swift。我保存它的原始代码是:

    let html = String(incomingFileTransfer)
    let fmt = UIMarkupTextPrintFormatter(markupText: html)

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

    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")

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

    for i in 1...render.numberOfPages() {

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

    UIGraphicsEndPDFContext();

    recipeFileName = fileName.text!

    print("File Name Entered: \(recipeFileName)")

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

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

我明白了。我创建了一个名为 'PDFFile' 的 class。在 'PDFFile' 中有两个 variables,名为 var name: Stringvar url: NSURL。在我的 'IncomingTransfer' ViewController 中,我让 'save' button 使用 UITextField 中输入的名称和我的 [ 中指定的 incomingURL 创建并保存新文件=20=] 赋值给 url variable。然后使用 NSCoding 将两者保存到 PDFFile class。然后,我从 PDFFile Class array 数据中为它的 dataSource 设置了一个 UITableView。当用户单击 UITableViewCell 时,我创建了一个 segue,它会转到带有 UIWebView 的新 ViewController。此 WebView 使用从 NSCoding 保存的指定 url 变量从 urlRequest 加载 PDF。

AppDelegate代码:

// Allows incoming file access (PDF)
func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {

    // Transfer incoming file to global variable to be read

    if url != "" {

        // Load from Mail App

        incomingFileTransfer = url

        incomingStatus = "Incoming"

    } else {

        // Regular Load

        print("App Delegate: No incoming file")

        incomingFileTransfer = nil

    }        

    return true
}

IncomingFile代码和保存button代码:

// MARK: Properties
var file: PDFFile?

// MARK: Actions
// Save Button
let name = fileName.text ?? ""

let url = incomingFileTransfer

file = PDFFile(name: name, url: url)


// MARK: NSCoding
func saveFiles() {

    let isSuccessfulSave = NSKeyedArchiver.archiveRootObject(pdfFiles, toFile: PDFFile.ArchiveURL.path!)

    if !isSuccessfulSave {

        print("Failed to save PDF file")

    }

}

稍后查看保存的传入 PDF ViewController 代码: // 标记:属性 @IBOutlet weak var pdfItemWebView: UIWebview!

var incomingURL: NSURL!

// Within ViewDidLoad
    if let file = file {

        pdfFileName.text = file.name

        incomingURL = file.url

        print("Saved URL: \(incomingURL)")

        print("Pending load...")

        let request = NSURLRequest(URL: incomingURL!)

        pdfItemWebView.loadRequest(request)

    }

这很复杂,但对我有用。可能有更简单的方法,但这是我想出的方法,它可以满足我的需要。