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

批量生成不同用户的pdf 文件(html样式)

技术 selenium + thymeleaf + itextpdf + chromedriver
使用thymeleaf 将动态数据替换
使用selenium +chromedriver 进行js ,css等逻辑运算后渲染视图
使用itextpdf 将html 转为pdf 文件

html模板

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>My Page</title><!-- 引入 jQuery 库 --><script src="https://code.jquery.com/jquery-3.6.0.min.js"></script><style>body {font-family: 'SimSun', 'SimHei', sans-serif;}</style><!-- 引入 G2 库 -->
<!--    <script src="https://gw.alipayobjects.com/os/lib/antv/g2/4.1.16/dist/g2.min.js"></script>-->
</head>
<body>
<h1 th:text="${title}">cser</h1>
<div id="content"></div>
<script type="text/javascript" th:inline="javascript">/*<![CDATA[*/document.addEventListener('DOMContentLoaded', function() {$('#content').html("<select name='status'>"+"   <option value='测试'>111</option>"+"   <option value='测试2'>222</option>"+"</select>")let titlenew = "测试"; // 确保这里赋值正确document.querySelector('h1').innerText = titlenew;document.title = titlenew; // 更新浏览器标签页的标题});/*]]>*/
</script></body>
</html>

执行代码

public void generatePdf(HttpServletResponse response) throws IOException {// 设置 ChromeDriver 路径// 设置 ChromeDriver 路径System.setProperty("webdriver.chrome.driver", "D:/chromedriver.exe");// 初始化 WebDriver// 设置chrome选项ChromeOptions options = new ChromeOptions();
//        options.setBinary("D:\\chromedriver\\chrome/chrome.exe");options.setBinary("C:\\Chrome\\Application/chrome.exe");options.addArguments("--headless");options.addArguments("--disable-gpu");WebDriver driver = new ChromeDriver(options);// 动态数据Map<String, Object> data = new HashMap<>();data.put("title", "Hello, World!");data.put("condition", "true");
//        data.put("imagePath", imagePath); // 路径// 使用 Thymeleaf 渲染模板Context context = new Context();context.setVariables(data);String htmlContent = templateEngine.process("templates", context);try {driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(60));// 将 htmlContent 进行 Base64 编码byte[] base64EncodedBytes = Base64.getEncoder().encode(htmlContent.getBytes(StandardCharsets.UTF_8));String base64EncodedHtmlContent = new String(base64EncodedBytes);// 构建完整的 data URLhtmlContent = "data:text/html;base64," + base64EncodedHtmlContent;// 加载HTML内容
//            htmlContent = "data:text/html;charset=utf-8," + encodedHtmlContent;driver.get(htmlContent);// 等待JavaScript执行完成Thread.sleep(3000); // 等待3秒,确保JavaScript执行完成//获取全部的htmlString pageSource = driver.getPageSource();
//            // 获取最终的HTML内容
//            WebElement body = driver.findElement(By.tagName("html"));
//            String renderedHtml = body.getAttribute("outerHTML");try (FileOutputStream outputStream = new FileOutputStream(filePath)) {// 使用字体文件路径创建字体对象String fontPath = "chromedriver/cs.TTF";FontProgram font = FontProgramFactory.createFont(fontPath);// 创建 DefaultFontProvider 并设置字体DefaultFontProvider fontProvider = new DefaultFontProvider(false, false, true);fontProvider.addFont(font);// 创建 ConverterProperties 并设置字体提供者ConverterProperties converterProperties = new ConverterProperties();converterProperties.setFontProvider(fontProvider);HtmlConverter.convertToPdf(pageSource, outputStream, converterProperties);} catch (Exception e) {e.printStackTrace();}} catch (InterruptedException e) {driver.close();}}

pom 依赖

		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java --><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.27.0</version></dependency><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-chrome-driver</artifactId><version>4.27.0</version> <!-- 确保与 selenium-java 版本一致 --></dependency><!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-remote-driver --><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-remote-driver</artifactId><version>4.27.0</version></dependency><!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-api --><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-api</artifactId><version>4.27.0</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.11</version></dependency>

相关文章:

批量生成不同用户的pdf 文件(html样式)

技术 selenium thymeleaf itextpdf chromedriver 使用thymeleaf 将动态数据替换 使用selenium chromedriver 进行js &#xff0c;css等逻辑运算后渲染视图 使用itextpdf 将html 转为pdf 文件 html模板 <!DOCTYPE html> <html xmlns:th"http://www.thymeleaf…...

混淆零碎知识点

minifyEnabled true //混淆开关 zipAlignEnabled true // Zipalign优化 shrinkResources true // 移除无用的resource文件 &#xff08;必须要混淆开了之后才才可以设置为true&#xff09; proguard-rules.pro 为混淆文件 //整个文件保留 不被混淆 -keep class com.cn…...

排序算法2

排序算法1-CSDN博客 排序算法1中提及的是较为基础(暴力实现&#xff0c;复杂度较高)的排序算法&#xff0c;不适合于数据量较大的场景&#xff0c;比如序列长度达到1e5 接下来以蓝桥另一道题目来理解其它的排序算法 蓝桥3226 蓝桥账户中心 样例 5 1 5 9 3 7 4、快速排序 快速排…...

【Web开发基础学习——corsheaders 应用的理解】

Web开发基础学习系列文章目录 第一章 基础知识学习之corsheaders 应用的理解 文章目录 Web开发基础学习系列文章目录前言一、使用1.1 安装1.2 配置 二、功能总结 前言 corsheaders 是一个 Django 第三方应用&#xff0c;用于处理跨域资源共享 (CORS)。CORS 是一种机制&#x…...

Redis和MySQL之间如何进行数据同步

原因 为什么要进行Redis和MySQL的数据同步&#xff1f; 性能优化&#xff1a;MySQL是关系型数据库&#xff0c;数据读取和存储相对复杂&#xff1b;Redis是内存数据库&#xff0c;读写速度极快&#xff0c;将热点数据存在Redis&#xff0c;可以大大提高系统的访问速度。 数据…...

css:转换

转换 移动 /* transform: translate(100px, 200px); */transform: translateX(100px);transform: translateY(100px); /*一个意思*/ 如果后面跟百分数的意思是移动盒子自身x/y方向长度的百分比&#xff0c;可以用作子绝父相控制盒子水平居中垂直居中 translate里的xy值是相对…...

状态管理与存储:Vuex 和 sessionStorage

1. sessionStorage 存储位置 sessionStorage 是浏览器提供的 Web Storage API 的一部分&#xff0c;用于在一个会话期间存储数据。数据保存在浏览器的 内存 中&#xff0c;而不是在硬盘上&#xff0c;且其生命周期仅限于当前浏览器标签页。数据在浏览器窗口或标签页关闭时会被…...

Redis和MySQL保持一致性的延迟双删(Delay Double Delete)策略

Redis和MySQL保持一致性的延迟双删&#xff08;Delay Double Delete&#xff09;策略&#xff0c;是一种在数据更新或删除时为了保证数据一致性而采取的方法。以下是延迟双删的过程和原理的详细解释&#xff1a; 一、过程 第一次删除缓存&#xff1a; 当需要更新数据库中的数据…...

快速理解微服务中Fegin的概念

一.由来 1.在传统的架构里面&#xff0c;我们是通过使用RestTemplate来访问其他的服务&#xff0c;但是这种方式就存在了一个很大的缺陷&#xff0c;也就是被调用方如果发生了服务的迁移(IP和端口发生了变化)&#xff0c;那么调用方也需要同步的在代码里面进行修改&#xff0c;…...

新增工作台模块,任务中心支持一键重跑,MeterSphere开源持续测试工具v3.5版本发布

2024年11月28日&#xff0c;MeterSphere开源持续测试工具正式发布v3.5版本。 在这一版本中&#xff0c;MeterSphere新增工作台模块&#xff0c;工作台可以统一汇总系统数据&#xff0c;提升测试数据的可视化程度并增强对数据的分析能力&#xff0c;为管理者提供测试工作的全局…...

快速搭建一个博客!!!“Halo框架深度优化:搭建你的个性化博客或网站”

目录 引言&#xff1a; 一. 首先服务器上去下载一个docker 1.可以参考官方地址&#xff1a; 2. 通过宝塔来一键安装&#xff01;&#xff01;&#xff01; 3.也可以自己下载&#xff01;&#xff01;&#xff01; 1.卸载旧版 2.配置Docker的yum库 3.安装Docker 4.启动和…...

009 STM32 HAL库介绍

STM32 HAL库&#xff08;Hardware Abstraction Layer&#xff09;是STMicroelectronics为STM32系列微控制器提供的一套硬件抽象层库&#xff0c;它旨在简化STM32的开发过程&#xff0c;提高代码的可移植性和可维护性。HAL库通过提供一组统一的API接口&#xff0c;使得开发者无需…...

【微服务】 Eureka和Ribbon

一、Eureka 服务调用出现的问题&#xff1a;在远程调用另一个服务时&#xff0c;我们采用的解决办法是发送一次http请求&#xff0c;每次环境的变更会产生新的地址&#xff0c;所以采用硬编码会出现很多麻烦&#xff0c;并且为了应对并发问题&#xff0c;采用分布式部署&#…...

6.算法移植第六篇 YOLOV5/rknn生成可执行文件部署在RK3568上

接上一篇文章best-sim.rknn模型生成好后&#xff0c;我们要将其转换成可执行文件运行在RK3568上&#xff0c;这一步需要在rknpu上进行&#xff0c;在强调一遍&#xff01;&#xff01;rknpu的作用是可以直接生成在开发板上运行的程序 退出上一步的docker环境 exit1.复制best-…...

element的el-table表格标题用css自定义是否必填,用添加伪类的方式标红色*

element的el-table表格标题用css自定义是否必填添加伪类红色 * 效果图如下&#x1f447; el-table组件的html部分 css部分 /deep/.el-table__header-wrapper{.el-table__header{.has-gutter tr .el-table__cell:nth-of-type(3) .cell:before{content: *;color:red}.has-gutte…...

数据仓库: 8- 数据仓库性能优化

CSDN 目录展示 目录 8- 数据仓库性能优化8.1 查询优化8.1.1 索引优化8.1.2 分区和分桶8.1.3 使用缓存8.1.4 查询简化与重写8.1.5 聚合优化8.1.6 并行化和分布式计算8.1.7 基于列存储的优化8.1.8 表的分区和数据清洗8.1.9 查询提示 (Hints)8.1.10 自动调优工具 8.2 索引设计8.2…...

可编程网络在分布式深度学习通信瓶颈控制中的应用与未来展望

目录 可编程网络在分布式深度学习通信瓶颈控制中的应用与未来展望 可编程网络在分布式深度学习通信瓶颈控制中的应用与未来展望 在分布式深度学习领域,随着模型规模的不断扩大,训练过程中的通信开销已成为制约性能提升的关键因素。传统的分布式训练方法面临高通信延迟和带宽…...

【论文笔记】Tool Learning with Foundation Models 论文笔记

Tool Learning with Foundation Models 论文笔记 文章目录 Tool Learning with Foundation Models 论文笔记摘要背景&#xff1a;工作&#xff1a; 引言工具学习的发展本文工作&#xff08;大纲&目录&#xff09; 背景2.1 工具使用的认知起源2.2 工具分类&#xff1a;用户界…...

Springfox迁移到 Springdoc OpenAPI 3

将项目从 Springfox 迁移到 Springdoc OpenAPI 3 时&#xff0c;主要的工作是将原先使用的 Springfox 注解替换为 Springdoc OpenAPI 3 中的对应注解。虽然 Springdoc OpenAPI 3 基于 OpenAPI 3 规范&#xff0c;并且有一些不同的命名方式和设计理念&#xff0c;但大部分注解的…...

DIY-Tomcat part 3 实现对动态资源的请求

实现ServletRequest package connector;import javax.servlet.RequestDispatcher; import javax.servlet.ServletInputStream; import javax.servlet.ServletRequest; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.i…...

科研人狂喜!AI生成的位图可以转矢量图了

今天给大家分享我最近挖到的宝藏科研工具&#xff1a;MedPeer「图片创作」——国内领先的垂直领域AI科研绘图工具&#xff0c;刚好解决我们科研人最头疼的几个痛点。尤其是它的人工绘图转换服务&#xff0c;简直是帮我解决了大麻烦&#xff0c;必须给大家捋捋明白。我们科研人绘…...

【信息科学与工程学】【通信工程】第四十三篇 骨干网方案设计-02跨境网络

一、方案 1.1 整体方案设计概要 设计的云网融合方案,综合考虑其全球互联需求、安全合规性、性能优化及跨国运营挑战: ​1.1.1、需求分析 ​网络互联需求:​​ ​国内互通:​​ 安全、稳定、低延迟连接中国大陆(严格合规要求)。 ​国际互通:​​ 高性能连接美国(东西海…...

电子设备散热风扇控制技术详解与应用

1. 电子设备散热风扇控制技术概述现代电子设备正朝着小型化、高性能方向发展&#xff0c;随之而来的散热问题日益突出。以笔记本电脑为例&#xff0c;其厚度从十年前的30mm缩减到如今的15mm以下&#xff0c;但CPU功耗却从15W提升到45W甚至更高。这种"体积缩小、功耗增加&q…...

如何准确计算宏基因组覆盖率?CoverM工具的全方位技术解析

如何准确计算宏基因组覆盖率&#xff1f;CoverM工具的全方位技术解析 【免费下载链接】CoverM Read alignment statistics for metagenomics 项目地址: https://gitcode.com/gh_mirrors/co/CoverM 在宏基因组研究中&#xff0c;覆盖率计算是评估测序深度、估算物种丰度和…...

【高通SDM660平台】Camera 驱动 Bringup 实战:从 DTS 配置到 Vendor 模块集成

1. 高通SDM660平台Camera驱动Bringup概述 当你拿到一块基于高通SDM660平台的新硬件时&#xff0c;Camera驱动的Bringup工作可能会让你感到有些头疼。作为一个在这个领域摸爬滚打多年的工程师&#xff0c;我想分享一些实战经验&#xff0c;帮助你快速点亮Camera功能并完成基础调…...

如何利用本地自动化工具提升英雄联盟游戏体验:3个核心功能详解

如何利用本地自动化工具提升英雄联盟游戏体验&#xff1a;3个核心功能详解 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 在英雄联盟的激烈对…...

tf_unet 实战应用:从玩具问题到射电天文干扰检测的完整案例

tf_unet 实战应用&#xff1a;从玩具问题到射电天文干扰检测的完整案例 【免费下载链接】tf_unet Generic U-Net Tensorflow implementation for image segmentation 项目地址: https://gitcode.com/gh_mirrors/tf/tf_unet Tensorflow U-Net 是一个通用的图像分割深度学…...

Sketch MeaXure:3步告别设计标注烦恼的TypeScript重构方案

Sketch MeaXure&#xff1a;3步告别设计标注烦恼的TypeScript重构方案 【免费下载链接】sketch-meaxure 项目地址: https://gitcode.com/gh_mirrors/sk/sketch-meaxure Sketch MeaXure是一款基于TypeScript重构的Sketch设计标注插件&#xff0c;专为解决UI设计师与开发…...

用Python+OpenCV给《梦幻西游》写个自动挖图脚本(附完整代码与避坑指南)

用PythonOpenCV实现《梦幻西游》自动挖宝图的全流程实战 最近在技术社区看到不少关于游戏自动化的讨论&#xff0c;尤其是像《梦幻西游》这类经典MMORPG&#xff0c;很多开发者尝试用计算机视觉技术实现自动化操作。作为一个长期关注OpenCV应用的开发者&#xff0c;我花了三周…...

《【2026最新】DeepFaceLive 性能飞跃:TensorRT 加速环境配置全攻略(附避坑指南)》

随着数字人直播和实时换脸技术的普及&#xff0c;DeepFaceLive 已成为该领域的标杆。然而&#xff0c;实时推理对显卡的压力极大&#xff0c;许多小伙伴在追求高分辨率或高帧率时经常遇到掉帧。2026年&#xff0c;DeepFaceLive 的核心组件已全面适配 NVIDIA TensorRT。相比传统…...