Java html生成pdf和图片

在 Java 项目中将 HTML 生成图片是一项常见需求,特别是用于生成报告、预览页面截图等。不同的库和工具在渲染能力、性能以及支持的功能上有所不同。以下是几种主流的技术选型和对比,帮助你选择适合的解决方案。

技术对比总结

技术名称 优点 缺点 适用场景
Html2Image 简单易用,轻量级,Java 原生支持 支持 HTML、CSS 和 JS 的能力较弱 静态 HTML 到图片的简单场景
OpenHtmlToPdf 支持丰富的 HTML 和 CSS,输出多种格式 不支持 JS 动态内容,转换步骤稍复杂 静态 HTML 生成 PDF 或图片
wkhtmltoimage 高质量渲染,支持复杂 HTML、CSS 和 JS 需要外部工具,性能可能较慢 需要高质量渲染的复杂页面
Selenium + Headless 完全支持动态页面和 JavaScript 需要配置无头浏览器,资源消耗较大 动态网页、复杂前端页面的截图
Puppeteer 强大的渲染和操作能力,完全支持 HTML、CSS 和 JS 依赖 Node.js,集成较为复杂 动态网页渲染和交互,现代 Web 应用
Flying Saucer + Batik 支持 XHTML、CSS 和 SVG,适合标准化文档 不支持 JavaScript,支持的 CSS 有限 静态 HTML 和 SVG 文档生成

下面主要对Html2Image和OpenHtmlToPdf进行讲解说明

1. Html2Image

简介

Html2Image 是一个 Java 库,能够直接将 HTML 转换为图片。该库依赖于 Flying Saucer 等 HTML 渲染引擎来处理 HTML 和 CSS。

优点
  • 轻量级:易于使用,依赖较少。
  • Java 原生支持:无需外部工具,适合与 Java 项目集成。
缺点
  • CSS 支持有限:对复杂的 CSS 或 JavaScript 支持较弱。
  • 渲染效果一般:渲染复杂页面或带有动态效果的内容时效果不佳。
适用场景

适合静态页面和简单的 HTML 转换需求,如邮件内容、简单报告等。

代码示例
java 复制代码
   <dependency>
            <groupId>gui.ava</groupId>
            <artifactId>html2image</artifactId>
            <version>2.0.1</version>
        </dependency>

引包即用

java 复制代码
Html2Image html2Image = Html2Image.fromHtml("<html><body>Hello, World!</body></html>");
html2Image.saveAsImage(new File("output.png"));

2. OpenHtmlToPdf(强烈推介)

简介

OpenHtmlToPdf 是一个用于将 HTML 转换为 PDF 的 Java 库,但它也支持将 HTML 转换为 PNG 等图片格式。它基于 Flying Saucer 渲染 HTML。

优点
  • 支持复杂的 HTML 和 CSS:对大部分 HTML 和 CSS 有较好的支持。
  • 多格式支持:除了 PDF,也支持 PNG、JPG 输出。
缺点
  • 不支持 JS 动态内容 :不能处理需要 JavaScript 动态渲染的页面。需要额外引入中文字体包,对中文支持不是很友好。字体包链接提取
  • 相对复杂:需要渲染 PDF,再转换为图片,增加了步骤。
适用场景

适合生成静态报告、发票、合同等场景,尤其是同时需要生成 PDF 和图片格式时。

代码示例

需要引入如下包

java 复制代码
  <!-- Openhtmltopdf 用于将 HTML 转换为 PDF -->
        <dependency>
            <groupId>at.datenwort.openhtmltopdf</groupId>
            <artifactId>openhtmltopdf-java2d</artifactId>
            <version>1.1.3</version>
        </dependency>

        <!-- PDFBox 用于将 PDF 转换为图片 -->
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.24</version>
        </dependency>

        <!-- PDFBox 渲染依赖 -->
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox-tools</artifactId>
            <version>2.0.24</version>
        </dependency>

核心代码如下

java 复制代码
        ByteArrayOutputStream bao = new ByteArrayOutputStream();
        ITextRenderer renderer = new ITextRenderer();
        ITextFontResolver fontResolver = renderer.getFontResolver();
        // 设置字体
        fontResolver.addFont("中文字体包路径", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        renderer.setDocumentFromString(html);
        renderer.layout();
        renderer.createPDF(bao);

注意如果中文字体识别需要在html中指定字体包

例如:

html 复制代码
<body style="font-family: SimSun">

选择建议

  • 如果需要简单的 HTML 静态页面生成图片Html2ImageOpenHtmlToPdf 是较好的选择。
  • 如果需要高质量的图片输出 ,且页面较为复杂,使用 wkhtmltoimage 或 Selenium 结合无头浏览器会更好
相关推荐
IT枫斗者5 分钟前
集合工具类
java·linux·数据库·windows·算法·microsoft
吕永强6 分钟前
HTML表单标签
前端·html·表单标签
会敲代码的小张18 分钟前
设计模式-观察者模式
java·开发语言·后端·观察者模式·设计模式·代理模式
Smart-Space35 分钟前
HtmlRender - c++实现的html生成类
c++·html
程序猿!=程序员3 小时前
JAVA学习路线
java
Rivieres3 小时前
算法入门-贪心1
java·算法·leetcode·推荐算法
清风霁玥缘4 小时前
Maven入门学习
java·maven
中式代码美式咖啡5 小时前
记录开发一个英语听力训练网站
java·spring boot·bootstrap·音视频·语音识别
开 端5 小时前
文件批量添加水印和密码合并单元格完整版
java·ide·spring
.生产的驴6 小时前
SpringBoot 消息队列RabbitMQ 消息可靠性 数据持久化 与 LazyQueue
java·spring boot·后端·eclipse·rabbitmq·maven·java-rabbitmq