最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot導(dǎo)出PDF的四種實(shí)現(xiàn)方法詳解

 更新時(shí)間:2025年02月19日 09:23:29   作者:web14786210723  
在Spring?Boot應(yīng)用程序中實(shí)現(xiàn)PDF導(dǎo)出功能,可以選擇多種庫和技術(shù)棧,本文為大家整理了四種常見的方法,感興趣的小伙伴可以參考一下

在Spring Boot應(yīng)用程序中實(shí)現(xiàn)PDF導(dǎo)出功能,可以選擇多種庫和技術(shù)棧。每種方法都有其優(yōu)缺點(diǎn),適用于不同的場景。以下是四種常見的方式:iText、Apache PDFBox、JasperReports 和 Thymeleaf + Flying Saucer。我將詳細(xì)對(duì)比這些方法,并提供相應(yīng)的代碼示例。

1. iText

優(yōu)點(diǎn):

  • 豐富的API: 支持復(fù)雜的PDF操作,如加密、數(shù)字簽名、表單處理等。
  • 企業(yè)級(jí)支持: 提供廣泛的文檔和支持社區(qū)。
  • 多格式輸出: 除了PDF,還支持其他格式(如HTML、XML)的轉(zhuǎn)換。

缺點(diǎn):

  • 商業(yè)許可: iText 7 是商業(yè)軟件,某些高級(jí)功能需要購買許可證。
  • 學(xué)習(xí)曲線: API較為復(fù)雜,可能需要一定的學(xué)習(xí)成本。

性能:

對(duì)于大多數(shù)應(yīng)用場景來說,iText 的性能是足夠的。它在內(nèi)存管理和文件處理速度方面表現(xiàn)優(yōu)秀,尤其適合處理復(fù)雜的PDF文檔。

適用場景:

適合需要生成復(fù)雜PDF文檔的應(yīng)用,尤其是那些涉及安全性和高級(jí)功能的企業(yè)級(jí)應(yīng)用。

示例代碼:

<!-- 添加依賴 -->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext7-core</artifactId>
    <version>7.1.15</version> <!-- 請(qǐng)檢查并使用最新版本 -->
</dependency>
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class ITextPdfService {

    public void export(HttpServletResponse response) throws IOException {
        // 設(shè)置響應(yīng)頭
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition", "attachment; filename=users.pdf");

        try (PdfWriter writer = new PdfWriter(response.getOutputStream());
             PdfDocument pdf = new PdfDocument(writer);
             Document document = new Document(pdf)) {

            // 添加內(nèi)容到PDF
            document.add(new Paragraph("Hello, this is a PDF document created with iText in Spring Boot!"));

            // 關(guān)閉文檔
            document.close();
        }
    }
}

2. Apache PDFBox

優(yōu)點(diǎn):

  • 完全開源: 沒有商業(yè)限制,適合所有類型的項(xiàng)目。
  • 輕量級(jí): 依賴項(xiàng)較少,項(xiàng)目結(jié)構(gòu)簡潔。
  • 易于上手: API相對(duì)簡單,適合快速開發(fā)和學(xué)習(xí)。

缺點(diǎn):

  • 功能有限: 在一些復(fù)雜的功能上,如處理大型PDF或執(zhí)行高級(jí)操作,可能不如iText強(qiáng)大。
  • 性能問題: 在處理非常大的文件或高并發(fā)場景下,性能可能會(huì)略遜于iText。

性能:

PDFBox 在處理較小的PDF文件時(shí)表現(xiàn)良好,但在處理大文件或者高并發(fā)場景下,其性能可能會(huì)略遜于iText。

適用場景:

適合需要生成簡單PDF文檔的應(yīng)用,尤其是那些希望保持完全開源的項(xiàng)目。

示例代碼:

<!-- 添加依賴 -->
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.27</version> <!-- 請(qǐng)檢查并使用最新版本 -->
</dependency>
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType1Font;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class PdfBoxPdfService {

    public void export(HttpServletResponse response) throws IOException {
        // 設(shè)置響應(yīng)頭
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition", "attachment; filename=users.pdf");

        try (PDDocument document = new PDDocument()) {
            PDPage page = new PDPage();
            document.addPage(page);

            try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
                contentStream.setFont(PDType1Font.HELVETICA_BOLD, 12);
                contentStream.beginText();
                contentStream.newLineAtOffset(100, 700);
                contentStream.showText("Hello, this is a PDF document created with Apache PDFBox in Spring Boot!");
                contentStream.endText();
            }

            // 將PDF寫入響應(yīng)輸出流
            document.save(response.getOutputStream());
        }
    }
}

3. JasperReports

