首页 > 解决方案 > 加载从 WKWebView 中注入的 AJAX GET 检索的 PDF 二进制文件到 PDFKit

问题描述

我正在尝试从受身份验证保护的网站截取 ajax 传递的 pdf 文件。由于 ajax 提供文件,因此 URL 不包含用于下载的“.pdf”链接,而是将 PDF 文件作为内容处置附件提供。

到目前为止,当decisionPolicyFor navigationResponse 委托方法检测到“application/pdf”mimetype 时,我使用以下代码调用evaluateJavaScript 方法:

func readUrlContent(url: NSURL, completionHandler: @escaping (_ result: String) -> Void) {
    self.evaluateJavaScript("(function() { var result = ''; $.ajax({type: 'GET', url: '\(url)', contentType: 'application/pdf; charset=utf-8', success: function(r) {result = r}, failure: function() {result = null}, async: false }); return result })()", completionHandler: { (response, error) -> Void in
    let result = response as! String
    completionHandler(result)
    })
}

使用这个注入的代码(我之所以使用它是因为我在使用 WKWebView 的网站上遇到了 cookie 和身份验证问题),我可以成功地将完成处理程序中作为“结果”返回的 PDF 二进制字符串打印到日志中。现在的问题是我需要使用 PDFKit 将此 pdf 二进制数据转换为 PDF 文档。

当我使用这个二进制字符串并执行以下操作时:

self.data = result.data(using: .utf8)
self.performSegue(withIdentifier: "pdfSegue", sender: nil)

并将二进制 PDF 字符串传递给 PDFKit ViewController 以显示它,所有页面都显示为空白,并且出现以下错误:

“遇到意外的对象类型:7。”

“缺少或无效的对象编号。”

“缺少或无效的交叉引用流。”

“无效的流长度 3555;应该是 6444。”

“FlateDecode:解码错误:标头检查不正确。”

等等等等等等

如何/我可以获取返回的 PDF 二进制数据并使用 PDFKit 查看它?

标签: swiftajax

解决方案


推荐阅读