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 结合无头浏览器会更好
相关推荐
李慕婉学姐24 分钟前
【开题答辩过程】以《基于JAVA的校园即时配送系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·开发语言·数据库
奋进的芋圆2 小时前
Java 延时任务实现方案详解(适用于 Spring Boot 3)
java·spring boot·redis·rabbitmq
sxlishaobin2 小时前
设计模式之桥接模式
java·设计模式·桥接模式
model20052 小时前
alibaba linux3 系统盘网站迁移数据盘
java·服务器·前端
荒诞硬汉3 小时前
JavaBean相关补充
java·开发语言
提笔忘字的帝国3 小时前
【教程】macOS 如何完全卸载 Java 开发环境
java·开发语言·macos
2501_941882483 小时前
从灰度发布到流量切分的互联网工程语法控制与多语言实现实践思路随笔分享
java·开发语言
華勳全栈3 小时前
两天开发完成智能体平台
java·spring·go
alonewolf_994 小时前
Spring MVC重点功能底层源码深度解析
java·spring·mvc
沛沛老爹4 小时前
Java泛型擦除:原理、实践与应对策略
java·开发语言·人工智能·企业开发·发展趋势·技术原理