将 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
}
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)
我明白了。我创建了一个名为 'PDFFile' 的 class
。在 'PDFFile' 中有两个 variables
,名为 var name: String
和 var 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)
}
这很复杂,但对我有用。可能有更简单的方法,但这是我想出的方法,它可以满足我的需要。
我有一个与打开 PDF 文件相关的项目。这是在 Info.plist
中设置的。当我在电子邮件中收到 PDF 附件时,我可以将手指放在 PDF 附件上,然后在我的应用程序中 'Open in'。在我的 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)
我明白了。我创建了一个名为 'PDFFile' 的 class
。在 'PDFFile' 中有两个 variables
,名为 var name: String
和 var 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)
}
这很复杂,但对我有用。可能有更简单的方法,但这是我想出的方法,它可以满足我的需要。