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

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 结合无头浏览器会更好

http://www.kler.cn/news/310406.html

相关文章:

  • 【kafka】基本概念
  • SAP学习笔记 - 开发06 - CDSView + Fiori Element 之 List Report
  • Vue3 项目引入阿里 iconfont 图标和字体的多种方式
  • 2024 VMpro 虚拟机中如何给Ubuntu Linux操作系统配置联网
  • 总结拓展十:SAP开发计划(上)
  • 新峰商城之分类三级联动实现
  • PyQt / PySide + Pywin32 + ctypes 自定义标题栏窗口 + 完全还原 Windows 原生窗口边框特效项目
  • html+css+js网页设计 旅游 龙门石窟8个页面
  • HarmonyOS ArkTS 用户首选项的开发及测试
  • AI大模型与产品经理:替代与合作的深度剖析
  • 概率论原理精解【14】
  • 计算机网络(七) —— https协议与网络安全证书
  • 问:Java中如何优雅退出线程?
  • 切换淘宝最新npm镜像源是
  • Day26_0.1基础学习MATLAB学习小技巧总结(26)——数据插值
  • 软件开发小程序服务器怎么挑选
  • 华为od手撕-数组元素top1
  • netstat命令详解
  • Vue 3 Composition API 实战技巧:组件间通信与SPA架构
  • 如何用Appium实现移动端UI自动化测试?
  • 达梦数据库SCHEMA使用初探
  • Android中的Intent的作用
  • 关于循环Socket创建超Linux文件句柄限制现象分析
  • Web接入Sonic平台之安装
  • 【yolo格式标签转VOC格式】
  • 滚雪球学SpringCloud[4.1讲]: Spring Cloud Gateway详解
  • mysql的分区表
  • 【Finetune】(一)、transformers之BitFit微调
  • ZLMediaKit Windows编译以及使用
  • 浅谈Spring Cloud:认识微服务