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

批量生成不同用户的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>

http://www.kler.cn/a/421831.html

相关文章:

  • Python几种常用数据结构(重制版)
  • JavaScript(JS)的对象
  • 字节青训Marscode——8:找出整形数组中超过一半的数
  • Kibana server is not ready yet
  • 电脑关机的趣味小游戏——system函数、strcmp函数、goto语句的使用
  • 代码随想录-算法训练营day31(贪心算法01:分发饼干,摆动序列,最大子数组和)
  • 【C++进阶篇】C++继承进阶:深入理解继承的复杂性
  • 基础入门-Web应用OSS存储负载均衡CDN加速反向代理WAF防护部署影响
  • Recaptcha2 图像识别 API 对接说明
  • flask的第一个应用
  • 设计模式——方法链or流式接口
  • 什么是 Kubernetes(K8s)?
  • Chapter 17 v-model进阶
  • 深入探讨锁升级问题
  • 基于Java Springboot智慧农业微信小程序
  • 0.Git初步概念
  • 【Linux】设计文件系统(C实现)
  • 【C#】书籍信息的添加、修改、查询、删除
  • C++创建动态链接库(附原因说明)
  • 20241129解决在Ubuntu20.04下编译中科创达的CM6125的Android10出现找不到库文件libncurses.so.5的问题
  • Neo4j APOC-01-图数据库 apoc 插件 windows10 安装
  • web移动端、pc端获取浏览器指纹-fingerprintjs插件(类似mac地址)
  • HDFS怎么查看文件存储位置?
  • 解决爬虫ConnectionResetError出现的问题
  • 力扣第 75 题是 颜色分类
  • 【再谈设计模式】桥接模式 ~ 抽象与实现的灵活桥梁