当前位置: 首页 > news >正文

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 静态页面生成图片Html2ImageOpenHtmlToPdf 是较好的选择。
  • 如果需要高质量的图片输出,且页面较为复杂,使用 wkhtmltoimage 或 Selenium 结合无头浏览器会更好

相关文章:

Java html生成pdf和图片

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

JavaWeb笔记整理——Redis

目录 Redis数据类型 各种数据类型的特点 Redis常用命令 字符串操作命令 哈希操作命令 列表操作命令 集合操作命令 有序集合操作命令 通用命令 在Java中操作Redis Spring Data Redis的使用方式 操作字符串类型的数据 ​编辑操作hash类型的数据 ​编辑 操作列表类…...

数据库(mysql)常用命令

一.常见的数据库端口号 Mysql默认端口:3306 oracle 默认端口:1521 Sql server 默认端口:1433 注:Mysql采用 的是C/S(客户端/服务器端)架构 二.sql 语法基础 服务器,数据库,数据表,记录,字段之间的关系: 一台Mysql服务器可以管理多个数据库 一个数据库可以存在多张二维表…...

源网荷储一体化新型电力系统解决方案

风光装机快速增长&#xff0c;加剧电力系统不可控性。截至2023H1&#xff0c;我国风电装机389.21GW&#xff0c;太阳能装机470.67GW&#xff0c;风光合计占总装机的31.76%。其中&#xff0c;2023年H1我国风电新增装机22.99GW&#xff0c;对比22年同期新增12.94GW&#xff0c;同…...

树莓派安装 OpenCV 教程

以下是在树莓派上安装 OpenCV 的教程&#xff1a; 笔者当前Python版本&#xff1a;3.7.3 一、更新树莓派系统 在终端中运行以下命令&#xff1a; sudo apt update sudo apt upgrade二、安装必要的依赖项 安装构建工具和图像 I/O 库&#xff1a; sudo apt install build-e…...

01,大数据总结,zookeeper

1 &#xff0c;zookeeper &#xff1a;概述 1.1&#xff0c;zookeeper&#xff1a;作用 1 &#xff0c;大数据领域 &#xff1a;存储配置数据   例如&#xff1a;hadoop 的 ha 配置信息&#xff0c;hbase 的配置信息&#xff0c;都存储在 zookeeper 2 &#xff0c;应用领…...

伪工厂模式制造敌人

实现效果 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" 的缩写。 当你在终端或命令行界面中工作时&#xff0c;你可能会在不同的目录&#xff08;或文件夹&#xff09;之间切换。pwd 命令帮助你确定你当前位于哪个目录…...

Python 如何封装工具类方法,以及使用md5加密

第一步&#xff1a;封装使用方法 在utils目录中&#xff0c;编写我的md5加密的方法&#xff0c;如下&#xff1a; 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.单机程序和网络程序 之前编写的程序都是单机程序&#xff0c;所有的业务功能实现及数据存储都在一个主机上完成&#xff0c;我们称为单机程序 我们在生活…...

佰朔资本:国内海风加速招标 船舶行业景气上行

昨日&#xff0c;沪指盘中一度下探失守2700点&#xff0c;尾盘在地产、银行等板块的带动下发力上扬&#xff0c;深证成指亦翻红。到收盘&#xff0c;沪指涨0.49%报2717.28点&#xff0c;深证成指涨0.11%报7992.25点&#xff0c;创业板指跌0.11%报1533.47点&#xff0c;上证50指…...

理解AAC和Opus的编码与解码流程

理解AAC和Opus的编码与解码流程及其在Android中的实现,对于音频开发非常重要。下面,我将详细解释这两种编码格式的原理、流程,并结合具体代码示例,帮助你在Android项目中合理地设计和使用它们。 一、AAC(Advanced Audio Coding) 1. AAC的原理与流程 AAC是一种有损音频压…...

设计图纸加密方法知多少?小编给你讲清楚

一、对称加密 使用对称加密算法&#xff0c;对设计图纸进行加密。对称加密使用相同的密钥进行加密和解密&#xff0c;确保只有持有正确密钥的人能够解密文件。 二、非对称加密 使用非对称加密算法&#xff0c;进行设计图纸的加密。非对称加密使用公钥加密、私钥解密的方式&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; // 允许字体换行 &#xff08;若行内的单词无法放下则换行&#xff09; 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&#xff08;OnlineAnalyticalProcessing&#xff09;是一种用于快速分析大规模、多维度数据的方法。OLAP工具和应用软件则是帮助人们进行OLAP分析的重要工具。本文将介绍几种常见的OLAP工具和应用软件&#xff0c;并探讨它们在数据分析中的作用。 一 OLAP工具的分类 在选…...

