gpt4 book ai didi

ios - 如何在 Swift 3 的 UIWebView 中显示没有基本 URL 的 PDF?

转载 作者:搜寻专家 更新时间:2023-11-01 06:37:36 25 4
gpt4 key购买 nike

我想在 UIWebView 中显示一个 PDF 文件。我已经将它作为一个 Data 对象,所以我不需要(并且不能)提供 baseURL

在 Objective-C 中 ...

...对应的方法定义如下:

- (void)loadData:(NSData *)data 
MIMEType:(NSString *)MIMEType
textEncodingName:(NSString *)textEncodingName
baseURL:(NSURL *)baseURL;

所以我可以简单地将 nil 作为 baseURL 传递,如 Apple's Text Programming Guide 中所述.

在 Swift 2.0 中 ...

... baseURL 参数在 load(...) 函数中不是可选的(为什么?)所以我不得不传递一个有效的 NSURL 对象。幸运的是,另一个 Stackoverflow post 中描述了一个简单的解决方法: 我只是创建了一个空的 NSURL 对象。

private func showPdf(data: NSData) {
webView.loadData(data,
MIMEType: "application/pdf",
textEncodingName: "utf-8",
baseURL: NSURL())
}

现在 Swift 3.0 ...

...方法签名已更改,baseURL 参数必须是 Swift URL 而不是 NSURL:

open func load(_ data: Data, 
mimeType MIMEType: String,
textEncodingName: String,
baseURL: URL)

这打破了解决方法,因为对于 URL 没有空的初始值设定项,并且从空字符串创建 URL 是不可能的,如 Swift 文档中所述:

/// Returns `nil` if a `URL` cannot be formed with the string 
/// (for example, if the string contains characters that are illegal
/// in a URL, or is an empty string).
public init?(string: String)

所以问题是:
如何在 Swift 3 的 UIWebView 中不提供 baseURL 的情况下加载 PDF(或任何其他 Web 内容)?

最佳答案

首先,马特的回答是正确的。看起来你几乎可以使用任何 URL 作为 baseURL 因为 webview 只将它用于 HTML 文件中的内部链接,例如。如果您加载的是不包含任何内部链接的 PDF,则该参数将被忽略。您可以将 URL(string: "http://www.stackoverflow.com")! 作为 baseURL 传递,它仍然有效。我真的不明白为什么 Apple 没有首先将 baseURL 设为可选,但事实就是如此。

其次,我的UIWebView没有加载PDF的原因与baseURL无关,正如我问这个问题时所想的那样。事实证明,我试图在 webview 中加载的 data 对象没有正确创建。


问题:

在 Swift 3 之前,可以像这样将数据写入上下文目标:

let mutableData = CFDataCreateMutable(nil, 0)

let dataConsumer = CGDataConsumerCreateWithCFData(mutableData)
let pdfContext = CGPDFContextCreate(dataConsumer, &pageRect, nil)

if CGPDFDocumentGetNumberOfPages(document) > 0 {
CGPDFContextBeginPage(pdfContext, nil)
CGContextDrawPDFPage(pdfContext, page)
CGPDFContextEndPage(pdfContext)
}

此时 mutableData 对象已经写入并包含 PDF 页面数据。翻译成新的 Swift 3 语法如下:

let mutableData = CFDataCreateMutable(nil, 0)

let dataConsumer = CGDataConsumer(data: mutableData!)
let pdfContext = CGContext(consumer: dataConsumer!, mediaBox: &pageRect!, nil)

if (document?.numberOfPages)! > 0 {
pdfContext?.beginPDFPage(nil)
pdfContext?.drawPDFPage(page!)
pdfContext?.endPDFPage()
}

但是在 pdfContext 上调用 endPDFPage()(或等效的 CGPDFContextEndPage())不再将任何数据写入目的地


解决方案:

你需要打电话

pdfContext?.closePDF()

这最终会将 PDF 数据写入您的上下文目标。

之后,无论您提供什么 baseURL,您都可以按照我的问题中的描述在 webview 中简单地加载 PDF 数据。

关于ios - 如何在 Swift 3 的 UIWebView 中显示没有基本 URL 的 PDF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39621689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com