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

打印 上一主题 下一主题

主题 826|帖子 826|积分 2480

技术 selenium + thymeleaf + itextpdf + chromedriver
使用thymeleaf 将动态数据更换
使用selenium +chromedriver 进行js ,css等逻辑运算后渲染视图
使用itextpdf 将html 转为pdf 文件
html模板
  1. <!DOCTYPE html>
  2. <html xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>My Page</title>
  6.     <!-- 引入 jQuery 库 -->
  7.     <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
  8.     <style>
  9.         body {
  10.             font-family: 'SimSun', 'SimHei', sans-serif;
  11.         }
  12.     </style>
  13.     <!-- 引入 G2 库 -->
  14. <!--    <script src="https://gw.alipayobjects.com/os/lib/antv/g2/4.1.16/dist/g2.min.js"></script>-->
  15. </head>
  16. <body>
  17. <h1 th:text="${title}">cser</h1>
  18. <div id="content"></div>
  19. <script type="text/javascript" th:inline="javascript">
  20.     /*<![CDATA[*/
  21.          document.addEventListener('DOMContentLoaded', function() {
  22.              $('#content').html(
  23.                  "<select name='status'>"+
  24.                  "   <option value='测试'>111</option>"+
  25.                  "   <option value='测试2'>222</option>"+
  26.                  "</select>")
  27.              let titlenew = "测试"; // 确保这里赋值正确
  28.              document.querySelector('h1').innerText = titlenew;
  29.              document.title = titlenew; // 更新浏览器标签页的标题
  30.          });
  31.     /*]]>*/
  32. </script>
  33. </body>
  34. </html>
复制代码
实行代码
  1. public void generatePdf(HttpServletResponse response) throws IOException {
  2.         // 设置 ChromeDriver 路径
  3.         // 设置 ChromeDriver 路径
  4.         System.setProperty("webdriver.chrome.driver", "D:/chromedriver.exe");
  5.         // 初始化 WebDriver
  6.         // 设置chrome选项
  7.         ChromeOptions options = new ChromeOptions();
  8. //        options.setBinary("D:\\chromedriver\\chrome/chrome.exe");
  9.         options.setBinary("C:\\Chrome\\Application/chrome.exe");
  10.         options.addArguments("--headless");
  11.         options.addArguments("--disable-gpu");
  12.         WebDriver driver = new ChromeDriver(options);
  13.         // 动态数据
  14.         Map<String, Object> data = new HashMap<>();
  15.         data.put("title", "Hello, World!");
  16.         data.put("condition", "true");
  17. //        data.put("imagePath", imagePath); // 路径
  18.         // 使用 Thymeleaf 渲染模板
  19.         Context context = new Context();
  20.         context.setVariables(data);
  21.         String htmlContent = templateEngine.process("templates", context);
  22.         try {
  23.             driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(60));
  24.             // 将 htmlContent 进行 Base64 编码
  25.             byte[] base64EncodedBytes = Base64.getEncoder().encode(htmlContent.getBytes(StandardCharsets.UTF_8));
  26.             String base64EncodedHtmlContent = new String(base64EncodedBytes);
  27.             // 构建完整的 data URL
  28.             htmlContent = "data:text/html;base64," + base64EncodedHtmlContent;
  29.             // 加载HTML内容
  30. //            htmlContent = "data:text/html;charset=utf-8," + encodedHtmlContent;
  31.             driver.get(htmlContent);
  32.             // 等待JavaScript执行完成
  33.             Thread.sleep(3000); // 等待3秒,确保JavaScript执行完成
  34.             //获取全部的html
  35.             String pageSource = driver.getPageSource();
  36. //            // 获取最终的HTML内容
  37. //            WebElement body = driver.findElement(By.tagName("html"));
  38. //            String renderedHtml = body.getAttribute("outerHTML");
  39.             try (FileOutputStream outputStream = new FileOutputStream(filePath)) {
  40.                 // 使用字体文件路径创建字体对象
  41.                 String fontPath = "chromedriver/cs.TTF";
  42.                 FontProgram font = FontProgramFactory.createFont(fontPath);
  43.                 // 创建 DefaultFontProvider 并设置字体
  44.                 DefaultFontProvider fontProvider = new DefaultFontProvider(false, false, true);
  45.                 fontProvider.addFont(font);
  46.                 // 创建 ConverterProperties 并设置字体提供者
  47.                 ConverterProperties converterProperties = new ConverterProperties();
  48.                 converterProperties.setFontProvider(fontProvider);
  49.                 HtmlConverter.convertToPdf(pageSource, outputStream, converterProperties);
  50.             } catch (Exception e) {
  51.                 e.printStackTrace();
  52.             }
  53.         } catch (InterruptedException e) {
  54.             driver.close();
  55.         }
  56.     }
复制代码
pom 依赖
  1.                 <dependency>
  2.             <groupId>org.springframework.boot</groupId>
  3.             <artifactId>spring-boot-starter-thymeleaf</artifactId>
  4.         </dependency>
  5. <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
  6.         <dependency>
  7.             <groupId>org.seleniumhq.selenium</groupId>
  8.             <artifactId>selenium-java</artifactId>
  9.             <version>4.27.0</version>
  10.         </dependency>
  11.         <dependency>
  12.             <groupId>org.seleniumhq.selenium</groupId>
  13.             <artifactId>selenium-chrome-driver</artifactId>
  14.             <version>4.27.0</version> <!-- 确保与 selenium-java 版本一致 -->
  15.         </dependency>
  16.         <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-remote-driver -->
  17.         <dependency>
  18.             <groupId>org.seleniumhq.selenium</groupId>
  19.             <artifactId>selenium-remote-driver</artifactId>
  20.             <version>4.27.0</version>
  21.         </dependency>
  22.         <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-api -->
  23.         <dependency>
  24.             <groupId>org.seleniumhq.selenium</groupId>
  25.             <artifactId>selenium-api</artifactId>
  26.             <version>4.27.0</version>
  27.         </dependency>
  28.         <dependency>
  29.             <groupId>com.itextpdf</groupId>
  30.             <artifactId>itextpdf</artifactId>
  31.             <version>5.5.11</version>
  32.         </dependency>
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

南七星之家

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表