内容

Fuzio 可显示多种类型的内容,例如图片、视频、PDF、Flash 等;但在大多数情况下,你会显示网页的 HTML 内容。本指南介绍如何访问网页内容、获取当前选中的文本、在网页中查找文本、将网页保存为单个文件或一组文件等。

内容大小 

默认情况下,Browser大小为 1280x800 逻辑像素。你可以通过调用 Browser.resize(Size) 方法进行修改。

访问 HTML 

要获取表示某个 Frame 的 HTML 字符串,请使用 Frame.html() 方法。

请仅在 Frame 完全加载后调用该方法。否则,你可能会得到不完整的 HTML 或空字符串。

下面的示例演示如何打印当前已加载的主 Frame 的 HTML:

Java
Kotlin
browser.mainFrame().ifPresent(frame -> System.out.println(frame.html()));
println(browser.mainFrame?.html)

访问选区 

要以 HTML 形式获取当前已加载 Frame 中的选区内容,请使用 Frame.selectionAsHtml() 方法:

Java
Kotlin
var selectionAsHtml = frame.selectionAsHtml();
val selectionAsHtml = frame.selectionAsHtml()

如果你只需要选中的文本而不需要其 HTML,请使用 Frame.selectionAsText() 方法,如下例所示:

Java
Kotlin
var selectionAsText = frame.selectionAsText();
val selectionAsText = frame.selectionAsText()

查找文本 

Fuzio 允许你在当前加载的网页或 PDF 中查找文本,并高亮显示所有匹配项。

Fuzio 只会在已加载内容中、具有非空大小的可见区域内进行文本搜索。

要在当前加载的内容上执行搜索,请使用 TextFinder

Java
Kotlin
var textFinder = browser.textFinder();
val textFinder = browser.textFinder

下面的示例演示如何在当前加载的网页中,按指定参数查找 “text”,并等待搜索完成:

Java
Kotlin
// 在当前加载的网页中使用给定参数查找"text"。
textFinder.find("text", FindOptions.newBuilder()
        .matchCase(true)
        .build(), findResult -> {
    // 检查文本搜索是否已完成。
    if (findResult.isSearching()) {
        // Text Finder 仍在搜索文本。
        // 建议等待搜索完成。
    } else {
        // 文本搜索已完成,因此获取匹配项的总数。
        var numberOfMatches = findResult.numberOfMatches();
    }
});
// 在当前加载的网页中使用给定参数查找"text"。
val options = FindOptions(matchCase = true)
textFinder.find("text", options) { findResult ->
    // 检查文本搜索是否已完成。
    if (findResult.isSearching) {
        // Text Finder 仍在搜索文本。
        // 建议等待搜索完成。
    } else {
        // 文本搜索已完成,因此获取匹配项的总数。
        val numberOfMatches = findResult.numberOfMatches()
    }
}

搜索匹配项会高亮显示如下:

查找文本高亮

取消搜索 

要清除网页上的高亮搜索结果并取消搜索,请使用 TextFinder.stopFindingAndClearSelection()TextFinder.stopFindingAndKeepSelection() 方法。

For example:

Java
Kotlin
textFinder.stopFindingAndClearSelection();
textFinder.stopFindingAndClearSelection()

保存网页 

Fuzio 允许你将网页保存为单个文件或一组文件。

使用 Browser.saveWebPage(Path, Path, SavePageType),参数如下:

  • 目标文件的路径
  • 保存页面资源的目录路径
  • 保存操作的类型

请在保存前确保网页已完全加载。

此方法会立即启动保存过程并返回。因此,不能保证在方法返回时网页已完全保存。要确定网页何时完全保存,请使用 Java NIO API 检查目标文件的存在。

例如:

Java
Kotlin
var path = createTempDir("web_page");
var file = path.resolve("target.html");
var directory = path.resolve("resources");
if (browser.saveWebPage(file, directory, SavePageType.COMPLETE_HTML)) {
    // 保存过程已成功初始化。
} else {
    // 保存过程失败。
}
val path = createTempDirectory("web_page")
val file = path.resolve("target.html")
val directory = path.resolve("resources")
if (browser.saveWebPage(file, directory, SavePageType.COMPLETE_HTML)) {
    // The saving process has been initialized successfully.
} else {
    // The saving process has failed.
}

获取网页位图 

该库允许你获取一个位图(bitmap),其中包含当前已加载网页的像素。位图大小等于加载该网页的 Browser 实例的尺寸。

为了获取网页图像,我们建议按以下步骤操作:

  1. Browser 实例调整到所需尺寸(例如 1024×768)。
  2. 加载网页并等待网页主 Frame 完全加载。
  3. 获取当前已加载网页的位图。

下面的示例演示如何实现:

Java
Kotlin
// 创建并运行 Chromium engine。
var engine = Engine.newInstance(HARDWARE_ACCELERATED);
var browser = engine.newBrowser();

// 将浏览器调整为所需尺寸。
browser.resize(1024, 768);

// 加载所需的网页并等待其完全加载。
browser.navigation().loadUrlAndWait("https://html5test.jiku.co");

// 获取当前加载网页的位图。其大小将等于当前浏览器的大小。
var bitmap = browser.bitmap();
// 创建并运行 Chromium engine。
val engine = Engine(RenderingMode.HARDWARE_ACCELERATED)
val browser = engine.newBrowser()

// 将浏览器调整为所需尺寸。
browser.resize(1024, 768)

// 加载所需的网页并等待其完全加载。
browser.navigation.loadUrlAndWait("https://html5test.jiku.cm")

