欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何用Java將數(shù)據(jù)庫(kù)的數(shù)據(jù)生成pdf返回給前端用戶下載

 更新時(shí)間:2024年09月18日 11:15:19   作者:millerperez  
本文詳細(xì)介紹了使用SpringBoot、iText庫(kù)、MyBatis等技術(shù)從數(shù)據(jù)庫(kù)中選取數(shù)據(jù)并生成PDF文件的后端處理流程,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

本篇文章演示了一個(gè)從數(shù)據(jù)庫(kù)中選取最近十條記錄,并將它們轉(zhuǎn)換成PDF格式供前端下載的完整后端處理流程。

注釋很詳細(xì),望周知??

所需要的工具:

iText庫(kù) SpringBoot框架 MyBatis

Controller層(PdfDownloadController.java)

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庫(kù)用于實(shí)現(xiàn)生成PDF文件、處理HTTP請(qǐng)求和響應(yīng),以及操作數(shù)據(jù)集的操作。
	com.itextpdf.text.Document: 用于創(chuàng)建一個(gè)PDF文檔的模型。它代表了一個(gè)PDF文檔,并提供了添加元素(如段落、表格等)到文檔中的方法。
	com.itextpdf.text.Paragraph: 包含字符串、短語(yǔ)和其他可以逐個(gè)添加到Document對(duì)象中的PDF元素。
	com.itextpdf.text.pdf.PdfWriter: iText庫(kù)的核心類,用于將Document對(duì)象(即PDF文檔)寫(xiě)入到你的文件系統(tǒng)、網(wǎng)絡(luò)或內(nèi)存。它的實(shí)例化是通過(guò)調(diào)用靜態(tài)方法getInstance,并連接到一個(gè)特定的Document對(duì)象完成的。
*/

@RestController
public class PdfDownloadController {

    // 假設(shè)這是用來(lái)獲取數(shù)據(jù)庫(kù)最近十條數(shù)據(jù)的服務(wù)
    private final DataService dataService;

    public PdfDownloadController(DataService dataService) {
        this.dataService = dataService;
    }

    @GetMapping("/download-pdf")
    public void downloadPdf(HttpServletResponse response) {
        try {
            // 查詢數(shù)據(jù)庫(kù)最近十條記錄
            List<Data> dataList = dataService.getTopTenData();

            // 創(chuàng)建PDF
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            Document document = new Document();
            PdfWriter.getInstance(document, out);
            document.open();
            
            // 將每條數(shù)據(jù)加入PDF
            for (Data data : dataList) {
                document.add(new Paragraph(data.toString())); // 假設(shè)toString()方法返回?cái)?shù)據(jù)的有用表示
            }
            document.close();

            // 設(shè)置HTTP響應(yīng)頭
            response.setContentType("application/pdf"); // 設(shè)置HTTP響應(yīng)的內(nèi)容類型為PDF
            /**
            例如你想發(fā)送其他類型的數(shù)據(jù)也可以設(shè)置:
            	發(fā)送HTML內(nèi)容: response.setContentType("text/html");
				發(fā)送純文本: response.setContentType("text/plain");
				發(fā)送JPEG圖片: response.setContentType("image/jpeg");
				發(fā)送JSON數(shù)據(jù): response.setContentType("application/json");
            */
            response.setHeader("Content-Disposition", "attachment; filename=\"data.pdf\""); // 設(shè)置HTTP響應(yīng)的頭信息,告訴瀏覽器這是一個(gè)附件,建議保存的文件名為"data.pdf"
            ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
            org.apache.commons.io.IOUtils.copy(in, response.getOutputStream());
// 上面一行利用Apache Commons IO庫(kù)的IOUtils類的copy方法,
// 將PDF文件的內(nèi)容(現(xiàn)在存儲(chǔ)在ByteArrayInputStream 'in')復(fù)制到HTTP響應(yīng)的輸出流中
// 這使得PDF的內(nèi)容能夠被發(fā)送到請(qǐng)求該服務(wù)的客戶端
            response.flushBuffer(); // 刷新響應(yīng)的緩沖區(qū),完成響應(yīng)的發(fā)送
        } catch (Exception e) {
            e.printStackTrace();
            // 錯(cuò)誤處理
        }
    }
}

? 后半部分代碼的目的是在服務(wù)器端動(dòng)態(tài)生成一個(gè)PDF文件,并通過(guò)HTTP響應(yīng)將其發(fā)送給客戶端供下載。通過(guò)設(shè)置Content-Dispositionattachment,告訴瀏覽器這個(gè)文件應(yīng)該被當(dāng)做下載處理,而不是直接在瀏覽器中打開(kāi),filename=\"data.pdf\"則建議瀏覽器將文件保存為"data.pdf"。利用Apache Commons IO庫(kù)簡(jiǎn)化了二進(jìn)制數(shù)據(jù)傳輸?shù)拇a編寫(xiě)。最后,使用response.flushBuffer()確保所有數(shù)據(jù)都被發(fā)送給客戶端。

? 上述代碼因?yàn)槭褂玫搅薸Text庫(kù)和Apache Commons IO庫(kù)的一部分,所以需要在Maven或Gradle項(xiàng)目的pom.xml文件中添加依賴,這里展示一下Maven添加依賴項(xiàng)的過(guò)程:

<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>

數(shù)據(jù)模型(Data.java)

