技术 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>
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |