本篇文章演示了一个从数据库中选取最近十条记录,并将它们转换成PDF格式供前端下载的完整后端处理流程。
注释很详细,望周知😗
所需要的工具:
iText库 SpringBoot框架 MyBatis
Controller层(PdfDownloadController.java)
importcom.itextpdf.text.Document;importcom.itextpdf.text.Paragraph;importcom.itextpdf.text.pdf.PdfWriter;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;importjavax.servlet.http.HttpServletResponse;importjava.io.ByteArrayInputStream;importjava.io.ByteArrayOutputStream;importjava.util.List;/**
这些Java库用于实现生成PDF文件、处理HTTP请求和响应,以及操作数据集的操作。
com.itextpdf.text.Document: 用于创建一个PDF文档的模型。它代表了一个PDF文档,并提供了添加元素(如段落、表格等)到文档中的方法。
com.itextpdf.text.Paragraph: 包含字符串、短语和其他可以逐个添加到Document对象中的PDF元素。
com.itextpdf.text.pdf.PdfWriter: iText库的核心类,用于将Document对象(即PDF文档)写入到你的文件系统、网络或内存。它的实例化是通过调用静态方法getInstance,并连接到一个特定的Document对象完成的。
*/@RestControllerpublicclassPdfDownloadController{// 假设这是用来获取数据库最近十条数据的服务privatefinalDataService dataService;publicPdfDownloadController(DataService dataService){this.dataService = dataService;}@GetMapping("/download-pdf")publicvoiddownloadPdf(HttpServletResponse response){try{// 查询数据库最近十条记录List<Data> dataList = dataService.getTopTenData();// 创建PDFByteArrayOutputStream out =newByteArrayOutputStream();Document document =newDocument();PdfWriter.getInstance(document, out);
document.open();// 将每条数据加入PDFfor(Data data : dataList){
document.add(newParagraph(data.toString()));// 假设toString()方法返回数据的有用表示}
document.close();// 设置HTTP响应头
response.setContentType("application/pdf");// 设置HTTP响应的内容类型为PDF/**
例如你想发送其他类型的数据也可以设置:
发送HTML内容: response.setContentType("text/html");
发送纯文本: response.setContentType("text/plain");
发送JPEG图片: response.setContentType("image/jpeg");
发送JSON数据: response.setContentType("application/json");
*/
response.setHeader("Content-Disposition","attachment; filename=\"data.pdf\"");// 设置HTTP响应的头信息,告诉浏览器这是一个附件,建议保存的文件名为"data.pdf"ByteArrayInputStream in =newByteArrayInputStream(out.toByteArray());org.apache.commons.io.IOUtils.copy(in, response.getOutputStream());// 上面一行利用Apache Commons IO库的IOUtils类的copy方法,// 将PDF文件的内容(现在存储在ByteArrayInputStream 'in')复制到HTTP响应的输出流中// 这使得PDF的内容能够被发送到请求该服务的客户端
response.flushBuffer();// 刷新响应的缓冲区,完成响应的发送}catch(Exception e){
e.printStackTrace();// 错误处理}}}
后半部分代码的目的是在服务器端动态生成一个PDF文件,并通过HTTP响应将其发送给客户端供下载。通过设置
Content-Disposition
为
attachment
,告诉浏览器这个文件应该被当做下载处理,而不是直接在浏览器中打开,
filename=\"data.pdf\"
则建议浏览器将文件保存为"data.pdf"。利用Apache Commons IO库简化了二进制数据传输的代码编写。最后,使用
response.flushBuffer()
确保所有数据都被发送给客户端。
上述代码因为使用到了iText库和Apache Commons IO库的一部分,所以需要在Maven或Gradle项目的pom.xml文件中添加依赖,这里展示一下Maven添加依赖项的过程:
<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.8.0</version></dependency>
数据模型(Data.java)
首先,定义一个简单的数据模型:
假设这里有一个
Data
实体类,它代表了数据库中的表。
这个表仅包含两个字段:ID(主键)和Name,大家可以自行增减字段。
publicclassData{privateInteger id;privateString name;// 构造函数、getter和setter省略// 大家可以用alt + ins快捷键快速生成@OverridepublicStringtoString(){return"Data{"+"id="+ id +", name='"+ name +'\''+'}';}}
Mapper接口(DataMapper.java)
然后,定义MyBatis的Mapper接口:
importorg.apache.ibatis.annotations.Mapper;importorg.apache.ibatis.annotations.Select;importjava.util.List;@MapperpublicinterfaceDataMapper{@Select("SELECT * FROM data_table ORDER BY id DESC LIMIT 10")// 倒序选择10条数据List<Data>selectTopTenData();}
MyBatis Mapper XML文件(DataMapper.xml)
接下来是对应的MyBatis Mapper XML配置。
大家可以这个文件与
DataMapper
接口放置在相同的路径下:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.example.demo.mapper.DataMapper"><selectid="selectTopTenData"resultType="com.example.demo.model.Data">
SELECT * FROM data_table ORDER BY id DESC LIMIT 10
</select></mapper>
Service层(DataService.java)
在Service层,我们调用Mapper接口中定义的方法:
importorg.springframework.stereotype.Service;importjava.util.List;@ServicepublicclassDataService{privatefinalDataMapper dataMapper;publicDataService(DataMapper dataMapper){this.dataMapper = dataMapper;}publicList<Data>getTopTenData(){return dataMapper.selectTopTenData();}}
本篇文章演示了一个从数据库中选取最近十条记录,并将它们转换成PDF格式供前端下载的完整后端处理流程。在现实的应用中,大家需要根据自己的业务需求和实际的数据库表结构进行适当的调整。
此图是我应用于<访问记录数据库>的pdf导出效果,列举了最新几天的访问次数。
版权归原作者 millerperez 所有, 如有侵权,请联系我们删除。