優(yōu)點(diǎn):

  • 強(qiáng)大的報(bào)表設(shè)計(jì)能力: 支持復(fù)雜的表格、圖表、分組、子報(bào)表等功能。
  • 多數(shù)據(jù)源支持: 可以從數(shù)據(jù)庫、JavaBean集合、CSV、XML等多種數(shù)據(jù)源獲取數(shù)據(jù)。
  • 豐富的樣式和格式化: 支持多種字體、顏色、邊框、背景等樣式設(shè)置,以及日期、數(shù)字等格式化。
  • 集成度高: 與Spring Boot集成方便,可以輕松地將報(bào)表生成邏輯嵌入到應(yīng)用程序中。
  • 輸出格式多樣: 除了PDF,還支持HTML、Excel、CSV等多種輸出格式。

缺點(diǎn):

  • 學(xué)習(xí)曲線較陡: JRXML模板語法較為復(fù)雜,需要一定時(shí)間來掌握。
  • 依賴項(xiàng)較多: 需要引入多個(gè)依賴項(xiàng),可能會(huì)增加項(xiàng)目的復(fù)雜度。
  • 性能問題: 在處理非常大的數(shù)據(jù)集時(shí),可能會(huì)遇到性能瓶頸,尤其是在內(nèi)存管理和渲染速度方面。

性能:

在處理復(fù)雜報(bào)表和大數(shù)據(jù)集時(shí)表現(xiàn)較好,尤其是在需要高級(jí)功能(如分組、圖表)的情況下。

適用場景:

適合需要生成復(fù)雜報(bào)表的應(yīng)用,尤其是包含大量數(shù)據(jù)、圖表、分組等元素的場景。

適合需要支持多種輸出格式的應(yīng)用。

示例代碼:

<!-- 添加依賴 -->
<dependency>
    <groupId>net.sf.jasperreports</groupId>
    <artifactId>jasperreports</artifactId>
    <version>6.17.0</version> <!-- 請(qǐng)檢查并使用最新版本 -->
</dependency>
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/api")
public class JasperReportController {

    @GetMapping("/export-jasper-pdf")
    public void export(HttpServletResponse response) throws Exception {
        // 設(shè)置響應(yīng)頭
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition", "attachment; filename=report.pdf");

        // 加載JRXML模板
        InputStream reportTemplate = getClass().getResourceAsStream("/templates/report.jrxml");
        JasperReport jasperReport = JasperCompileManager.compileReport(reportTemplate);

        // 準(zhǔn)備數(shù)據(jù)
        List<User> users = userService.getAllUsers(); // 假設(shè)有一個(gè)UserService類
        JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(users);

        // 設(shè)置參數(shù)
        Map<String, Object> parameters = new HashMap<>();
        parameters.put("title", "User Report");

        // 生成PDF
        JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, dataSource);
        JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream());
    }
}

4. Thymeleaf + Flying Saucer

優(yōu)點(diǎn):

  • HTML/CSS友好: 使用標(biāo)準(zhǔn)的HTML和CSS進(jìn)行頁面布局和樣式設(shè)置,非常適合前端開發(fā)人員。
  • 易于維護(hù): HTML模板容易理解和修改,尤其適合那些已經(jīng)熟悉HTML/CSS的團(tuán)隊(duì)。
  • 靈活性高: 可以輕松地將現(xiàn)有的Thymeleaf模板轉(zhuǎn)換為PDF,減少了重復(fù)工作。
  • 輕量級(jí): 相對(duì)于JasperReports,F(xiàn)lying Saucer的依賴項(xiàng)較少,項(xiàng)目結(jié)構(gòu)更簡潔。
  • 快速開發(fā): 對(duì)于簡單的PDF生成需求,開發(fā)速度較快,因?yàn)椴恍枰獙W(xué)習(xí)新的模板語言。

缺點(diǎn):

  • 功能有限: 相比JasperReports,F(xiàn)lying Saucer的功能較為有限,特別是在處理復(fù)雜報(bào)表(如分組、圖表)時(shí)。
  • 性能一般: 在處理大文件或高并發(fā)場景下,性能可能不如JasperReports。
  • 樣式兼容性: 某些CSS樣式可能無法完全兼容,導(dǎo)致PDF渲染效果與預(yù)期不符。

性能:

對(duì)于簡單的PDF生成需求,性能足夠,并且開發(fā)速度快,維護(hù)成本低。

適用場景:

  • 適合需要將現(xiàn)有的HTML頁面轉(zhuǎn)換為PDF的應(yīng)用,尤其是那些已經(jīng)有現(xiàn)成的HTML模板的情況。
  • 適合生成簡單的文檔,如發(fā)票、合同、報(bào)告等,而不涉及復(fù)雜的報(bào)表功能。

