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

SpringBoot3集成iText實現(xiàn)PDF導(dǎo)出功能

 更新時間:2024年10月09日 10:35:15   作者:江南一點(diǎn)雨  
不知道小伙伴們在項目中有沒有遇到過導(dǎo)出 PDF 的需求,小編在之前的 tienchin 項目中有一個合同導(dǎo)出的功能,需要將文檔導(dǎo)出為PDF,將文檔導(dǎo)出為 PDF 有很多方案,不同方案的優(yōu)缺點(diǎn)也各不相同,今天小編就和大家演示一個,感興趣的小伙伴跟著小編一起來看看吧

一 解決方案

以下是小編列舉的一些常見的 PDF 導(dǎo)出方案。

1.1 iText

iText 是一個強(qiáng)大的 PDF 處理庫,可以用來創(chuàng)建和操作 PDF 文件。在 Spring Boot 項目中,你可以通過添加 iText 的依賴來使用它。iText 支持直接創(chuàng)建 PDF,也可以將 HTML 內(nèi)容轉(zhuǎn)換為 PDF。

iText 的特點(diǎn)如下:

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

  • 功能強(qiáng)大,支持創(chuàng)建和編輯 PDF 文件。
  • 提供豐富的 API,支持添加圖像、水印、表格、書簽和超鏈接等。
  • 支持?jǐn)?shù)字簽名和加密 PDF 文件。
  • 性能優(yōu)秀,能夠高效地處理大型 PDF 文件和復(fù)雜操作。

缺點(diǎn):

  • 學(xué)習(xí)曲線較陡峭,需要一定的時間和精力去熟悉。
  • 商業(yè)版需要購買許可證,可能會增加成本。
  • 對于簡單的 PDF 處理任務(wù)可能過于復(fù)雜。

1.2 OpenPDF

OpenPDF 是基于 iText5.x 版本開發(fā)的,它提供了將 HTML 轉(zhuǎn)換為 PDF 的功能。

OpenPDF 的特點(diǎn)如下:

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

  • 簡單易用,適合快速開發(fā)。
  • 提供了創(chuàng)建和操作 PDF 文件的一組 API。

缺點(diǎn):

功能相對較少,可能無法滿足復(fù)雜需求。

1.3 Apache PDFBox

Apache PDFBox 是一個開源的 Java PDF 庫,可以用來創(chuàng)建和編輯 PDF 文檔。它提供了豐富的 API 來操作 PDF 內(nèi)容。

Apache PDFBox 的特點(diǎn)如下:

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

  • 功能齊全,支持創(chuàng)建、編輯、提取內(nèi)容等操作。
  • 支持 OCR 識別和打印等功能。
  • 性能穩(wěn)定,適合全面處理 PDF 文件的場景。
  • 開源免費(fèi),采用 Apache 許可證。

缺點(diǎn):

  • 相對于 iText,處理大型文件時性能可能略遜一籌。
  • API 設(shè)計較為復(fù)雜,可能會影響開發(fā)效率。

1.4 Flyingsaucer

Flyingsaucer 是一個基于 iText 和 XHTMLRenderer 的 Java 庫,可以將 XHTML/CSS 內(nèi)容轉(zhuǎn)換為 PDF。

Flyingsaucer 特點(diǎn)如下:

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

  • 可以將 HTML/CSS 內(nèi)容直接轉(zhuǎn)換為 PDF。
  • 支持使用 CSS 樣式來控制 PDF 的外觀。

缺點(diǎn):

  • 不支持富文本,對于使用富文本編輯器的內(nèi)容處理不佳。
  • 對 HTML 的規(guī)范性要求較高,容錯性較差。

上面是小編給大家列舉的幾個常見的方案,實際方案除了這些還有很多,比如 WeasyPrint、OpenHTMLtoPDF 等,在實際項目中選擇哪種方案取決于你的具體需求,比如是否需要處理復(fù)雜的布局、是否需要支持 CSS 樣式、是否需要處理中文等非 ASCII 字符等。每種方案都有其優(yōu)缺點(diǎn),需要根據(jù)項目實際情況進(jìn)行選擇。

小編這里和小伙伴們演示一下 iText 的使用,這個工具的能力最為強(qiáng)大。

二 iText

2.1 什么是 iText

iText 是一個功能強(qiáng)大的開源 Java 庫,用于創(chuàng)建和操作 PDF 文件。

iText 提供了豐富的 API,可以生成交互式 PDF 文檔、添加書簽、頁碼、水印,以及拆分和合并 PDF 文檔等。