首先,定義一個(gè)簡(jiǎn)單的數(shù)據(jù)模型:

假設(shè)這里有一個(gè)Data實(shí)體類,它代表了數(shù)據(jù)庫(kù)中的表。

這個(gè)表僅包含兩個(gè)字段:ID(主鍵)和Name,大家可以自行增減字段。

public class Data {
    private Integer id;
    private String name;
    
    // 構(gòu)造函數(shù)、getter和setter省略
    // 大家可以用alt + ins快捷鍵快速生成

    @Override
    public String toString() {
        return "Data{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

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條數(shù)據(jù)
    List<Data> selectTopTenData();
}

MyBatis Mapper XML文件(DataMapper.xml)

接下來(lái)是對(duì)應(yīng)的MyBatis Mapper XML配置。

大家可以這個(gè)文件與DataMapper接口放置在相同的路徑下:

<?xml version="1.0" encoding="UTF-8"?>
<!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">
    <select id="selectTopTenData" resultType="com.example.demo.model.Data">
        SELECT * FROM data_table ORDER BY id DESC LIMIT 10
    </select>
</mapper>

Service層(DataService.java)

在Service層,我們調(diào)用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();
    }
}

? 本篇文章演示了一個(gè)從數(shù)據(jù)庫(kù)中選取最近十條記錄,并將它們轉(zhuǎn)換成PDF格式供前端下載的完整后端處理流程。在現(xiàn)實(shí)的應(yīng)用中,大家需要根據(jù)自己的業(yè)務(wù)需求和實(shí)際的數(shù)據(jù)庫(kù)表結(jié)構(gòu)進(jìn)行適當(dāng)?shù)恼{(diào)整。

此圖是我應(yīng)用于<訪問(wèn)記錄數(shù)據(jù)庫(kù)>的pdf導(dǎo)出效果,列舉了最新幾天的訪問(wèn)次數(shù)。

總結(jié)

到此這篇關(guān)于如何用Java將數(shù)據(jù)庫(kù)的數(shù)據(jù)生成pdf返回給前端用戶下載的文章就介紹到這了,更多相關(guān)Java數(shù)據(jù)生成pdf返回給前端下載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • ssm項(xiàng)目session使用及其作用域問(wèn)題

    ssm項(xiàng)目session使用及其作用域問(wèn)題

    這篇文章主要介紹了ssm項(xiàng)目session使用及其作用域問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • 如何獲取java類中的屬性注釋

    如何獲取java類中的屬性注釋

    在開(kāi)發(fā)中,有時(shí)需要獲取Java類的屬性注釋,尤其是當(dāng)JPA生成的表缺少注釋時(shí),可以通過(guò)jdk自帶的tools.jar工具包來(lái)實(shí)現(xiàn),方法類似于生成javadoc文檔,需要在pom.xml文件中導(dǎo)入tools.jar的依賴,該jar文件一般位于JAVA_HOME/lib目錄下
    2024-09-09
  • Java實(shí)現(xiàn)窗體程序顯示日歷表

    Java實(shí)現(xiàn)窗體程序顯示日歷表

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)窗體程序顯示日歷表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • IDEA 啟動(dòng) Tomcat 項(xiàng)目輸出亂碼的解決方法

    IDEA 啟動(dòng) Tomcat 項(xiàng)目輸出亂碼的解決方法

    這篇文章主要介紹了IDEA 啟動(dòng) Tomcat 項(xiàng)目輸出亂碼的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • SpringBoot生成License的實(shí)現(xiàn)示例

    SpringBoot生成License的實(shí)現(xiàn)示例

    License指的是版權(quán)許可證,那么對(duì)于SpringBoot項(xiàng)目,如何增加License呢?本文就來(lái)介紹一下,感興趣的可以了解一下
    2021-06-06
  • Spring security如何實(shí)現(xiàn)記錄用戶登錄時(shí)間功能

    Spring security如何實(shí)現(xiàn)記錄用戶登錄時(shí)間功能

    這篇文章主要介紹了Spring security如何實(shí)現(xiàn)記錄用戶登錄時(shí)間功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • IntelliJ IDEA運(yùn)行bat腳本,自動(dòng)taskkill端口進(jìn)程

    IntelliJ IDEA運(yùn)行bat腳本,自動(dòng)taskkill端口進(jìn)程

    這篇文章主要介紹了IDEA里面無(wú)法運(yùn)行bat文件的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 解決IDEA無(wú)法讀取maven鏡像,jar包下載失敗的問(wèn)題

    解決IDEA無(wú)法讀取maven鏡像,jar包下載失敗的問(wèn)題

    這篇文章主要介紹了解決IDEA無(wú)法讀取maven鏡像,jar包下載失敗的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10
  • Java訪問(wèn)修飾符原理及代碼解析

    Java訪問(wèn)修飾符原理及代碼解析

    這篇文章主要介紹了Java訪問(wèn)修飾符原理及代碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • SpringBoot中整合Minio文件存儲(chǔ)的安裝部署過(guò)程

    SpringBoot中整合Minio文件存儲(chǔ)的安裝部署過(guò)程

    這篇文章主要介紹了SpringBoot整合Minio文件存儲(chǔ)的相關(guān)知識(shí),詳細(xì)介紹了Minio安裝部署過(guò)程,需要的朋友可以參考下
    2022-04-04

最新評(píng)論