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 结合无头浏览器会更好
相关推荐
午安~婉3 小时前
硅谷甄选(续2)首页
java·前端·javascript
掉鱼的猫3 小时前
全球首个支持 IETF JSONPath (RFC 9535) 标准的 Java 框架,Snack4-Jsonpath v4.0.0 发布
java·json
洋不写bug3 小时前
html表格,无序,有序,自定义,无语义,表单标签,特殊字符详解
前端·html
赶飞机偏偏下雨3 小时前
【Java笔记】消息队列
java·开发语言·笔记
豐儀麟阁贵3 小时前
2.6 代码注释与编码规
java·开发语言
程序员三明治3 小时前
【Mybatis从入门到入土】ResultMap映射、多表查询与缓存机制全解析
java·sql·缓存·mybatis·resultmap·缓存机制·多表查询
华仔啊3 小时前
Java 重试机制没写对,线上很容易出问题!这份生产级方案请收好
java·后端
你不是我我3 小时前
【Java 开发日记】什么是线程池?它的工作原理?
java·开发语言
我血条子呢4 小时前
[HTML]播放wav格式音频
前端·html·音视频
Seven974 小时前
剑指offer-35、数组中的逆序对
java·leetcode