Of course! Converting HTML to an image is a common requirement for generating reports, creating thumbnails, or saving web content for archival purposes. In Java, this is typically achieved by using a headless browser that can render the HTML and then capture the result as an image.

Here’s a comprehensive guide covering the most popular and effective Java libraries for this task, with detailed examples and explanations.
The Core Concept
The process involves these general steps:
- Setup a Headless Browser: Choose a Java library that can act as a browser. This library will parse the HTML, CSS, and JavaScript.
- Load the HTML: Provide the HTML content to the browser. This can be a string, a URL, or a local file.
- Configure Rendering: Set the viewport size (width and height), wait for any dynamic content (JavaScript) to load, and apply any necessary custom styles.
- Capture the Image: Instruct the browser to take a screenshot of the rendered content.
- Save the Image: Write the captured image data to a file (e.g., PNG, JPG).
Recommended Libraries
Here are the top libraries, categorized by their approach.
Flying Saucer (xhtmlrenderer) - Pure Java Solution
This is a classic, robust, and pure Java (no native dependencies) library. It's an excellent choice for server-side environments where you want to avoid native binaries.

- Pros:
- Pure Java, works on any platform with a JVM.
- Good CSS support (level 2.1).
- Mature and stable.
- Cons:
- No JavaScript support. It cannot render pages that rely on JavaScript for content or layout.
- Can be slower than browser-based solutions.
- Best for: Static HTML/CSS content, server-side report generation, environments where native dependencies are not allowed.
Selenium WebDriver - The Browser Automation Standard
Selenium is the industry standard for automating web browsers. It uses a real browser engine (like Chrome or Firefox) under the hood, making it extremely powerful.
- Pros:
- Excellent JavaScript support. It can render any modern web application.
- Supports all major browsers (Chrome, Firefox, Edge, Safari).
- Highly flexible and feature-rich.
- Cons:
- Requires the browser driver to be installed and managed.
- Slower and more resource-intensive than pure Java solutions.
- More complex setup.
- Best for: Dynamic, JavaScript-heavy web pages, applications that need to be pixel-perfect with a specific browser.
Aspose.Words - Commercial, All-in-One Document Processing
Aspose.Words is a powerful commercial library for document processing. It has a built-in feature to convert HTML to images with high fidelity.
- Pros:
- Excellent and consistent rendering.
- High-level API, very easy to use for basic conversions.
- Handles complex layouts well.
- Cons:
- Commercial software with a cost (though a free trial is available).
- Best for: Enterprise applications that need a reliable, high-quality, and well-supported solution for converting HTML to images or other document formats.
Code Examples
Let's dive into the code for the most popular options.
Setup: Add Dependencies
First, you need to add the necessary libraries to your project.

Using Maven (pom.xml)
For Flying Saucer:
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf-itext5</artifactId>
<version>9.1.22</version>
</dependency>
(Note: The pdf-itext5 artifact includes the core rendering library).
For Selenium WebDriver:
You also need to download the correct WebDriver for your chosen browser (e.g., chromedriver.exe for Chrome) and place it in your system's PATH or specify its location in your code.
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.10.0</version>
</dependency>
Example 1: Flying Saucer (Pure Java)
This example converts a simple HTML string to a PNG image.
import org.xhtmlrenderer.swing.Java2DRenderer;
import org.xhtmlrenderer.simple.XHTMLPanel;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
public class FlyingSaucerExample {
public static void main(String[] args) throws IOException {
// 1. The HTML content to convert
String html = "<html><head><style>" +
"body { font-family: sans-serif; }" +
"h1 { color: #2c3e50; }" +
".container { width: 500px; margin: 20px; }" +
"</style></head>" +
"<body>" +
" <div class='container'>" +
" <h1>Hello, Flying Saucer!</h1>" +
" <p>This is a paragraph generated from Java.</p>" +
" <table border='1' style='width:100%'>" +
" <tr><th>Header 1</th><th>Header 2</th></tr>" +
" <tr><td>Row 1, Cell 1</td><td>Row 1, Cell 2</td></tr>" +
" <tr><td>Row 2, Cell 1</td><td>Row 2, Cell 2</td></tr>" +
" </table>" +
" </div>" +
"</body></html>";
// Create a temporary file for the HTML content
File tempHtmlFile = File.createTempFile("temp", ".html");
Files.write(tempHtmlFile.toPath(), html.getBytes());
// 2. Create a renderer
// The second argument is the width of the viewport
Java2DRenderer renderer = new Java2DRenderer(tempHtmlFile, 800);
// 3. Render the page to a BufferedImage
// The second argument is the height. The renderer will automatically
// scroll to capture the full height of the content.
BufferedImage image = renderer.getImage(0, 2000); // Width 800, Height 2000
// 4. Save the image to a file
File outputFile = new File("output-flying-saucer.png");
try (OutputStream os = new FileOutputStream(outputFile)) {
javax.imageio.ImageIO.write(image, "png", os);
}
System.out.println("Image saved to: " + outputFile.getAbsolutePath());
tempHtmlFile.deleteOnExit();
}
}
Example 2: Selenium WebDriver (Chrome)
This example uses a headless Chrome browser to render the HTML, which supports JavaScript.
Prerequisite: Make sure you have Google Chrome and the corresponding chromedriver installed and in your system's PATH.
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URL;
public class SeleniumExample {
public static void main(String[] args) throws IOException {
// 1. Setup Chrome options for headless mode
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
options.addArguments("--disable-gpu");
options.addArguments("--window-size=1280,1024"); // Set a default window size
// 2. Initialize the WebDriver
// Make sure chromedriver is in your PATH
WebDriver driver = new ChromeDriver(options);
try {
// 3. Load the HTML content from a URL or a local file
// For a URL:
// driver.get("https://www.example.com");
// For local HTML file:
File htmlFile = new File("path/to/your/local/file.html");
driver.get(htmlFile.toURI().toString());
// 4. Take a screenshot of the entire page
// This captures the current viewport. For full-page screenshots,
// you need a helper library or a more complex approach.
File screenshotFile = ((org.openqa.selenium.TakesScreenshot) driver).getScreenshotAs(org.openqa.selenium.OutputType.FILE);
// 5. Save the screenshot
File destination = new File("output-selenium.png");
org.apache.commons.io.FileUtils.copyFile(screenshotFile, destination);
System.out.println("Screenshot saved to: " + destination.getAbsolutePath());
} finally {
// 6. Always close the browser
driver.quit();
}
}
}
Note on Full-Page Screenshots with Selenium: The standard getScreenshotAs method only captures the visible viewport. For a full-page screenshot, you would typically use a JavaScript snippet injected into the page to scroll and stitch multiple screenshots together. Libraries like Ashot can help with this.
Choosing the Right Library
| Feature / Library | Flying Saucer | Selenium WebDriver | Aspose.Words |
|---|---|---|---|
| JavaScript Support | ❌ No | ✅ Excellent | ✅ Good |
| Browser Fidelity | Good (renders its own engine) | Excellent (uses real browser) | Excellent |
| Dependencies | Pure Java | Requires browser & driver | Commercial JAR |
| Performance | Moderate | Slow (launches a browser) | Fast |
| Ease of Use | Moderate | Moderate | Very Easy |
| Cost | Free | Free | Commercial |
Summary:
- If your HTML is static and you need a pure Java, free solution, use Flying Saucer.
- If your HTML is dynamic (uses JavaScript) and you need pixel-perfect rendering like a real user would see, use Selenium WebDriver.
- If you need a robust, high-quality, and easy-to-use solution for a commercial project, evaluate Aspose.Words.
