将 WebView 保存为 PDF 返回空白图像?

2024-07-04

我正在尝试弄清楚如何将 WebView 保存到 PDF 并且完全卡住了,真的很感激一些帮助吗?

我在 OSX 上的 Cocoa 和 Swift 中执行此操作,这是到目前为止我的代码:

import Cocoa
import WebKit

class ViewController: NSViewController {

    override func loadView() {
        super.loadView()
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        loadHTMLString()
    }

    func loadHTMLString() {
        let webView = WKWebView(frame: self.view.frame)
        webView.loadHTMLString("<html><body><p>Hello, World!</p></body></html>", baseURL: nil)
        self.view.addSubview(webView)
        createPDFFromView(webView, saveToDocumentWithFileName: "test.pdf")
    }

    func createPDFFromView(view: NSView, saveToDocumentWithFileName fileName: String) {
        let pdfData = view.dataWithPDFInsideRect(view.bounds)
        if let documentDirectories = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first {
            let documentsFileName = documentDirectories + "/" + fileName
            debugPrint(documentsFileName)
            pdfData.writeToFile(documentsFileName, atomically: false)
        }
    }

}

这非常简单,我正在做的是创建一个 WebView 并向其写入一些基本的 html 内容,以呈现以下内容:

然后获取视图并将其保存到 PDF 文件,但显示为空白:

我尝试从 webView 和 View 中获取内容,但没有任何乐趣。

我在这里发现了类似的问题webview渲染完成后如何截图 https://stackoverflow.com/questions/15051007/how-to-take-a-screenshot-when-a-webview-finished-rending关于将 webview 保存到图像,但到目前为止 OSX 解决方案还没有成功。

是否与文档尺寸有关? 或者内容在子视图中? 也许如果你捕获了视图,你就无法捕获子视图?

有任何想法吗?


iOS 11.0 及以上版本,Apple提供了以下API来捕获WKWebView的快照。

@available(iOS 11.0, *)
    open func takeSnapshot(with snapshotConfiguration: WKSnapshotConfiguration?, completionHandler: @escaping (UIImage?, Error?) -> Swift.Void)

使用示例:

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {

        if #available(iOS 11.0, *) {
            webView.takeSnapshot(with: nil) { (image, error) in
                //Do your stuff with image
            }
        }
    }

iOS 10 及以下版本,必须使用UIWebView来捕获快照。可以使用以下方法来实现。

func webViewDidFinishLoad(_ webView: UIWebView) {

        let image = captureScreen(webView: webView)
        //Do your stuff with image
    }

func captureScreen(webView: UIWebView) -> UIImage {
        UIGraphicsBeginImageContext(webView.bounds.size)
        webView.layer.render(in: UIGraphicsGetCurrentContext()!)
        let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return image
    }

