利用Java将数据库的数据生成pdf返回给前端用户下载

millerperez 2024-08-16 12:03:01 阅读 77

本篇文章演示了一个从数据库中选取最近十条记录,并将它们转换成PDF格式供前端下载的完整后端处理流程。

注释很详细,望周知😗

所需要的工具:

iText库 SpringBoot框架 MyBatis

Controller层(PdfDownloadController.java)

<code>import com.itextpdf.text.Document;

import com.itextpdf.text.Paragraph;

import com.itextpdf.text.pdf.PdfWriter;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.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对象完成的。

*/

@RestController

public class PdfDownloadController { -- -->

// 假设这是用来获取数据库最近十条数据的服务

private final DataService dataService;

public PdfDownloadController(DataService dataService) {

this.dataService = dataService;

}

@GetMapping("/download-pdf")

public void downloadPdf(HttpServletResponse response) {

try {

// 查询数据库最近十条记录

List<Data> dataList = dataService.getTopTenData();

// 创建PDF

ByteArrayOutputStream out = new ByteArrayOutputStream();

Document document = new Document();

PdfWriter.getInstance(document, out);

document.open();

// 将每条数据加入PDF

for (Data data : dataList) {

document.add(new Paragraph(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 = new ByteArrayInputStream(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-Dispositionattachment,告诉浏览器这个文件应该被当做下载处理,而不是直接在浏览器中打开,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,大家可以自行增减字段。

public class Data {

private Integer id;

private String name;

// 构造函数、getter和setter省略

// 大家可以用alt + ins快捷键快速生成

@Override

public String toString() {

return "Data{" +

"id=" + id +

", name='" + name + '\'' +code>

'}';

}

}

Mapper接口(DataMapper.java)

然后,定义MyBatis的Mapper接口:

import org.apache.ibatis.annotations.Mapper;

import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper

public interface DataMapper { -- -->

@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"?>code>

<!DOCTYPE mapper

PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.example.demo.mapper.DataMapper">code>

<select id="selectTopTenData" resultType="com.example.demo.model.Data">code>

SELECT * FROM data_table ORDER BY id DESC LIMIT 10

</select>

</mapper>

Service层(DataService.java)

在Service层,我们调用Mapper接口中定义的方法:

import org.springframework.stereotype.Service;

import java.util.List;

@Service

public class DataService { -- -->

private final DataMapper dataMapper;

public DataService(DataMapper dataMapper) {

this.dataMapper = dataMapper;

}

public List<Data> getTopTenData() {

return dataMapper.selectTopTenData();

}

}

​ 本篇文章演示了一个从数据库中选取最近十条记录,并将它们转换成PDF格式供前端下载的完整后端处理流程。在现实的应用中,大家需要根据自己的业务需求和实际的数据库表结构进行适当的调整。

图1

此图是我应用于<访问记录数据库>的pdf导出效果,列举了最新几天的访问次数。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。