xml重点笔记(尚学堂 3h)

XML:可扩展标记语言 主要内容(了解即可) 1.XML介绍 2.DTD 3.XSD 4.DOM解析 6.SAX解析 学习目标 一. XML介绍 1.简介 XML(Extensible Markup Language) 可扩展标记语言&#xff0c;严格区分大小写 2.XML和HTML XML是用来传输和存储数据的。 XML多用在框架的配置文件…...

爬虫代理API的全面解析:让数据抓取更高效

在大数据时代&#xff0c;网络爬虫已经成为收集和分析数据的重要工具。然而&#xff0c;频繁的请求会导致IP被封禁&#xff0c;这时候爬虫代理API就显得尤为重要。本文将详细介绍爬虫代理API的作用、优势及如何使用&#xff0c;帮助你更高效地进行数据抓取。 什么是爬虫代理AP…...

PCL 点云中的植被信息提取(C++详细过程版)

目录 一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接,首发于:2024年9月18日。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的抄袭狗。 一、算法原理 1、原理概述 点云具有丰富的色彩信息,可以与植被指数结合使…...

requests-html的具体使用方法有哪些?

‌requests-html是一个功能强大的Python库&#xff0c;用于发送HTTP请求和解析HTML内容。它的使用方法包括安装库、基本使用、发送带有参数的请求、图片抓取实战案例、解析网页内容、执行JavaScript代码、使用CSS选择器来查找元素、继续跟踪链接并获取内容等。‌ ‌安装request…...

YOLOv9改进策略【卷积层】| AKConv: 具有任意采样形状和任意参数数量的卷积核

一、本文介绍 本文记录的是利用AKConv优化YOLOv9的目标检测网络模型。标准卷积操作的卷积运算局限于局部窗口&#xff0c;无法捕获其他位置的信息&#xff0c;且采样形状固定&#xff0c;无法适应不同数据集和位置中目标形状的变化。而AKConv旨在为卷积核提供任意数量的参数和…...

图神经网络池化方法

图神经网络池化方法 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 图神经网络池化方法前言一、扁平图池化二、分层图池化1.节点聚类池化2.节点丢弃池化 参考文献 前言 图池化操作根据其池化策略的差异&#xff…...

小琳AI课堂:确保大语言模型安全的八大策略--从数据隐私到用户教育

大家好&#xff0c;这里是小琳AI课堂。今天我们深入探讨如何保证大语言模型的安全&#xff0c;这可是关系到我们每个人哦&#xff01;&#x1f510; 首先&#xff0c;我们要明白&#xff0c;保证大语言模型的安全&#xff0c;需要从多个方面入手&#xff0c;确保模型在技术、法…...

Python 数学建模——高斯核密度估计

文章目录 前言原理代码实例scipy 实现seaborn 实现 前言 高斯核密度估计本是一种机器学习算法&#xff0c;在数学建模中也可以发挥作用。本文主要讨论用它来拟合变量的概率密度&#xff0c;获得概率密度函数 f ( x ) f(x) f(x)。 原理 已知一个连续型随机变量 X X X 的一系列…...

Flink+Spark相关记录

FlinkSpark相关记录 FlinkSQL Flink Streaming的一些点覆写RichSource、RichSink、RichMap 1.Source自动负载均衡&#xff0c;CDC源端加入一个全局调控的节点监控流量流速 2.Sink并发写入 3.Map与Iterator与增量迭代等用法关于Checkpoint几个用法 1.提交Commit至目的端数据库 2…...

2023 hnust 湖科大 毕业实习 报告+实习鉴定表

2023 hnust 湖科大 毕业实习 报告实习鉴定表 岗位 IT公司机房运维 实习报告 实习鉴定表 常见疑问 hnust 湖科大 毕业实习常见问题30问&#xff08;2021 年7月&#xff0c;V0.9&#xff09;-CSDN博客时间&#xff1a;大四开学第三四周毕业实习23年是企业&#xff08;黑马&am…...

ConflictingBeanDefinitionException | 运行SpringBoot项目时报错bean定义冲突解决方案

具体报错&#xff1a; Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name ‘CommissionMapperImpl’ for bean class [com.xxx.mapper.carrier.CommissionMapperImpl] conflicts with existing, non-co…...

如何切换淘宝最新镜像源(npm)【2024版】

在使用 Node.js 和 npm 进行开发时&#xff0c;大家通常会遇到 npm 源速度较慢的问题。特别是当你需要安装大量依赖时&#xff0c;npm 官方源的速度可能不尽如人意。幸运的是&#xff0c;淘宝提供了一个更快速的 npm 镜像源&#xff0c;可以让你更快地下载和安装包。本文将介绍…...