批量生成不同用户的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 URL
htmlContent = "data:text/html;base64," + base64EncodedHtmlContent;
// 加载HTML内容
// htmlContent = "data:text/html;charset=utf-8," + encodedHtmlContent;
driver.get(htmlContent);
// 等待JavaScript执行完成
Thread.sleep(3000); // 等待3秒,确保JavaScript执行完成
//获取全部的html
String 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>