iText 支持將 PDF 保存為圖像文件,如 PNG 或 JPEG,并且可以在 PDF 文檔上繪制各種幾何形狀,如圓形、線條等。

iText的主要特點(diǎn)

  • 交互性:可以創(chuàng)建交互式 PDF 文檔,如表單填寫。
  • 添加元素:可以添加書簽、頁碼、水印等。
  • 分割與合并:可以將現(xiàn)有 PDF 分割或合并其他頁面。
  • 表單處理:可以處理 PDF 表單。
  • 保存為圖像:可以將 PDF 保存為圖像格式。
  • 繪制功能:提供 Canvas 類,支持繪制各種形狀。

注意,iText 本身不支持中文,需要引入中文字體文件,并使用 BaseFont.createFont 方法創(chuàng)建字體對象,然后使用該字體對象創(chuàng)建文本。

在使用 iText 時,還需要注意開源協(xié)議的問題。iText 目前遵循 AGPL 開源協(xié)議,如果是商業(yè)用途,需要公開源代碼或者購買商業(yè)許可。

此外,iText 還提供了一些高級功能,如 PDF 加密、數(shù)字簽名、優(yōu)化 PDF 文件大小等。

2.2 案例

首先我們新建一個 Spring Boot 項目,引入 Thymeleaf 依賴,引入這個依賴的原因在于我們一會利用 Thymeleaf 做頁面模版,然后利用 iText 做 PDF 生成。

項目創(chuàng)建成功之后,再引入 iText 的依賴,最終依賴如下:

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation group: 'com.itextpdf', name: 'itextpdf', version: '5.5.13.4'
    implementation group: 'com.itextpdf', name: 'html2pdf', version: '5.0.5'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

注意,這里和 iText 相關(guān)的依賴一共有兩個。

接下來我們創(chuàng)建一個 HTML 頁面作為生成的 PDF 模版,這個模版我們就放到 Thymeleaf 默認(rèn)的 templates 目錄下:

<!DOCTYPE html>
<h1 th:text="${title}"></h1>
<table border="1">
    <tr>
        <td>圖書名稱</td>
        <td th:text="${name}"></td>
    </tr>
    <tr>
        <td>圖書價格</td>
        <td th:text="${price}"></td>
    </tr>
    <tr>
        <td>圖書作者</td>
        <td th:text="${author}"></td>
    </tr>
</table>

這個頁面模版使用 Thymeleaf 來構(gòu)建。

另外,由于這些工具大部分都不直接支持中文,需要我們提前準(zhǔn)備中文字體,松哥這里準(zhǔn)備了一個宋體字庫,放在 resources/fonts 目錄下:

接下來我們就準(zhǔn)備一個生成 PDF 的工具類,如下:

package org.javaboy.openpdfdemo.utils;

import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.io.font.PdfEncodings;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.font.FontProvider;

import java.io.IOException;
import java.io.OutputStream;


public class HtmlToPdfUtils {

    public static void convertToPdf(String html, OutputStream outputStream) throws IOException {

        PdfWriter pdfWriter = new PdfWriter(outputStream);
        PdfDocument pdfDocument = new PdfDocument(pdfWriter);
        // 設(shè)置為A4大小
        pdfDocument.setDefaultPageSize(PageSize.A4);

        // 添加中文字體支持
        ConverterProperties properties = new ConverterProperties();
        FontProvider fontProvider = new FontProvider();

        // 添加自定義字體,例如宋體
        PdfFont stSong = PdfFontFactory.createFont(HtmlToPdfUtils.class.getResource("/fonts/STSong.ttf").getPath(), PdfEncodings.WINANSI);
        fontProvider.addFont(stSong.getFontProgram(), PdfEncodings.IDENTITY_H);

        properties.setFontProvider(fontProvider);
        if (html != null) {
            // 生成pdf文檔
            HtmlConverter.convertToPdf(html, pdfDocument, properties);
            pdfWriter.close();
            pdfDocument.close();
        } else {
            throw new RuntimeException("HTML 內(nèi)容不能為空");
        }
    }
}

這塊代碼沒啥好說的,基本上見名知義。

最后,在 Controller 接口中調(diào)用該工具類,如下:

package org.javaboy.openpdfdemo.controller;

import com.itextpdf.text.DocumentException;
import jakarta.servlet.http.HttpServletResponse;
import org.javaboy.openpdfdemo.utils.HtmlToPdfUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import java.io.IOException;

@RestController
public class HelloController {

    @Autowired
    TemplateEngine templateEngine;

