Springboot Thymeleaf Html转Pdf

2023-11-05

新建项目

说明

用itextpdf写pdf,样式实在是太折磨了,这里选用Thymeleaf模板生成html转pdf,html+css写样式排版好太多了。

引入依赖

<!--html转pdf-->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>html2pdf</artifactId>
    <version>4.0.2</version>
</dependency>

配置Thymeleaf

application.yml
spring:
  thymeleaf:
    cache: false
    prefix: classpath:/templates/
    suffix: .html
    mode: HTML
    encoding: UTF-8

创建字体目录以及Pdf模板

创建以下文件

src/main/resources/font/cn.ttf *(cn.ttf必须是中文字体)
src/main/resources/templates/pdf.html

pdf.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8"/>
    <title>Title</title>
    <style>
        body {
            font-family: "Microsoft YaHei UI";
        }
    </style>
</head>
<body>
<h1>检测报告</h1>
<div>
    <p>
        <span>ID:</span>
        <span>007</span>
    </p>
    <p>
        <span>来源:</span>
        <span th:text="${sys}"></span>
    </p>
    <table border="1">
        <tr style="background-color: #f6f6f6">
            <th>id</th>
            <th>name</th>
            <th>age</th>
        </tr>
        <tr>
            <td>1</td>
            <td>tom</td>
            <td>20</td>
        </tr>
    </table>
</div>
</body>
</html>

创建Controller

TestControlle
package top.yxlhsx.thymeleafdemo;

import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.html2pdf.resolver.font.DefaultFontProvider;
import com.itextpdf.io.font.FontProgram;
import com.itextpdf.io.font.FontProgramFactory;
import com.itextpdf.layout.font.FontProvider;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;

@Controller
@RequestMapping("/test")
public class TestController {
	@Resource
    private TemplateEngine templateEngine;

    @GetMapping("pdf")
    public void importPdf() throws IOException{
        String outputFolder = "C:\\Users\\你的用户名\\Desktop\\新建文件夹\\test.pdf";
        OutputStream outputStream = Files.newOutputStream(Paths.get(outputFolder));

        Context context = new Context();
        context.setVariable("sys", "linux");

        String htmlStr = templateEngine.process("pdf", context);

        ConverterProperties properties = new ConverterProperties();
        FontProvider fontProvider = new DefaultFontProvider();
        FontProgram fontProgram = FontProgramFactory.createFont("font/cn.ttf");
        fontProvider.addFont(fontProgram);
        properties.setFontProvider(fontProvider);

        HtmlConverter.convertToPdf(htmlStr, outputStream, properties);
    }

}

注意

如果生成Html字符串时报 【java.lang.ClassNotFoundException: ognl.DefaultMemberAccess】 异常
<!--添加这个依赖即可-->
<!--而且最好是3.1.x版本,不然也报错-->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>html2pdf</artifactId>
    <version>4.0.2</version>
</dependency>

