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

记一次导出pdf表单引发的问题

需求:点击按钮,将相关内容生成pdf下载下来
在这里插入图片描述
问题1:之前项目封装好的下载文件方法不携带token
我尝试新写了一个方法,携带token
问题
问题2:此时出现了跨域问题
我分别尝试在controller类上和方法上加@CrossOrigin(origins = “*”)都无济于事。
我在拦截器里打了断点,发现浏览器发的请求头根本获取不到。在这里插入图片描述
在这里插入图片描述
原因是跨域请求浏览器会先发起一个预检请求,此时我们应该拦截并允许跨域在这里插入图片描述
跨域问题解决
==========================0
生成pdf需要引入这俩依赖

// https://mvnrepository.com/artifact/org.thymeleaf/thymeleafimplementation("org.thymeleaf:thymeleaf:3.1.3.RELEASE")
// https://mvnrepository.com/artifact/org.xhtmlrenderer/flying-saucer-pdfimplementation("org.xhtmlrenderer:flying-saucer-pdf:9.13.1")

thymeleaf+Flying Saucer(将html转换为pdf)

package com.jiangee.environment.utils;import com.lowagie.text.pdf.BaseFont;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.xhtmlrenderer.css.parser.property.PageSize;
import org.xhtmlrenderer.pdf.ITextRenderer;import java.io.ByteArrayOutputStream;
import java.util.Locale;
import java.util.Map;@Component
public class ThymeleafPdf {@Resourceprivate  TemplateEngine templateEngine;public byte[] generatePdf(String templateName, Map<String, Object> data) {Context context = new Context();context.setVariables(data);String htmlContent = templateEngine.process(templateName, context);try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {ITextRenderer renderer = new ITextRenderer();renderer.setDocumentFromString(htmlContent);// 获取resources/下的文件//加载本地字体,不然不显示中文String fontPath = this.getClass().getClassLoader().getResource("font/simsun.ttc").getPath();renderer.getFontResolver().addFont(fontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);renderer.layout();renderer.createPDF(outputStream);return outputStream.toByteArray();} catch (Exception e) {throw new RuntimeException("Error generating PDF", e);}}
}
 public void exportHandoverSheet(String batchId, HttpServletResponse response) {// 准备数据Map<String, Object> data = new HashMap<>();Map<String, Object> invoice = new HashMap<>();invoice.put("number", "INV-2023-001");invoice.put("date", LocalDate.now());invoice.put("from", "ABC Company\n123 Main St\nNew York, NY 10001");invoice.put("to", "XYZ Client\n456 Oak Ave\nBoston, MA 02108");data.put("invoice", invoice);// 生成PDFbyte[] pdfBytes = thymeleafPdf.generatePdf("invoice", data);// 3. 设置响应头response.setContentType(MediaType.APPLICATION_PDF_VALUE);response.setHeader("Content-Disposition", "attachment; filename=invoice.pdf");response.setContentLength(pdfBytes.length);// 4. 写入响应流try (OutputStream out = response.getOutputStream()) {out.write(pdfBytes);out.flush();} catch (IOException e) {throw new RuntimeException(e);}}

注:templateName是html名字,在这里插入图片描述
此时运行报错:找不到TemplateEngine,
需要再加一个依赖

// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-thymeleafimplementation("org.springframework.boot:spring-boot-starter-thymeleaf:3.5.2")
<!DOCTYPE html>
<html  lang="zh" xmlns:th="http://www.thymeleaf.org">
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><meta charset="UTF-8"/><title>Invoice</title><style>@page {size: A4 landscape; /* 横向A4 */margin: 1cm;}body { font-family: SimSun, sans-serif; margin: 20px; }.header { text-align: center; margin-bottom: 30px; }.info { margin-bottom: 20px; }table { width: 100%; border-collapse: collapse; margin-bottom: 20px; }th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }th { background-color: #f2f2f2; }.total { text-align: right; font-weight: bold; }</style>
</head>
<body>
<div class="header"><h2>地下水环境调查送检样品交接表单</h2><hr/>
</div><div class="info"><p><strong>From:</strong> <span th:text="${invoice.from}"></span></p><p><strong>To:</strong> <span th:text="${invoice.to}"></span></p>
</div><table><thead><tr><th>Description</th><th>Quantity</th><th>Unit Price</th><th>Amount</th></tr></thead><tbody><tr th:each="item : ${invoice.items}"><td th:text="${item.description}"></td><td th:text="${item.quantity}"></td><td th:text="${'$' + #numbers.formatDecimal(item.unitPrice, 1, 2)}"></td><td th:text="${'$' + #numbers.formatDecimal(item.quantity * item.unitPrice, 1, 2)}"></td></tr></tbody>
</table><div class="total"><h3>Total: <span th:text="${'$' + #numbers.formatDecimal(invoice.total, 1, 2)}"></span></h3>
</div>
</body>
</html>
http://www.lryc.cn/news/604020.html

相关文章:

  • 【RAG搭建Agent应用实战】基于检索增强生成(RAG)搭建特定场景Agent应用
  • 验证pyspark提交参数指定环境变量生效
  • HbuilderX开发小程序
  • Java面试宝典:MySQL8新特性底层原理
  • 【nerf处理视频数据】Instant-NGP项目NeRF模型训练数据集准备指南
  • React--》规划React组件库编码规范与标准 — Button篇
  • 解决Spring MVC中@PathVariable参数为null导致的404问题:全面解析与最佳实践
  • 树形结构递归查询与嵌套结构转换:Flask + PostgreSQL 完整实现
  • EnergyMath芯祥代理 EMS4100可替代 ASW3410
  • 【牛客网C语言刷题合集】(五)——主要二进制、操作符部分
  • 深入解析mediasoup:构建实时音视频通信的高性能SFU解决方案
  • 用LangGraph实现聊天机器人记忆功能的深度解析
  • 深度学习篇---PaddleDetection模型选择
  • 循环神经网络——动手学深度学习7
  • electron-vite 动态加载脚本 实现动态插件
  • 使用jQuery时的注意事项
  • 爬虫逆向之瑞数五案例:某某医学院(补环境,联调)
  • 直播间里的酒旅新故事:内容正在重构消费链路
  • logtrick 按位或最大的最小子数组长度
  • 计算器4.0:新增页签功能梳理页面,通过IO流实现在用户本地存储数据
  • Java注解全面解析与应用实战
  • 三维扫描相机:工业自动化的智慧之眼——迁移科技赋能智能制造新纪元
  • 前端优化之虚拟列表实现指南:从库集成到手动开发
  • MongoDB系列教程-第一章:MongoDB简介、安装 、概念解析、用户管理、连接、实际应用示例
  • Java抽Oracle数据时编码问题
  • Spring Boot with RabbitMQ:四大核心模式指南
  • TDengine 中 TDgpt 异常检测的数据密度算法
  • TDengine 中 TDgpt 异常检测的机器学习算法
  • 中科米堆CASAIM金属件自动3d测量外观尺寸三维检测解决方案
  • 【数据结构初阶】--二叉树(四)