SpringBoot3集成iText實(shí)現(xiàn)PDF導(dǎo)出功能
一 解決方案
以下是小編列舉的一些常見的 PDF 導(dǎo)出方案。
1.1 iText
iText 是一個(gè)強(qiáng)大的 PDF 處理庫,可以用來創(chuàng)建和操作 PDF 文件。在 Spring Boot 項(xiàng)目中,你可以通過添加 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í)曲線較陡峭,需要一定的時(shí)間和精力去熟悉。
- 商業(yè)版需要購買許可證,可能會(huì)增加成本。
- 對于簡單的 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 是一個(gè)開源的 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,處理大型文件時(shí)性能可能略遜一籌。
- API 設(shè)計(jì)較為復(fù)雜,可能會(huì)影響開發(fā)效率。
1.4 Flyingsaucer
Flyingsaucer 是一個(gè)基于 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ī)范性要求較高,容錯(cuò)性較差。
上面是小編給大家列舉的幾個(gè)常見的方案,實(shí)際方案除了這些還有很多,比如 WeasyPrint、OpenHTMLtoPDF 等,在實(shí)際項(xiàng)目中選擇哪種方案取決于你的具體需求,比如是否需要處理復(fù)雜的布局、是否需要支持 CSS 樣式、是否需要處理中文等非 ASCII 字符等。每種方案都有其優(yōu)缺點(diǎn),需要根據(jù)項(xiàng)目實(shí)際情況進(jìn)行選擇。
小編這里和小伙伴們演示一下 iText 的使用,這個(gè)工具的能力最為強(qiáng)大。
二 iText
2.1 什么是 iText
iText 是一個(gè)功能強(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 時(shí),還需要注意開源協(xié)議的問題。iText 目前遵循 AGPL 開源協(xié)議,如果是商業(yè)用途,需要公開源代碼或者購買商業(yè)許可。
此外,iText 還提供了一些高級功能,如 PDF 加密、數(shù)字簽名、優(yōu)化 PDF 文件大小等。
2.2 案例
首先我們新建一個(gè) Spring Boot 項(xiàng)目,引入 Thymeleaf 依賴,引入這個(gè)依賴的原因在于我們一會(huì)利用 Thymeleaf 做頁面模版,然后利用 iText 做 PDF 生成。
項(xiàng)目創(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)的依賴一共有兩個(gè)。
接下來我們創(chuàng)建一個(gè) HTML 頁面作為生成的 PDF 模版,這個(gè)模版我們就放到 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>圖書價(jià)格</td>
<td th:text="${price}"></td>
</tr>
<tr>
<td>圖書作者</td>
<td th:text="${author}"></td>
</tr>
</table>
這個(gè)頁面模版使用 Thymeleaf 來構(gòu)建。
另外,由于這些工具大部分都不直接支持中文,需要我們提前準(zhǔn)備中文字體,松哥這里準(zhǔn)備了一個(gè)宋體字庫,放在 resources/fonts 目錄下:

接下來我們就準(zhǔn)備一個(gè)生成 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)容啦~
好啦,一個(gè)簡單的案例,帶小伙伴們感受下 Java 生成 PDF。
以上就是SpringBoot3集成iText實(shí)現(xiàn)PDF導(dǎo)出功能的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot3 iText實(shí)現(xiàn)PDF導(dǎo)出的資料請關(guān)注腳本之家其它相關(guān)文章!
- Springboot整合itext實(shí)現(xiàn)PDF文件合并
- SpringBoot集成iTextPDF的實(shí)例
- SpringBoot整合iText7導(dǎo)出PDF及性能優(yōu)化方式
- SpringBoot使用itext填充pdf表單及導(dǎo)出pdf的流程
- SpringBoot集成itext實(shí)現(xiàn)html轉(zhuǎn)PDF
- SpringBoot集成itextpdf實(shí)現(xiàn)根據(jù)模板動(dòng)態(tài)生成PDF
- SpringBoot使用iText7實(shí)現(xiàn)將HTML轉(zhuǎn)成PDF并添加頁眉頁腳水印
- SpringBoot集成itext導(dǎo)出PDF的過程
相關(guān)文章
JAVA基礎(chǔ)之基本數(shù)據(jù)類型全面解析
下面小編就為大家?guī)硪黄狫AVA基礎(chǔ)之基本數(shù)據(jù)類型全面解析。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-07-07
SpringBoot詳解如果通過@Value注解給靜態(tài)變量注入值
這篇文章主要介紹了springboot如何通過@Value給靜態(tài)變量注入值,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
Java之BigDecimal實(shí)現(xiàn)詳解
這篇文章主要介紹了Java之BigDecimal實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
SpringDataJpa:JpaRepository增刪改查操作
這篇文章主要介紹了SpringDataJpa:JpaRepository增刪改查操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
java虛擬機(jī)原理:Class字節(jié)碼二進(jìn)制文件分析
class文件全名稱為Java class文件,主要在平臺無關(guān)性和網(wǎng)絡(luò)移動(dòng)性方面使Java更適合網(wǎng)絡(luò)。它在平臺無關(guān)性方面的任務(wù)是:為Java程序提供獨(dú)立于底層主機(jī)平臺的二進(jìn)制形式的服務(wù)。下面我們來詳細(xì)解讀下它吧2021-09-09
MyBatis-Plus實(shí)現(xiàn)對查詢結(jié)果進(jìn)行分頁的基本步驟
MyBatis-Plus 是一個(gè) MyBatis 的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生,MyBatis-Plus 支持多種數(shù)據(jù)庫的分頁查詢,其分頁功能是通過 Page 類實(shí)現(xiàn)的,本文介紹了使用 MyBatis-Plus 實(shí)現(xiàn)分頁查詢的基本步驟,需要的朋友可以參考下2024-08-08
Java實(shí)現(xiàn)雪花算法的原理和實(shí)戰(zhàn)教程
這篇文章主要介紹了Java實(shí)現(xiàn)雪花算法的原理和實(shí)戰(zhàn)教程,本文通過語言表述和代碼的實(shí)現(xiàn)講解了該項(xiàng)算法,,需要的朋友可以參考下2021-06-06
SpringBoot Application的exclude不生效問題及排查
這篇文章主要介紹了SpringBoot Application的exclude不生效問題及排查,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11

