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

vwhgwdsa  于 2022-11-06  发布在  Swift
关注(0)|答案(1)|浏览(190)

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

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

incomingTransfer是一个Global Variable,在另一个ViewController中声明为NSURL。这个ViewController也有一个UIWebView,并且incomingTransfer加载到其中,我能够看到新的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)
gjmwrych

gjmwrych1#

我想明白了。我创建了一个名为“PDFFile”的class。在“PDFFile”中有两个variables,分别名为var name: Stringvar url: NSURL。在我的“IncomingTransfer”ViewController中,我有“保存”button使用UITextField中的键入名称创建并保存新文件,并且将AppDelegate中指定的incomingURL分配给urlvariable。然后使用NSCoding将两者保存到PDFFile类中。然后,我从PDFFile Classarray数据中为dataSource设置一个UITableView。当用户单击UITableViewCell时,我创建了一个segue,并将其转到一个新的ViewController,其中包含UIWebView。此WebView使用指定的url变量(从NSCoding保存)从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
}

传入文件代码并保存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代码:// MARK:属性@IBOutlet弱变量pdfItemWebView:UI网页视图!

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)

    }

这很复杂,但对我很有效。可能有一个更简单的方法,但这是我想出来的,它适合我的需要。

相关问题