// 获取当前加载网页的位图。其大小将等于当前浏览器的大小。
val bitmap = browser.bitmap

获取的位图可以转换为 Java AWT 的 java.awt.image.BufferedImage 或 JavaFX 的 javafx.scene.image.Image 以进行进一步操作(例如保存为 PNG 文件)。

AWT BufferedImage 

下面的代码演示如何将 Bitmap 转换为 java.awt.image.BufferedImage,并保存为本地文件系统中的 bitmap.png

Java
Kotlin
import tech.fuzio.view.swing.graphics.BitmapImage;
...
// 获取位图。
var bitmap = browser.bitmap();

// 将位图转换为 java.awt.image.BufferedImage。
var image = BitmapImage.toToolkit(bitmap);

// 将图像保存到 PNG 文件。
ImageIO.write(image, "PNG", new File("bitmap.png"));
import tech.fuzio.view.swing.graphics.BitmapImage
...
// Take the bitmap.
val bitmap = browser.bitmap()

// Convert the bitmap to java.awt.image.BufferedImage.
val image = BitmapImage.toToolkit(bitmap)

// Save the image to a PNG file.
ImageIO.write(image, "PNG", File("bitmap.png"))

JavaFX Image 

下面的代码演示如何将 Bitmap 转换为 javafx.scene.image.Image ,并保存为本地文件系统中的 bitmap.png

Java
Kotlin
// 获取位图。
var bitmap = browser.bitmap();

// 将位图转换为 javafx.scene.image.Image。
var image = BitmapImage.toToolkit(bitmap);

// 将 javafx.scene.image.Image 转换为 java.awt.image.BufferedImage。
var bufferedImage = SwingFXUtils.fromFXImage(image, null);

// 将图像保存到 PNG 文件。
ImageIO.write(bufferedImage, "PNG", new File("bitmap.png"));
import tech.fuzio.view.javafx.graphics.BitmapImage
...
// 获取位图。
val bitmap = browser.bitmap

// 将位图转换为 javafx.scene.image.Image。
val image = BitmapImage.toToolkit(bitmap)

// 将 javafx.scene.image.Image 转换为 java.awt.image.BufferedImage。
val bufferedImage = SwingFXUtils.fromFXImage(image, null)

// 将图像保存到 PNG 文件。
ImageIO.write(bufferedImage, "PNG", File("bitmap.png"))

SWT Image 

要将 Bitmap 转换为 ImageData 并保存为本地文件系统中的 bitmap.png,请使用以下方法:

Java
Kotlin
import tech.fuzio.view.swt.graphics.BitmapImage;
...
// 获取位图。
var bitmap = browser.bitmap();

// 将位图转换为 org.eclipse.swt.graphics.Image。
var image = BitmapImage.toToolkit(display, bitmap);

// 将图像保存到 PNG 文件。
var loader = new ImageLoader();
loader.data = new ImageData[]{image.getImageData()};
loader.save("bitmap.png", SWT.IMAGE_PNG);
import tech.fuzio.view.swt.graphics.BitmapImage
...
// 获取位图。
val bitmap = browser.bitmap

// 将位图转换为 org.eclipse.swt.graphics.Image。
val image = BitmapImage.toToolkit(display, bitmap)

// 将图像保存到 PNG 文件。
val loader = ImageLoader()
loader.data = arrayOf(image.imageData)
loader.save("bitmap.png", SWT.IMAGE_PNG)

Web 存储 

Fuzio 允许你访问并操作 JavaScript Web Storage,它为浏览器提供了一种存储 键/值对 的机制,相比使用 Cookie 更直观。

Web Storage 有两种类型:

  • sessionStorage 会为每个 origin(源)维护独立的存储区,并在页面会话期间可用。
  • localStorage 也是如此,但即使浏览器关闭并重新打开也会保留。

要访问 session 和 local 的 Web Storage,请使用以下方式:

Java
Kotlin
WebStorage sessionStorage = frame.sessionStorage();
WebStorage localStorage = frame.localStorage();
val sessionStorage: WebStorage = frame.sessionStorage
val localStorage: WebStorage = frame.localStorage

localStorage 可以被禁用。在这种情况下,WebStorage 的方法会抛出 WebStorageSecurityException 错误。

要向存储中添加新条目,请使用 putItem(String, String) 方法:

Java
Kotlin
localStorage.putItem("Name", "Tom");
localStorage["Name"] = "李白"

要从存储中读取条目,请使用 item(String) 方法:

Java
Kotlin
var name = localStorage.item("Name");
val name = localStorage["Name"]

要检查条目是否存在,请将条目 key 传给 has(String) 方法:

Java
Kotlin
var hasName = localStorage.contains("Name");
val hasName = localStorage.contains("Name")

要读取存储中的所有条目,请使用 key(Integer)length() 方法遍历已存储的条目:

Java
Kotlin
var storageLength = localStorage.length();
for (int i = 0; i < storageLength; i++) {
    int index = i;
    localStorage.key(i).ifPresent(item -> {
        System.out.println("Item at [" + index + "] is " + item);
    });
}
val storageLength = localStorage.length
for (i in 0 until storageLength) {
    localStorage.key(i).ifPresent { item ->
        println("Item at [$i] is $item")
    }
}

要删除单个条目,请使用 removeItem(String) 方法:

Java
Kotlin
localStorage.removeItem("Name");
localStorage.removeItem("Name")

要一次性删除所有条目,请使用 clear() 方法:

Java
Kotlin
localStorage.clear();
localStorage.clear()
微信咨询

即库客服

微信公众号二维码

技术客服

微信公众号二维码