Pdf效果

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Springboot Thymeleaf Html转Pdf 的相关文章

  • 如何使用 Java 处理 Selenium WebDriver 中的新窗口?

    这是我的代码 driver findElement By id ImageButton5 click Thread sleep 3000 String winHandleBefore driver getWindowHandle drive
  • java中如何连接字符串

    这是我的字符串连接代码 StringSecret java public class StringSecret public static void main String args String s new String abc s co
  • 按下回车键时不刷新页面

    我遇到了一些问题 只要表单中有输入 回车键就会触发页面刷新 下面的代码 如果按下回车并且文本区域 input 中没有输入任何文本 则不会刷新页面 但是如果按下回车并且 input中有输入或者光标位于文本区域 我不确定是什么触发了它 因为 s
  • 删除 IE9 边缘周围的 2px 灰色边框

    我正在尝试对这个网站进行编码 尝试关键字 并且我正在尝试找出如何删除这个阴影2px灰色边框延伸到 IE9 窗口的内部 至少顶部 左侧和底部 我的边距设置为零 因此所有页面元素都到达页面的最边缘 但使用 IE9 它们会停在这个灰色边框处 我没
  • Cassandra java驱动程序协议版本和连接限制不匹配

    我使用的java驱动程序版本 2 1 4卡桑德拉版本 dsc cassandra 2 1 10cql 的输出给出以下内容 cqlsh 5 0 1 Cassandra 2 1 10 CQL spec 3 2 1 Native protocol
  • 当从服务类中调用时,Spring @Transactional 不适用于带注释的方法

    在下面的代码中 当方法内部 是从内部调用的方法外部 应该在交易范围内 但事实并非如此 但当方法内部 直接从调用我的控制器class 它受到事务的约束 有什么解释吗 这是控制器类 Controller public class MyContr
  • 我可以使用子接口重新编译公共 API 并保持二进制兼容性吗?

    我有一个公共 API 在多个项目中多次使用 public interface Process
  • 画透明圆,外面填充

    我有一个地图视图 我想在其上画一个圆圈以聚焦于给定区域 但我希望圆圈倒转 也就是说 圆的内部不是被填充 而是透明的 其他所有部分都被填充 请参阅这张图片了解我的意思 http i imgur com zxIMZ png 上半部分显示了我可以
  • Hazelcast 分布式锁与 iMap

    我们目前使用 Hazelcast 3 1 5 我有一个简单的分布式锁定机制 应该可以跨多个 JVM 节点提供线程安全性 代码非常简单 private static HazelcastInstance hInst getHazelcastIn
  • 使用 SQLITE 按最近的纬度和经度坐标排序

    我必须获得一个 SQLite SQL 语句 以便在给定初始位置的情况下按最近的纬度和经度坐标进行排序 这是我在 sqlite 数据库中的表的例句 SELECT id name lat lng FROM items EXAMPLE RESUL
  • Java 中的“Lambdifying”scala 函数

    使用Java和Apache Spark 已用Scala重写 面对旧的API方法 org apache spark rdd JdbcRDD构造函数 其参数为 AbstractFunction1 abstract class AbstractF
  • 如何始终将焦点保持在文本框中

    我创建了一个包含两个 div 的 HTML 页面 左侧的 div 页面的 90 是 ajax 结果的目标 右侧的 div 页面的 10 包含一个文本框 该页面的想法是在文本框中输入零件编号 通过条形码扫描仪 并显示与该零件编号匹配的绘图 显
  • 使用 Javascript 设置 cookie [重复]

    这个问题在这里已经有答案了 我正在尝试构建我的第一个移动应用程序 它需要连接到我的 mysql 数据库并使用 json 返回数据 这很好 目前我有一个登录系统 一旦确定用户名和密码存在 它就会返回一条成功消息 对于下一步 我想在我的页面上使
  • 如何知道抛出了哪个异常

    我正在对我们的代码库进行审查 有很多这样的陈述 try doSomething catch Exception e 但我想要一种方法来知道 doSomething 抛出了哪个异常 在 doSomething 的实现中没有 throw 语句
  • 游戏内的java.awt.Robot?

    我正在尝试使用下面的代码来模拟击键 当我打开记事本时 它工作正常 但当我打开我想使用它的游戏时 它没有执行任何操作 所以按键似乎不起作用 我尝试模拟鼠标移动和点击 这些动作确实有效 有谁知道如何解决这个问题 我发现这个问题 如何在游戏中使用
  • HQL Hibernate 内连接

    我怎样才能在 Hibernate 中编写这个 SQL 查询 我想使用 Hibernate 来创建查询 而不是创建数据库 SELECT FROM Employee e INNER JOIN Team t ON e Id team t Id t
  • Eclipse 中 Spring MVC 模型对象的 (jsp /jstl) 视图中的代码辅助

    在 Spring MVC 中 当将对象放置在视图模型中时 如下所示 public String getUser Model model fetch user model addAttribute user user return viewN
  • 如何使用 JSch 将多行命令输出存储到变量中

    所以 我有一段很好的代码 我很难理解 它允许我向我的服务器发送命令 并获得一行响应 该代码有效 但我想从服务器返回多行 主要类是 JSch jSch new JSch MyUserInfo ui new MyUserInfo String
  • 如何从 Maven 存储库引用本机 DLL?

    如果 JAR 附带 Maven 存储库中的本机 DLL 我需要在 pom xml 中放入什么才能将该 DLL 放入打包中 更具体地举个例子Jacob http search maven org artifactdetails 7Cnet s
  • 带有 Maven Wrapper 的 Java 17 导致无法识别的 VM 选项“MaxPermSize=512m”

    I use OpenJDK 17 https jdk java net 17 使用 Maven Wrapper 3 8 2 从春季初始化 https start spring io Maven项目 JAR打包 Java 17 Spring

