SpringBoot3集成iText實現(xiàn)PDF導出功能
一 解決方案
以下是小編列舉的一些常見的 PDF 導出方案。
1.1 iText
iText 是一個強大的 PDF 處理庫,可以用來創(chuàng)建和操作 PDF 文件。在 Spring Boot 項目中,你可以通過添加 iText 的依賴來使用它。iText 支持直接創(chuàng)建 PDF,也可以將 HTML 內容轉換為 PDF。
iText 的特點如下:
優(yōu)點:
- 功能強大,支持創(chuàng)建和編輯 PDF 文件。
- 提供豐富的 API,支持添加圖像、水印、表格、書簽和超鏈接等。
- 支持數字簽名和加密 PDF 文件。
- 性能優(yōu)秀,能夠高效地處理大型 PDF 文件和復雜操作。
缺點:
- 學習曲線較陡峭,需要一定的時間和精力去熟悉。
- 商業(yè)版需要購買許可證,可能會增加成本。
- 對于簡單的 PDF 處理任務可能過于復雜。
1.2 OpenPDF
OpenPDF 是基于 iText5.x 版本開發(fā)的,它提供了將 HTML 轉換為 PDF 的功能。
OpenPDF 的特點如下:
優(yōu)點:
- 簡單易用,適合快速開發(fā)。
- 提供了創(chuàng)建和操作 PDF 文件的一組 API。
缺點:
功能相對較少,可能無法滿足復雜需求。
1.3 Apache PDFBox
Apache PDFBox 是一個開源的 Java PDF 庫,可以用來創(chuàng)建和編輯 PDF 文檔。它提供了豐富的 API 來操作 PDF 內容。
Apache PDFBox 的特點如下:
優(yōu)點:
- 功能齊全,支持創(chuàng)建、編輯、提取內容等操作。
- 支持 OCR 識別和打印等功能。
- 性能穩(wěn)定,適合全面處理 PDF 文件的場景。
- 開源免費,采用 Apache 許可證。
缺點:
- 相對于 iText,處理大型文件時性能可能略遜一籌。
- API 設計較為復雜,可能會影響開發(fā)效率。
1.4 Flyingsaucer
Flyingsaucer 是一個基于 iText 和 XHTMLRenderer 的 Java 庫,可以將 XHTML/CSS 內容轉換為 PDF。
Flyingsaucer 特點如下:
優(yōu)點:
- 可以將 HTML/CSS 內容直接轉換為 PDF。
- 支持使用 CSS 樣式來控制 PDF 的外觀。
缺點:
- 不支持富文本,對于使用富文本編輯器的內容處理不佳。
- 對 HTML 的規(guī)范性要求較高,容錯性較差。
上面是小編給大家列舉的幾個常見的方案,實際方案除了這些還有很多,比如 WeasyPrint、OpenHTMLtoPDF 等,在實際項目中選擇哪種方案取決于你的具體需求,比如是否需要處理復雜的布局、是否需要支持 CSS 樣式、是否需要處理中文等非 ASCII 字符等。每種方案都有其優(yōu)缺點,需要根據項目實際情況進行選擇。
小編這里和小伙伴們演示一下 iText 的使用,這個工具的能力最為強大。
二 iText
2.1 什么是 iText
iText 是一個功能強大的開源 Java 庫,用于創(chuàng)建和操作 PDF 文件。
iText 提供了豐富的 API,可以生成交互式 PDF 文檔、添加書簽、頁碼、水印,以及拆分和合并 PDF 文檔等。
iText 支持將 PDF 保存為圖像文件,如 PNG 或 JPEG,并且可以在 PDF 文檔上繪制各種幾何形狀,如圓形、線條等。
iText的主要特點:
- 交互性:可以創(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 加密、數字簽名、優(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 相關的依賴一共有兩個。
接下來我們創(chuàng)建一個 HTML 頁面作為生成的 PDF 模版,這個模版我們就放到 Thymeleaf 默認的 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 來構建。
另外,由于這些工具大部分都不直接支持中文,需要我們提前準備中文字體,松哥這里準備了一個宋體字庫,放在 resources/fonts 目錄下:

接下來我們就準備一個生成 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);
// 設置為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 內容不能為空");
}
}
}
這塊代碼沒啥好說的,基本上見名知義。
最后,在 Controller 接口中調用該工具類,如下:
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","江南一點雨");
String bookInfo = templateEngine.process("book_info", ctx);
response.setContentType("application/pdf;charset=utf-8");
HtmlToPdfUtils.convertToPdf(bookInfo, response.getOutputStream());
}
}
先利用 TemplateEngine,將頁面模版的內容轉為渲染后的 HTML 字符串,然后調用工具方法去生成 PDF,生成的 PDF 直接就賦值給請求響應的輸出流。
最后,我們在瀏覽器中訪問 http://localhost:8080/getBookInfo 就可以查看生成的 PDF 內容啦~
好啦,一個簡單的案例,帶小伙伴們感受下 Java 生成 PDF。
以上就是SpringBoot3集成iText實現(xiàn)PDF導出功能的詳細內容,更多關于SpringBoot3 iText實現(xiàn)PDF導出的資料請關注腳本之家其它相關文章!
相關文章
SpringBoot整合新版SpringSecurity完整過程
Spring Security是保障Spring應用程序安全的強大框架,而新版的Spring Security引入了lambda表達式來配置,使得安全配置更加簡潔、優(yōu)雅,本文將介紹如何在Spring Boot項目中整合新版Spring Security,需要的朋友可以參考下2024-02-02
SpringBoot調用WebService接口方法示例代碼
這篇文章主要介紹了使用SpringWebServices調用SOAP?WebService接口的步驟,包括導入依賴、創(chuàng)建請求類和響應類、生成ObjectFactory類、配置WebServiceTemplate、調用WebService接口以及測試代碼,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2025-02-02
Java StringBuffer與StringBuilder有什么區(qū)別
當對字符串進行修改的時候,需要使用 StringBuffer 和 StringBuilder類,和String類不同的是,StringBuffer和 StringBuilder類的對象能夠被多次的修改,并且不產生新的未使用對象,本篇我們來分析分析它們的區(qū)別2023-01-01