示例代碼:

<!-- 添加依賴 -->
<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf</artifactId>
    <version>3.0.12.RELEASE</version> <!-- 請(qǐng)檢查并使用最新版本 -->
</dependency>
<dependency>
    <groupId>org.xhtmlrenderer</groupId>
    <artifactId>flying-saucer-pdf-itext5</artifactId>
    <version>9.1.20</version> <!-- 請(qǐng)檢查并使用最新版本 -->
</dependency>
import org.springframework.core.io.ClassPathResource;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.xhtmlrenderer.pdf.ITextRenderer;

import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;

@RestController
@RequestMapping("/api")
public class PdfController {

    private final TemplateEngine templateEngine;

    public PdfController(TemplateEngine templateEngine) {
        this.templateEngine = templateEngine;
    }

    @GetMapping("/export-thymeleaf-pdf")
    public void export(HttpServletResponse response) throws Exception {
        // 設(shè)置響應(yīng)頭
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition", "attachment; filename=report.pdf");

        // 加載HTML模板
        InputStream templateInputStream = new ClassPathResource("templates/report.html").getInputStream();
        String htmlContent = new String(templateInputStream.readAllBytes(), StandardCharsets.UTF_8);

        // 準(zhǔn)備上下文數(shù)據(jù)
        Context context = new Context();
        context.setVariable("users", userService.getAllUsers()); // 假設(shè)有一個(gè)UserService類
        context.setVariable("title", "User Report");

        // 渲染HTML
        String processedHtml = templateEngine.process(htmlContent, context);

        // 將HTML轉(zhuǎn)換為PDF
        ITextRenderer renderer = new ITextRenderer();
        renderer.setDocumentFromString(processedHtml);
        renderer.layout();

        // 輸出PDF
        try (OutputStream outputStream = response.getOutputStream()) {
            renderer.createPDF(outputStream);
        }
    }
}

性能與易用性對(duì)比

iTextApache PDFBoxJasperReportsThymeleaf + Flying Saucer
性能高(復(fù)雜報(bào)表)中(簡單文檔)
易用性復(fù)雜簡單復(fù)雜簡單
功能強(qiáng)大有限非常強(qiáng)大(報(bào)表)有限(HTML/CSS)
依賴項(xiàng)較多(部分需商業(yè)許可)較多
適用場景復(fù)雜PDF文檔簡單PDF文檔復(fù)雜報(bào)表簡單文檔/HTML轉(zhuǎn)PDF
學(xué)習(xí)曲線陡峭平緩陡峭平緩

總結(jié)

選擇 iText 如果你需要生成復(fù)雜的PDF文檔,尤其是涉及到安全性和高級(jí)功能的企業(yè)級(jí)應(yīng)用。iText 提供了最全面的功能和最佳的性能,但需要注意其商業(yè)許可要求。

選擇 Apache PDFBox 如果你希望保持完全開源,并且只需要生成簡單的PDF文檔。PDFBox 輕量級(jí)且易于上手,適合小型項(xiàng)目或?qū)π阅芤蟛桓叩膱鼍啊?/p>

選擇 JasperReports 如果你需要生成復(fù)雜的報(bào)表,特別是涉及到分組、圖表、子報(bào)表等功能。JasperReports 是一個(gè)功能強(qiáng)大且成熟的工具,適合企業(yè)級(jí)應(yīng)用。

選擇 Thymeleaf + Flying Saucer 如果你需要將現(xiàn)有的HTML頁面轉(zhuǎn)換為PDF,或者只需要生成簡單的文檔(如發(fā)票、合同等)。它易于使用,開發(fā)速度快,特別適合前端開發(fā)人員。

在實(shí)際項(xiàng)目中,建議根據(jù)具體需求和技術(shù)棧選擇合適的工具。如果你不確定哪種工具更適合,可以先嘗試一個(gè)小規(guī)模的原型項(xiàng)目,評(píng)估其性能和易用性,再做最終決定。

