发布日期 2021年3月1日
JxBrowser 7.13
好消息!新版已经发布,包含许多新功能,现在可以下载。在此版本中,Chromium Engine 已升级至 88 版本,支持 macOS Big Sur。备受期待的打印 API 也已经引入。现在您可以通过编程方式打印网页和 PDF。
我们对公共 API 进行了一些更新。请查看从 JxBrowser 中移除的 API 部分以及我们建议使用的替代方案。
Chromium 88
Chromium 已更新至 88.0.4324.182 版本。
在此 Chromium 版本中,一些与 JxBrowser 封装的功能已被移除或更改,因此我们的库在此版本中引入了几个公共 API 的重大更改。
请查看此版本的迁移指南,了解哪些 API 已被移除以及应该使用的替代方案。
macOS Big Sur
您现在可以在基于 Intel 的 Mac 上运行 JxBrowser 的 macOS Big Sur 版本。我们计划在未来的某个版本中引入对 Apple Silicon 架构的支持。目前,您可以在 Rosetta 2 仿真模式下使用 JxBrowser。
Printing API
现在,您可以通过编程方式打印网页或 PDF 文档,而无需显示 **Print Preview(打印预览)**对话框。
使用新的 Printing API(打印 API),您可以:
- 选择打印机设备;
- 提供所需的打印设置,如纸张大小、方向、页面范围等;
- 获取打印完成时的通知;
- 取消打印;
- 将当前加载的网页保存为 PDF 文档,等等。
以下示例演示了如何将当前加载的网页保存为 PDF:
Browser browser = engine.newBrowser();
CountDownLatch latch = new CountDownLatch(1);
// 许通过编程方式打印网页
browser.set(PrintCallback.class, (params, tell) -> tell.print());
// 当网页即将打印时,配置打印设置并继续
browser.set(PrintHtmlCallback.class, (params, tell) -> {
// 选择 PDF 打印机作为目标设备
PdfPrinter<HtmlSettings> pdfPrinter = params.printers().pdfPrinter();
// 访问打印任务以配置其设置并注册事件
PrintJob<HtmlSettings> printJob = pdfPrinter.printJob();
// 监听打印完成事件
printJob.on(PrintCompleted.class, event -> latch.countDown());
// 配置所需的打印设置,包括目标 PDF 文件的路径
printJob.settings()
.pdfFilePath(Paths.get("/Users/vladimir/Desktop/google.pdf"))
.apply();
// 通知引擎我们希望使用给定的 PDF 打印机进行打印
tell.proceed(pdfPrinter);
});
// 加载网页并等待其完全加载
browser.navigation().loadUrlAndWait("https://google.com");
// 打印当前加载的网页
browser.mainFrame().ifPresent(Frame::print);
// 等待直到打印完成
if (latch.await(30, TimeUnit.SECONDS)) {
throw new IllegalStateException("Failed to save web page as PDF within 30 sec");
}
自定义方案
拦截请求的方法得到了改进。要使用自定义 jxb
方案拦截 URL 请求,请添加相应的方案并将其与拦截回调关联,如下例所示:
EngineOptions.Builder optionsBuilder = EngineOptions.newBuilder(OFF_SCREEN);
optionsBuilder.addScheme(Scheme.of("jxb"), params -> {
UrlRequestJob job = params.newUrlRequestJob(
UrlRequestJob.Options.newBuilder(HttpStatus.OK)
.addHttpHeader(HttpHeader.of("Content-Type", "text/html"))
.build());
job.write("<html><body>Hello!</body></html>".getBytes(UTF_8));
job.complete();
return Response.intercept(job);
});
Engine engine = Engine.newInstance(optionsBuilder.build());
现在,如果您加载 jxb://anyhost/anypage.html
,该 URL 请求将被拦截,并调用相关联的回调。您将会得到以下输出:
外部应用程序
操作系统中安装的某些应用程序可能与特定的 URI 方案关联。当用户导航到具有与已安装应用程序关联的方案的 URL 时,Chromium 将显示一个对话框,用户可以决定是否将链接在关联的外部应用程序中打开。
通过此更新,我们引入了回调函数,您可以使用它来拦截这种情况并向终端用户显示自定义的对话框,或者在不提示用户的情况下以编程方式打开外部应用程序。例如:
browser.set(OpenExternalAppCallback.class, (params, tell) -> tell.open());
当您创建 Swing、JavaFX 和 SWT 的 BrowserView
实例时,如果尚未注册该回调函数,系统会自动注册并显示相应的对话框:
改进
- 允许调整
Browser
的尺寸至 1x1。在之前的版本中,最小尺寸由操作系统定义。 - 启用多文件下载功能。现在,当您下载多个文件时,每个文件都会调用
StartDownloadCallback
回调。 - 处理 macOS 和 Linux 上部分系统调用被
EINTR
信号中断的情况。这可能导致 Chromium Engine 的本地崩溃。 - 允许通过
--hung-render-delay-seconds=45
Chromium 开关配置渲染进程无响应超时时间。 - 允许在
AuthenticateCallback
中使用空用户名和密码。
已修复的问题
- 在 Linux 上以硬件加速渲染模式在 SWT
BrowserView
中显示上下文菜单时出现(SWT:12502): GLib-GObject-CRITICAL **: 14:58:41.997: g_object_set_data: assertion 'G_IS_OBJECT (object)' failed
错误。 - 在硬件加速渲染模式下接收键盘事件时,数字键盘的按键码不正确。
IllegalStateException
在离屏渲染模式下关闭 SwingBrowserView
弹出窗口时出现IllegalStateException
错误。- 当组件嵌入到具有绝对布局的 Swing 容器中,并且它们在屏幕外渲染模式下以编程方式更改时,
BrowserView
边界未更新。 - 加载包含
src="data:image/gif;base64,R0lGODlhE...
的IFRAME
时,Main Chromium 进程崩溃。 - 当显示多个 “选择客户端 SSL 证书” 对话框并在其中一个对话框中选择自定义 SSL 证书时,Main Chromium 进程崩溃。
- 在离屏渲染模式下,Angular 应用程序无法“看到”某些键盘事件。
Frame.children()
方法返回所有嵌套子元素,而它应该只返回直接子元素。StartDownloadCallback.Action.cancel()
操作未能取消下载。
下载 JxBrowser 7.13
请提供您的电子邮箱地址,我们会尽快将下载说明发送给您。
我们无法发送电子邮件。请使用直接链接下载JxBrowser。
如果您已经是我们的注册客户,您无需任何操作,即可轻松享受此次更新。
如果您希望深入了解并体验我们的产品,您可以申请评估许可证。