随机推荐

  • Xcode升级后出现 unable to create '/Users/XXX/Library/Developer/Xcode....'的错误

    今天把Xcode从3 6升到了4 2 但是运行原本没有错误的工程的时候发现出现了N多错误 类型大致如题目所示 解决方法 打开实用工具 shift command U 然后打开终端 输入 sudo chmod R 777 Users XXX
  • 在el-select多选框里面设置input搜索框并能实现搜索功能

    效果 1 当在输入框里面输入内容时就开始进行筛选 下拉框显示筛选之后的数据 2 当没有符合条件时 显示无数据 3 清空输入框里面的内容后 下拉框显示全部的数据 思路 1 通过给搜索框设置oninput事件 oninput 当input的va
  • 在jupyter notebook中安装R核心

    在jupyter notebook中安装R核心 1 从R官网安装R language https www r project org 点击Download下面的CRAN 找到China 中国镜像站 任意选择一个就好 这里推荐第一个清华镜像
  • java.io.IOException: Stream closed解决办法

    1 出现这个bug的大体逻辑代码如下 1 private static void findMovieId throws Exception 2 File resultFile new File C 2016 txt 3 4 OutputSt
  • RESTful 风格详解

    一 什么是Restful风格 1 1 概念 RESTFUL是一种网络应用程序的设计风格和开发方式 基于HTTP 可以使用 XML 格式定义或 JSON 格式定义 最常用的数据格式是JSON 由于JSON能直接被JavaScript读取 所以
  • 任务列表 php,Laravel入门教程实战:任务列表(基础版)

    1 介绍 该快速入门指南提供了Laravel框架的基本介绍 包含了数据库迁移 Eloquent ORM 路由 验证 视图 Blade模版等内容 如果你是Laravel框架或者PHP框架的新手 这将是一个很好的起点 如果你已经在使用Larav
  • <数据结构>单链表基本功能实现

    文章目录 前言 一 单链表实验 二 使用步骤 1 链表基本功能 2 代码功能实现 总结 前言 提示 本篇主要是本小白大学期间对数据结构实验的一些基本代码功能实现 希望对一同数据结构的伙伴有所帮助 提示 以下是本篇文章正文内容 下面案例可供参
  • LINGO求解规划问题代码

    文章目录 线性规划 标量线性规划 矩阵线性规划 非线性规划 无特殊限制 整数规划 01规划 写在开头 LINGO默认所有变量是非负的 LINGO中没有严格的 lt 和 gt lt 代表 lt gt 代表 gt LINGO不区分变量的大小写
  • CentOS7.6 编译安装LNMP+Zabbix5.0

    一 服务器信息 操作系统 CentOS Linux release 7 6 1810 Core 环境 内网环境 无公网出口 YUM源 本地yum MySQL版本 5 7 32 Nginx版本 nginx 1 22 0 PHP版本 php 7
  • 在前端vue项目引入less,使用less,在less引用外部文件,在less中使用变量

    在前端vue项目引入less 使用less 在less引用外部文件 在less中使用变量 一 less是什么 二 操作步骤 1 引入库 2 设置style的lang属性 3 使用less less 中的 calc 总结 一 less是什么
  • 不带头结点的单链表c语言,不带头结点的单链表的实现(C语言)

    不带头结点的单链表的实现 C语言 不带头结点的单链表的实现 C语言 链表中的数据是以结点来表示的 每个结点的构成 元素 数据元素的映象 指针 指示后继元素存储位置 元素就是存储数据的存储单元 指针就是连接每个结点的地址数据 以 结点的序列
  • Zabbix的模板管理与配置

    Zabbix的模板管理与配置 一 查看默认模板的配置项 1 打开客户端信息配置界面 2 选择默认模板的监控项 二 服务端获取客户端的监控项 1 获取客户端系统相关监控项 2 获取客户端硬盘信息等相关监控项 三 创建自定义监控项的key 1
  • unity的lineRenderer

    本文转载自 http blog csdn net zuoyamin article details 8997729 LineRenderer线渲染器主要是用于在3D中渲染线段 虽然我们也可以使用GL图像库来渲染线段 但是使用LineRend
  • MCP2515板级驱动

    MCP2515板级驱动 前言 一 MCP2515简述 二 硬件连接 三 驱动源码 前言 在需要多路CAN接口应用场景 可选方案一般为带CAN接口的协处理器或者是独立的CAN控制器 独立的CAN控制器常用的有SJA1000 MCP2515等
  • 工具、学习网站

    目录 图片处理工具 1 BgRemover 在线图片去底工具 2 Convertio 文件转换器 3 视频转音频 4 视频转 Gif 5 传图识色 6 本地图片在线存储引用 Image Upload 7 RGB CMYK 转换工具 各大工具
  • 单链表实现

    代码 编写程序实现单向链表数据结构 public class Node Object data Node next public class MyLinkedList Node header 添加数据的方法 删除数据的方法 修改数据的方法
  • 【精】【Java8】===两个List集合取交集、并集、差集

    业务场景 根据用户查询权限 入参 UserCode lastQueryTime 上次查询时间 出参 权限变化的列表 oldList 上次查询到的权限列表 currList 当前查询到的权限列表 比对两个list找出 移除和增加的权限加以标识
  • Idea登录Github invalid authentication data. 404 Not Found-Not Foun

    转发地址 点击我
  • 用git拉代码

    1 新建远程仓库 下载和安装git 傻瓜方式next 登录或注册账号 进入界面创建仓库 1 2添加ssh公钥并下载项目 用vscode打开随便建一个文件 1 3git创建分支和切换分支 相当于分支是队员们的一套代码 主支是组长的 队员在分支
  • Springboot Thymeleaf Html转Pdf

    新建项目 说明 用itextpdf写pdf 样式实在是太折磨了 这里选用Thymeleaf模板生成html转pdf html css写样式排版好太多了 引入依赖