以上就是SpringBoot導(dǎo)出PDF的四種實(shí)現(xiàn)方法詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot導(dǎo)出PDF的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用Spring CROS解決項(xiàng)目中的跨域問題詳解

    使用Spring CROS解決項(xiàng)目中的跨域問題詳解

    這篇文章主要介紹了使用Spring CROS解決項(xiàng)目中的跨域問題詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Java之循環(huán)結(jié)構(gòu)、break、continue用法及說明

    Java之循環(huán)結(jié)構(gòu)、break、continue用法及說明

    本文介紹了Java中的三種循環(huán)語句:while、for和do-while,并詳細(xì)講解了它們的使用方法和應(yīng)用場景,通過實(shí)例練習(xí),讀者可以掌握循環(huán)語句的編寫技巧
    2025-10-10
  • 四步輕松搞定java web每天定時(shí)執(zhí)行任務(wù)

    四步輕松搞定java web每天定時(shí)執(zhí)行任務(wù)

    本篇文章主要介紹了四步輕松搞定java web每天定時(shí)執(zhí)行任務(wù),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • SpringBoot實(shí)現(xiàn)統(tǒng)一封裝返回前端結(jié)果集的示例代碼

    SpringBoot實(shí)現(xiàn)統(tǒng)一封裝返回前端結(jié)果集的示例代碼

    在實(shí)際項(xiàng)目開發(fā)過程中,我們經(jīng)常將返回?cái)?shù)據(jù)的基本形式統(tǒng)一為JSON格式的數(shù)據(jù)。但項(xiàng)目可能是由很多人開發(fā)的,所以我們最好將返回的結(jié)果統(tǒng)一起來。本文介紹了SpringBoot實(shí)現(xiàn)統(tǒng)一封裝返回前端結(jié)果集的示例代碼,需要的可以參考一下
    2022-06-06
  • Java異常類型及處理詳情

    Java異常類型及處理詳情

    這篇文章主要介紹了Java異常類型及處理, 異常指的是程序在執(zhí)行過程中,出現(xiàn)了非正常情況,導(dǎo)致了java的jvm停止。感興趣的小伙伴就和小編一起來學(xué)習(xí)下面文章的具體內(nèi)容吧
    2021-09-09
  • Java調(diào)用商品詳情API的項(xiàng)目實(shí)踐

    Java調(diào)用商品詳情API的項(xiàng)目實(shí)踐

    在現(xiàn)代電子商務(wù)網(wǎng)站中,商品詳情API是一個(gè)重要的組件,本文就來介紹一下Java調(diào)用商品詳情API的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • Java設(shè)計(jì)模式之備忘錄模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院

    Java設(shè)計(jì)模式之備忘錄模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院

    我們?cè)诰幊痰臅r(shí)候,經(jīng)常需要保存對(duì)象的中間狀態(tài),當(dāng)需要的時(shí)候,可以恢復(fù)到這個(gè)狀態(tài)。接下來通過本文給大家分享java設(shè)計(jì)模式之備忘錄模式,感興趣的的朋友一起看看吧
    2017-08-08
  • 利用AOP實(shí)現(xiàn)系統(tǒng)告警的方法詳解

    利用AOP實(shí)現(xiàn)系統(tǒng)告警的方法詳解

    在開發(fā)的過程中會(huì)遇到各種各樣的開發(fā)問題,服務(wù)器宕機(jī)、網(wǎng)絡(luò)抖動(dòng)、代碼本身的bug等等。針對(duì)代碼的bug,我們可以提前預(yù)支,通過發(fā)送告警信息來警示我們?nèi)ジ深A(yù),盡早處理。本文將利用AOP實(shí)現(xiàn)系統(tǒng)告警,需要的可以參考一下
    2022-09-09
  • Java如何根據(jù)前端返回的字段名進(jìn)行查詢數(shù)據(jù)

    Java如何根據(jù)前端返回的字段名進(jìn)行查詢數(shù)據(jù)

    這篇文章主要為大家詳細(xì)介紹了Java如何根據(jù)前端返回的字段名進(jìn)行查詢數(shù)據(jù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • Java設(shè)計(jì)模式中的簡單工廠模式解析

    Java設(shè)計(jì)模式中的簡單工廠模式解析

    這篇文章主要介紹了Java設(shè)計(jì)模式中的簡單工廠模式解析,簡單工廠模式提供一個(gè)創(chuàng)建對(duì)象實(shí)例的功能,而無須關(guān)心其具體實(shí)現(xiàn),被創(chuàng)建實(shí)例的類型可以是接口、抽象類,也可以是具體的類,需要的朋友可以參考下
    2023-11-11

最新評(píng)論

商河县| 昆明市| 保德县| 叙永县| 勐海县| 疏勒县| 星子县| 黔江区| 习水县| 三江| 满洲里市| 繁昌县| 正镶白旗| 武冈市| 光泽县| 江山市| 平遥县| 尖扎县| 新巴尔虎右旗| 平远县| 芜湖市| 台安县| 边坝县| 濮阳县| 冀州市| 思茅市| 龙岩市| 清苑县| 安龙县| 汝南县| 衢州市| 建湖县| 噶尔县| 灵川县| 从化市| 梁山县| 大名县| 聂拉木县| 万安县| 长汀县| 阿合奇县|