这是另一个相关的answer https://stackoverflow.com/a/44627307/3659227

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 WebView 保存为 PDF 返回空白图像? 的相关文章

  • 使用 Xcode 7 UITest 测试元素是否可见

    我想验证一个元素是否可见 具体取决于它的 hidden属性 但我没有找到使用新的 Xcode 7 UI 测试内容来做到这一点的有效方法 我尝试过myelement exists and myelement hittable但它们似乎没有按我
  • 在 Swift 中删除 String 对象中特定字符之后的所有字符的更优雅的方法是什么

    删除特定字符后的所有字符的更优雅的方法是什么StringSwift 中的对象 假设我有以下字符串 str str我需要删除 str从中 我该怎么做 提前致谢 这是一种方法 var str str str if let dotRange st
  • Swift 不会将 Objective-C NSError** 转换为 throws

    我有一些 Objective C 遗留代码 声明了类似的方法 void doSomethingWithArgument ArgType argument error NSError error 正如这里所写的https developer
  • 如何在任务完成块中更新 UI?

    在我的应用程序中 我在发送 HTTP 请求之前让进度指示器开始动画 完成处理程序在块中定义 获得响应数据后 我隐藏块内部的进度指示器 我的问题是 据我所知 UI 更新必须在主线程中执行 我怎样才能确定呢 如果我在窗口控制器中定义一个更新UI
  • 如何在 Cocoa 中从 MP3 文件中提取 ID 标签?

    请建议一些使用简单 API 提取 MP3 属性的方法 除了这个库还有其他库吗ID3 框架 http drewfamily homemail com au Cocoa ID3Tag framework html 我发现它相当过时并且存在内存泄
  • SCNAudioPlayer 正在抛出 -10878

    我开始在 SceneKit 应用程序中播放这样的音频文件 它正在令人惊讶地播放文件 我可以调用第一个函数来重新开始播放 但在第一次调用启动播放器时 我多次收到此消息 我找不到原因 测试场景 17737 968214 投掷 10878 var
  • 如何使用 GCC 使源代码行与汇编输出内联?

    我想让 C 源代码行与汇编输出内联 以查看正在生成哪些代码 我尝试过 GCC 选项 例如 S Wa ahlms 乃至 Wa gstabs因为我在某处读到过 哦 顺便说一句 我使用的是 Mac 所以我没有objdump 抱歉 时间太短了 我要
  • 如何在 Swift 中控制其他应用程序的背景音乐?

    首先对我的英语感到抱歉 因为我是法国人 我研究一个连接的对象 它将数据发送到我的应用程序以开始 暂停 开始下一首音乐或先例并增加音量 我的应用程序必须对 iPhone 发出的任何音乐执行这些操作 例如 如果我在 Spotify 或 Deez
  • 修改哈希值的快捷方式

    我想知道下面的内容是否可以写得更短 var t String Int if t a nil t a 1 else t a append 2 也就是说 如果哈希值不存在 则分配该值并在其他情况下重新使用它 我知道我可以写一个像这样的函数 fu
  • 如何使用 libssl 安装 Siege?

    我正在尝试安装Siege https github com tail siege在 Mac OS 10 12 上使用 libssl 但是当我使用该实用程序针对httpsurl 我收到以下错误 错误 HTTPS 需要 libssl 无法访问h
  • 如何使用 PHPicker 从图库中获取 WebP 图像

    我有一个 PHPIckerViewController 自 iOS 14 起可用 我想从画廊获取 WEBP 格式的图像 但是 PHPicker 中的项目提供程序无法加载这种格式的图像 请告诉我如何使用新的选择器在 UIButton 上选择和
  • Xcode 10 构建失败,并显示“Command CompileSwift 失败,退出代码非零”

    我最近将 Xcode 更新到版本 10 并在尝试构建项目时开始收到一个奇怪的错误 我目前使用的是 Swift 4 0 我确实尝试升级到 Swift 4 2 版本 但是当我这样做时 我在许多框架中都收到了同样的错误 命令编译 Swift 失败
  • 使用 Jenkins 构建 Unity 项目失败

    我正在尝试在 Mac OS 服务器上使用 Jenkins 构建 Unity 项目 但是当我尝试运行以下脚本时 Applications Unity Unity app Contents MacOS Unity quit batchmode
  • OpenCV 捕获循环视频/不检测最后一帧

    我正在捕获一个 avi 文件并对其进行处理 我的代码已经工作了一段时间没有问题 但现在在捕获视频的最后一帧后它似乎没有停止 相反 它会不断循环回到视频的开头 我不明白为什么会发生这种情况 而且我想不出 Eclipse 或 OpenCV 有什
  • 当不从终端运行应用程序时,东西“打印”到哪里?

    所以我有一个 python 应用程序 正在使用 py2app 将其捆绑到 app 中 我在那里有一些调试打印语句 如果我在终端中运行代码 这些语句通常会打印到标准输出 如果我只是打开捆绑的 app 显然我看不到任何输出 即使我没有看到 这些
  • 导航栏标题视图对齐

    我希望我的导航栏在中间显示两件事 其中之一是列表名称 另一个是用户名称 用户名将放置在列表名称下 到目前为止我所做的是 我以编程方式创建了两个标签和一个超级视图 并设置titleView of navigationItem override
  • 在 MacOS 命令行上使用 Android Studio 内置 Java

    这里有很多关于在 Mac 上安装 Java 以及让 Android Studio 使用正确版本的信息 很多已经过时 但是最近版本的 Android Studio 2 2 及更高版本 提供了自己的 Java 对于大多数 Mac 用户来说 没有
  • iOS Swift:谷歌登录错误

    我正在关注this https developers google com identity sign in ios sign in ver swift before you begin使用 swift 在我的 iOS 应用程序中添加 go
  • 如何仅针对一项特定修改器更改应用动画?

    如何只申请 animation to offset同时保持其他修改器更改不受其影响 添加 animation偏移后也会使字体大小发生变化 Main view var body some View GeometryReader geo in
  • 将 WebView 保存为 PDF 返回空白图像?

    我正在尝试弄清楚如何将 WebView 保存到 PDF 并且完全卡住了 真的很感激一些帮助吗 我在 OSX 上的 Cocoa 和 Swift 中执行此操作 这是到目前为止我的代码 import Cocoa import WebKit cla

随机推荐