SpringBoot3集成iText實現(xiàn)PDF導(dǎo)出功能
一 解決方案
以下是小編列舉的一些常見的 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)文章!
- Springboot整合itext實現(xiàn)PDF文件合并
- SpringBoot集成iTextPDF的實例
- SpringBoot整合iText7導(dǎo)出PDF及性能優(yōu)化方式
- SpringBoot使用itext填充pdf表單及導(dǎo)出pdf的流程
- SpringBoot集成itext實現(xiàn)html轉(zhuǎn)PDF
- SpringBoot集成itextpdf實現(xiàn)根據(jù)模板動態(tài)生成PDF
- SpringBoot使用iText7實現(xiàn)將HTML轉(zhuǎn)成PDF并添加頁眉頁腳水印
- SpringBoot集成itext導(dǎo)出PDF的過程
相關(guān)文章
SpringBoot整合新版SpringSecurity完整過程
Spring Security是保障Spring應(yīng)用程序安全的強(qiáng)大框架,而新版的Spring Security引入了lambda表達(dá)式來配置,使得安全配置更加簡潔、優(yōu)雅,本文將介紹如何在Spring Boot項目中整合新版Spring Security,需要的朋友可以參考下2024-02-02SpringBoot調(diào)用WebService接口方法示例代碼
這篇文章主要介紹了使用SpringWebServices調(diào)用SOAP?WebService接口的步驟,包括導(dǎo)入依賴、創(chuàng)建請求類和響應(yīng)類、生成ObjectFactory類、配置WebServiceTemplate、調(diào)用WebService接口以及測試代碼,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-02-02java -D參數(shù)設(shè)置系統(tǒng)屬性無效問題及解決
這篇文章主要介紹了java -D參數(shù)設(shè)置系統(tǒng)屬性無效問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12Java StringBuffer與StringBuilder有什么區(qū)別
當(dāng)對字符串進(jìn)行修改的時候,需要使用 StringBuffer 和 StringBuilder類,和String類不同的是,StringBuffer和 StringBuilder類的對象能夠被多次的修改,并且不產(chǎn)生新的未使用對象,本篇我們來分析分析它們的區(qū)別2023-01-01