    @GetMapping("/getBookInfo")
    public void getBookInfo(HttpServletResponse response) throws IOException, DocumentException {
        Context ctx = new Context();
        ctx.setVariable("title","<深入淺出 Spring Security>圖書詳情");
        ctx.setVariable("name","<深入淺出 Spring Security>");
        ctx.setVariable("price","99.00");
        ctx.setVariable("author","江南一點(diǎn)雨");
        String bookInfo = templateEngine.process("book_info", ctx);
        response.setContentType("application/pdf;charset=utf-8");
        HtmlToPdfUtils.convertToPdf(bookInfo, response.getOutputStream());
    }
}

先利用 TemplateEngine,將頁面模版的內(nèi)容轉(zhuǎn)為渲染后的 HTML 字符串,然后調(diào)用工具方法去生成 PDF,生成的 PDF 直接就賦值給請求響應(yīng)的輸出流。

最后,我們在瀏覽器中訪問 http://localhost:8080/getBookInfo 就可以查看生成的 PDF 內(nèi)容啦~

好啦,一個簡單的案例,帶小伙伴們感受下 Java 生成 PDF。

以上就是SpringBoot3集成iText實現(xiàn)PDF導(dǎo)出功能的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot3 iText實現(xiàn)PDF導(dǎo)出的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot整合新版SpringSecurity完整過程

    SpringBoot整合新版SpringSecurity完整過程

    Spring Security是保障Spring應(yīng)用程序安全的強(qiáng)大框架,而新版的Spring Security引入了lambda表達(dá)式來配置,使得安全配置更加簡潔、優(yōu)雅,本文將介紹如何在Spring Boot項目中整合新版Spring Security,需要的朋友可以參考下
    2024-02-02
  • 簡單談一談Java中的Unsafe類

    簡單談一談Java中的Unsafe類

    其實Java官方不推薦使用Unsafe類,因為官方認(rèn)為,這個類別人很難正確使用,非正確使用會給JVM帶來致命錯誤。但還是要會使用,下面這篇文章就來給大家簡單的談一談關(guān)于Java中Unsafe類的相關(guān)資料,需要的朋友可以參考下
    2018-05-05
  • SpringBoot調(diào)用WebService接口方法示例代碼

    SpringBoot調(diào)用WebService接口方法示例代碼

    這篇文章主要介紹了使用SpringWebServices調(diào)用SOAP?WebService接口的步驟,包括導(dǎo)入依賴、創(chuàng)建請求類和響應(yīng)類、生成ObjectFactory類、配置WebServiceTemplate、調(diào)用WebService接口以及測試代碼,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-02-02
  • java -D參數(shù)設(shè)置系統(tǒng)屬性無效問題及解決

    java -D參數(shù)設(shè)置系統(tǒng)屬性無效問題及解決

    這篇文章主要介紹了java -D參數(shù)設(shè)置系統(tǒng)屬性無效問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • java唯一字符串ID生成方案詳解

    java唯一字符串ID生成方案詳解

    這篇文章主要給大家介紹了關(guān)于java唯一字符串ID生成方案的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • JPA自定義對象接收查詢結(jié)果集操作

    JPA自定義對象接收查詢結(jié)果集操作

    這篇文章主要介紹了JPA自定義對象接收查詢結(jié)果集操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Java實例化的幾種方法總結(jié)

    Java實例化的幾種方法總結(jié)

    這篇文章主要介紹了Java實例化的幾種方法總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Java StringBuffer與StringBuilder有什么區(qū)別

    Java StringBuffer與StringBuilder有什么區(qū)別

    當(dāng)對字符串進(jìn)行修改的時候,需要使用 StringBuffer 和 StringBuilder類,和String類不同的是,StringBuffer和 StringBuilder類的對象能夠被多次的修改,并且不產(chǎn)生新的未使用對象,本篇我們來分析分析它們的區(qū)別
    2023-01-01
  • 帶你了解mybatis如何實現(xiàn)讀寫分離

    帶你了解mybatis如何實現(xiàn)讀寫分離

    本篇文章主要介紹了MyBatis實現(xiàn)數(shù)據(jù)讀寫分離的實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助
    2021-08-08
  • 一文教會你如何從0到1搭建一個SpringBoot項目

    一文教會你如何從0到1搭建一個SpringBoot項目

    今天剛好學(xué)習(xí)到SpringBoot,就順便記錄一下吧,下面這篇文章主要給大家介紹了關(guān)于如何從0到1搭建一個SpringBoot項目的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01

最新評論