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 转换需求,如邮件内容、简单报告等。
代码示例
<dependency><groupId>gui.ava</groupId><artifactId>html2image</artifactId><version>2.0.1</version></dependency>
引包即用
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 和图片格式时。
代码示例
需要引入如下包
<!-- 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>
核心代码如下
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中指定字体包
例如:
<body style="font-family: SimSun">
选择建议
- 如果需要简单的 HTML 静态页面生成图片,
Html2Image或OpenHtmlToPdf是较好的选择。 - 如果需要高质量的图片输出,且页面较为复杂,使用
wkhtmltoimage或 Selenium 结合无头浏览器会更好
相关文章:
Java html生成pdf和图片
在 Java 项目中将 HTML 生成图片是一项常见需求,特别是用于生成报告、预览页面截图等。不同的库和工具在渲染能力、性能以及支持的功能上有所不同。以下是几种主流的技术选型和对比,帮助你选择适合的解决方案。 技术对比总结 技术名称优点缺点适用场景…...
JavaWeb笔记整理——Redis
目录 Redis数据类型 各种数据类型的特点 Redis常用命令 字符串操作命令 哈希操作命令 列表操作命令 集合操作命令 有序集合操作命令 通用命令 在Java中操作Redis Spring Data Redis的使用方式 操作字符串类型的数据 编辑操作hash类型的数据 编辑 操作列表类…...
数据库(mysql)常用命令
一.常见的数据库端口号 Mysql默认端口:3306 oracle 默认端口:1521 Sql server 默认端口:1433 注:Mysql采用 的是C/S(客户端/服务器端)架构 二.sql 语法基础 服务器,数据库,数据表,记录,字段之间的关系: 一台Mysql服务器可以管理多个数据库 一个数据库可以存在多张二维表…...
源网荷储一体化新型电力系统解决方案
风光装机快速增长,加剧电力系统不可控性。截至2023H1,我国风电装机389.21GW,太阳能装机470.67GW,风光合计占总装机的31.76%。其中,2023年H1我国风电新增装机22.99GW,对比22年同期新增12.94GW,同…...
树莓派安装 OpenCV 教程
以下是在树莓派上安装 OpenCV 的教程: 笔者当前Python版本:3.7.3 一、更新树莓派系统 在终端中运行以下命令: sudo apt update sudo apt upgrade二、安装必要的依赖项 安装构建工具和图像 I/O 库: sudo apt install build-e…...
01,大数据总结,zookeeper
1 ,zookeeper :概述 1.1,zookeeper:作用 1 ,大数据领域 :存储配置数据 例如:hadoop 的 ha 配置信息,hbase 的配置信息,都存储在 zookeeper 2 ,应用领…...
伪工厂模式制造敌人
实现效果 1.敌人方实现 敌人代码 using UnityEngine; using UnityEngine.UI;public class EnemyBasics : MonoBehaviour {public int EnemySpeed { get; internal set; }public int EnemyAttackDistance { get; internal set; }public int EnemyChaseDistance { get; interna…...
【linux】pwd命令
pwd 命令在 Linux 和类 Unix 系统中用于显示当前工作目录的完整路径。它是 "print working directory" 的缩写。 当你在终端或命令行界面中工作时,你可能会在不同的目录(或文件夹)之间切换。pwd 命令帮助你确定你当前位于哪个目录…...
Python 如何封装工具类方法,以及使用md5加密
第一步:封装使用方法 在utils目录中,编写我的md5加密的方法,如下: import re import hashlib from os import path from typing import Callable from flask import current_app# 这里封装的是工具类的方法def basename(filenam…...
网络编程的应用
目录 1.单机程序和网络程序 2.客户端与服务端 3.网络编程三要素 3.1 IP地址 3.2 port端口 4.TCP编程 5.UDP编程 1.单机程序和网络程序 之前编写的程序都是单机程序,所有的业务功能实现及数据存储都在一个主机上完成,我们称为单机程序 我们在生活…...
佰朔资本:国内海风加速招标 船舶行业景气上行
昨日,沪指盘中一度下探失守2700点,尾盘在地产、银行等板块的带动下发力上扬,深证成指亦翻红。到收盘,沪指涨0.49%报2717.28点,深证成指涨0.11%报7992.25点,创业板指跌0.11%报1533.47点,上证50指…...
理解AAC和Opus的编码与解码流程
理解AAC和Opus的编码与解码流程及其在Android中的实现,对于音频开发非常重要。下面,我将详细解释这两种编码格式的原理、流程,并结合具体代码示例,帮助你在Android项目中合理地设计和使用它们。 一、AAC(Advanced Audio Coding) 1. AAC的原理与流程 AAC是一种有损音频压…...
设计图纸加密方法知多少?小编给你讲清楚
一、对称加密 使用对称加密算法,对设计图纸进行加密。对称加密使用相同的密钥进行加密和解密,确保只有持有正确密钥的人能够解密文件。 二、非对称加密 使用非对称加密算法,进行设计图纸的加密。非对称加密使用公钥加密、私钥解密的方式&a…...
pycv实时目标检测快速实现
使用python_cv实现目标实时检测 python 安装依赖核心代码快速使用实现结果展示enjoy python 安装依赖 opencv_python4.7.0.72 pandas1.5.3 tensorflow2.11.0 tensorflow_hub0.13.0 tensorflow_intel2.11.0 numpy1.23.5核心代码快速使用 # 使用了TensorFlow Hub和OpenCV库来实…...
记录下如何让字体在div内 自动换行 上下居中
div内样式 display: flex; // flex布局 justify-content: center; // 上下居中 align-items: center; // 左右居中 overflow-wrap: break-word; // 允许字体换行 (若行内的单词无法放下则换行) word-break: break-all; // 强制文本在任意字符间进…...
Shell篇之编写MySQL启动脚本
Shell篇之编写MySQL启动脚本 1. 脚本内容 vim mysql_ctl.sh#!/bin/bashmysql_port3306 mysql_username"root" mysql_password"molinker" mysql_conf"/opt/lanmp/mysql/etc/my.cnf" mysql_sock"/opt/lanmp/mysql/var/mysql.sock"func…...
supermap Iclient3d for cesium加载地形并夸大地形
先看效果图 这是没有夸张之前的都江堰 这是夸大五倍后的都江堰 下面展示代码 主要就是加载supermaponline的skt地形然后夸大 <template><div class"PartOneBox"><div id"cesiumContainer"></div></div> </template>…...
一文解读OLAP的工具和应用软件
OLAP(OnlineAnalyticalProcessing)是一种用于快速分析大规模、多维度数据的方法。OLAP工具和应用软件则是帮助人们进行OLAP分析的重要工具。本文将介绍几种常见的OLAP工具和应用软件,并探讨它们在数据分析中的作用。 一 OLAP工具的分类 在选…...
xml重点笔记(尚学堂 3h)
XML:可扩展标记语言 主要内容(了解即可) 1.XML介绍 2.DTD 3.XSD 4.DOM解析 6.SAX解析 学习目标 一. XML介绍 1.简介 XML(Extensible Markup Language) 可扩展标记语言,严格区分大小写 2.XML和HTML XML是用来传输和存储数据的。 XML多用在框架的配置文件…...
爬虫代理API的全面解析:让数据抓取更高效
在大数据时代,网络爬虫已经成为收集和分析数据的重要工具。然而,频繁的请求会导致IP被封禁,这时候爬虫代理API就显得尤为重要。本文将详细介绍爬虫代理API的作用、优势及如何使用,帮助你更高效地进行数据抓取。 什么是爬虫代理AP…...
本地柴油发电机组排行2023年最新榜单
柴油发电机是通过燃烧柴油驱动发动机,进而发电的设备,广泛应用于电力中断或无电网地区。1. 柴油发电机的核心工作原理是什么?柴油发电机是一种将化学能转化为电能的设备,其核心是柴油发动机与交流发电机的组合。当柴油在发动机内燃…...
从电磁炉到户外电源:拆解单相SVPWM如何让你的逆变器更安静、更高效
从电磁炉到户外电源:单相SVPWM如何实现静音与高效的双重突破当你深夜用电磁炉煮面时,是否曾被突然的蜂鸣声吓一跳?或是发现户外电源给设备充电时,散热风扇的噪音盖过了山林鸟鸣?这些常见问题背后,隐藏着一个…...
收藏必看|2026 版大厂 AI 岗位薪资曝光!普通程序员转型大模型最全指南
深夜收到大厂 HR 好友发来的内部资料,再三叮嘱切勿对外泄露。如今网络信息传播速度极快,这份 2026 年企业 AI 岗真实薪资内幕,也值得给广大程序员、零基础入行小白参考借鉴。 翻看完整薪资台账后,真切感受到当下大模型赛道的薪资差…...
照着用就行:2026 最新降AIGC软件测评与推荐
2026年真正好用的AI论文降重与改写工具,核心看降重效果、去AI味、格式保留、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 …...
Windows10下V-REP教育版安装保姆级教程(附百度网盘资源与避坑点)
Windows10系统V-REP教育版完整安装指南:从下载到实战避坑在机器人仿真和自动化控制领域,V-REP(现更名为CoppeliaSim)作为一款功能强大的跨平台机器人仿真软件,已经成为众多工科学生和研究人员的首选工具。特别是其教育…...
转行网络安全运维:从0到1的可落地指南
转行网络安全运维:从0到1的可落地指南 一、 「3个核心技能:从零起步也能会」 网上学习资料多到爆炸,不用纠结“哪个最好”,记住一句话:**能学会、能上手的就是好的**!不管是免费视频还是付费课,…...
DragonBones与Godot集成:骨骼动画的可编程化实践
1. 为什么在Godot里用DragonBones不是“锦上添花”,而是“绕不开的刚需” 去年上线一个横版动作手游Demo时,美术团队交来一套20个角色、每个角色含8套动画(待机/跑动/跳跃/攻击/受击/死亡/闪避/必杀)的Spine资源。我兴冲冲导入God…...
LVGL多页面开发避坑:用内部Timer替代轮询,解决页面切换时的内存踩踏问题
LVGL多页面开发中的内存安全实践:用Timer机制替代轮询的工程解决方案 在嵌入式UI开发中,LVGL因其轻量级和跨平台特性成为热门选择。但当项目复杂度提升到多页面交互时,开发者往往会遇到一个棘手问题:如何在频繁切换页面的同时保证…...
构建智能音乐档案:SoundCloud Downloader 的技术架构与实现哲学
构建智能音乐档案:SoundCloud Downloader 的技术架构与实现哲学 【免费下载链接】scdl Soundcloud Music Downloader 项目地址: https://gitcode.com/gh_mirrors/sc/scdl 在流媒体音乐主导的时代,音乐爱好者面临着一种矛盾:我们享受着…...
手机也能玩转无人机仿真:用安卓QGC App连接同一WiFi下的PX4 JMAVSim模拟器
手机也能玩转无人机仿真:用安卓QGC App连接同一WiFi下的PX4 JMAVSim模拟器 无人机开发者和爱好者们,是否曾想过用手机就能完成整个无人机仿真测试流程?告别笨重的电脑束缚,只需一部安卓设备,就能在沙发上调试飞控算法。…...
