Kotlin/Java 实现 Html 转图片

发布于:2025-03-06 ⋅ 阅读:(16) ⋅ 点赞:(0)

1. Html2Image

<dependency>
	<groupId>gui.ava</groupId>
	<artifactId>html2image</artifactId>
	<version>2.0.1</version>
</dependency>

String HtmlTemplateStr = "....";// HTML
HtmlParser htmlParser = new HtmlParserImpl();
htmlParser.loadHtml(HtmlTemplateStr);
ImageRenderer imageRenderer = new ImageRendererImpl(htmlParser);
imageRenderer.saveImage("./image.png");
如果出现图片变红问题
public class ImageRendererSubImpl extends ImageRendererImpl {

    public ImageRendererSubImpl(DocumentHolder documentHolder) {
        super(documentHolder);
    }

    private String getImageFormat(String filename) {
        if (this.getImageFormat() != null) {
            return this.getImageFormat();
        } else {
            return filename != null ? FormatNameUtil.formatForFilename(filename) : FormatNameUtil.getDefaultFormat();
        }
    }

    private FSImageWriter getImageWriter(String imageFormat) {
        FSImageWriter imageWriter = new FSImageWriter(imageFormat);
        imageWriter.setWriteCompressionMode(this.getWriteCompressionMode());
        imageWriter.setWriteCompressionQuality(this.getWriteCompressionQuality());
        imageWriter.setWriteCompressionType(this.getWriteCompressionType());
        return imageWriter;
    }

    public void saveImage(File file) {
        try {
            BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(file));
            this.save(outputStream, file.getName(), true);
        } catch (IOException var3) {
            throw new RenderException("IOException while rendering image to " + file.getAbsolutePath(), var3);
        }
    }

    public void saveImage(String filename) {
        this.saveImage(new File(filename));
    }

    private void save(OutputStream outputStream, String filename, boolean closeStream) {
        try {
            String imageFormat = this.getImageFormat(filename);
            FSImageWriter imageWriter = this.getImageWriter(imageFormat);
            BufferedImage bufferedImage = this.getBufferedImage(getImageType(imageFormat));
            imageWriter.write(bufferedImage, outputStream);
        } catch (IOException var15) {
            throw new RenderException("IOException while rendering image", var15);
        } finally {
            if (closeStream) {
                try {
                    outputStream.close();
                } catch (IOException var14) {
                    ;
                }
            }

        }
    }

    /**
     * 获取图像类型
     * 根据图像的格式
     */
    public int getImageType(String imageFormat){
        if ("jpg".equalsIgnoreCase(imageFormat)){
            return BufferedImage.TYPE_3BYTE_BGR;
        }
        if ("bmp".equalsIgnoreCase(imageFormat)){
            return BufferedImage.TYPE_INT_RGB;
        }
        return BufferedImage.BITMASK;
    }

}

2. cssbox

<dependency>
    <groupId>net.sf.cssbox</groupId>
    <artifactId>cssbox</artifactId>
    <version>5.0.2</version>
</dependency>
try{
    // 创建 ImageRenderer 实例
    ImageRenderer render = new ImageRenderer();

    // 将文件路径转换为 URL
    File file = new File("./html.html");
    URL url = file.toURI().toURL();

    // 输出文件流
    FileOutputStream outputStream = new FileOutputStream("./html.png");

    // 调用 renderURL 方法
    render.renderURL(url.toString(), outputStream);

    // 关闭输出流
    outputStream.close();
} catch (IOException e) {
    e.printStackTrace();
}

3. Openhtmltopdf

<dependency>
    <groupId>io.github.openhtmltopdf</groupId>
    <artifactId>openhtmltopdf-java2d</artifactId>
    <version>1.1.24</version>
</dependency>

由于过于复杂这里使用基于的html转图片代码

<!-- https://mvnrepository.com/artifact/com.github.alotuser/html2image -->
<dependency>
    <groupId>com.github.alotuser</groupId>
    <artifactId>html2image</artifactId>
    <version>1.0.0</version>
</dependency>

 	String html=HtmlRender.readHtml("D://about.xhtml");
HtmlRender htmlRender=new HtmlRender(BufferedImage.TYPE_INT_RGB);//main: BufferedImage.TYPE_INT_ARGB
htmlRender.addFontDirectory("D:/myfonts");
//生成图片
htmlRender.toPng(html, "D://test.png");
//生成pdf文件
try (FileOutputStream outputStream = new FileOutputStream("D:/test.pdf")) {
	htmlRender.toPdf(html,outputStream);
 	}

4. wkhtmltopdf

底层是浏览器内核所以支持js
前往下载 https://wkhtmltopdf.org/downloads.html

在这里插入图片描述

自行使用命令行调用即可

5. chrome 进行渲染这里不展开了