Java SpringBoot將Word文檔轉(zhuǎn)為PDF的全流程解析
今天產(chǎn)品丟給我一個需求,說用戶希望在系統(tǒng)里上傳 Word 文檔,然后能一鍵轉(zhuǎn)成 PDF 格式。好家伙,乍一聽還挺簡單,但仔細(xì)想想,這需求門道可不少。咱們一點(diǎn)點(diǎn)來拆解。
一、需求分析
首先,用戶說的 “Word 文檔” 其實(shí)挺寬泛的。Word 文檔有.doc和.docx兩種常見格式,.doc是老版本的二進(jìn)制格式,.docx是基于 XML 的壓縮格式,處理方式完全不一樣。另外,文檔里可能有圖片、表格、公式、超鏈接,甚至還會有頁眉頁腳,這些內(nèi)容在轉(zhuǎn)換過程中都得保證原樣顯示,不能丟東西、亂排版。
還有,從系統(tǒng)角度看,得考慮轉(zhuǎn)換效率和穩(wěn)定性。要是用戶上傳個幾十 MB 的大文檔,轉(zhuǎn)換半天沒反應(yīng),或者直接把服務(wù)器搞崩了,那肯定不行。最后,還得做好異常處理,比如文檔格式不對、文件損壞,這些情況都得給用戶友好的提示。
二、技術(shù)選型
明確需求后,就得找趁手的工具了。在 Java 里,能把 Word 轉(zhuǎn) PDF 的工具還真不少。
第一個想到的是 Apache POI,它能讀寫 Word 文檔,但是它主要側(cè)重于文檔內(nèi)容的操作,直接轉(zhuǎn) PDF 還得配合其他庫,有點(diǎn)麻煩,而且對復(fù)雜格式支持不太好,就先 pass 掉。
然后是 Aspose.Words,這個庫功能超強(qiáng)大,幾乎能完美支持所有 Word 格式和元素,轉(zhuǎn)換效果也很好。但它是收費(fèi)的,要是公司預(yù)算充足,其實(shí)是個不錯的選擇。
最后,我盯上了 Docx4j。它是開源的,對.docx格式支持特別好,轉(zhuǎn)換 PDF 也很方便,社區(qū)資料也多,遇到問題能找到不少解決方案。雖然對老版本.doc支持差點(diǎn),但現(xiàn)在主流都是.docx,權(quán)衡之下,就它了!
三、Spring Boot 整合
確定用 Docx4j 后,就開始把它集成到 Spring Boot 項(xiàng)目里。
先打開pom.xml文件,加依賴:
<dependency> <groupId>org.docx4j</groupId> <artifactId>docx4j</artifactId> <version>8.3.3</version> </dependency> <dependency> <groupId>org.docx4j</groupId> <artifactId>docx4j-export-fo</artifactId> <version>8.3.3</version> </dependency>
第一個依賴是 Docx4j 的核心庫,第二個是用來把 Word 文檔轉(zhuǎn)成 PDF 的模塊。加完依賴,Maven 會自動把需要的 jar 包下載下來。
四、代碼實(shí)現(xiàn)
接下來就是寫代碼了,咱們新建一個工具類WordToPdfConverter:
import org.docx4j.Docx4J; import org.docx4j.fonts.IdentityPlusMapper; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart; import org.docx4j.pdf2HTMLEx.PdfSettings; import org.docx4j.utils.fonts.FontUtils; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; public class WordToPdfConverter { public static void convert(String inputFilePath, String outputFilePath) { try { // 加載Word文檔 WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new java.io.File(inputFilePath)); // 處理字體,解決中文亂碼問題 FontUtils.setFontInfo(wordMLPackage); IdentityPlusMapper fontMapper = new IdentityPlusMapper(); fontMapper.put("隸書", "LiSu"); fontMapper.put("宋體", "SimSun"); fontMapper.put("黑體", "SimHei"); fontMapper.put("楷體", "KaiTi"); wordMLPackage.setFontMapper(fontMapper); // 獲取文檔的主部分 MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart(); // 創(chuàng)建PDF設(shè)置 PdfSettings pdfSettings = new PdfSettings(); // 設(shè)置字體嵌入,防止在其他設(shè)備上顯示異常 pdfSettings.setFontEmbeddingEnabled(true); // 執(zhí)行轉(zhuǎn)換 OutputStream os = new FileOutputStream(new File(outputFilePath)); Docx4J.toPDF(wordMLPackage, os, pdfSettings); os.close(); System.out.println("轉(zhuǎn)換成功!"); } catch (Exception e) { e.printStackTrace(); System.out.println("轉(zhuǎn)換失?。? + e.getMessage()); } } }
代碼解釋:
- WordprocessingMLPackage.load方法加載指定路徑的 Word 文檔。
- 處理字體部分,因?yàn)槟J(rèn)可能會出現(xiàn)中文亂碼,通過IdentityPlusMapper指定常用中文字體的映射關(guān)系。
- PdfSettings用來配置 PDF 轉(zhuǎn)換的參數(shù),這里開啟了字體嵌入,這樣生成的 PDF 在其他設(shè)備上打開,字體也不會錯亂。
- 最后用Docx4J.toPDF方法執(zhí)行轉(zhuǎn)換,把轉(zhuǎn)換后的內(nèi)容輸出到指定的文件路徑。
在 Spring Boot 的 Controller 里調(diào)用這個方法,就能提供轉(zhuǎn)換接口了:
import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; import java.util.UUID; @RestController @RequestMapping("/convert") public class WordToPdfController { @PostMapping public String convertWordToPdf(@RequestParam("file") MultipartFile file) { try { // 生成臨時(shí)文件路徑 String originalFilename = file.getOriginalFilename(); String tempFilePath = System.getProperty("java.io.tmpdir") + File.separator + UUID.randomUUID() + "_" + originalFilename; file.transferTo(new File(tempFilePath)); // 生成輸出PDF文件路徑 String outputFilePath = System.getProperty("java.io.tmpdir") + File.separator + UUID.randomUUID() + ".pdf"; // 執(zhí)行轉(zhuǎn)換 WordToPdfConverter.convert(tempFilePath, outputFilePath); // 返回下載鏈接或者處理邏輯 return "轉(zhuǎn)換成功,PDF路徑:" + outputFilePath; } catch (IOException e) { e.printStackTrace(); return "文件處理失?。? + e.getMessage(); } } }
在這個 Controller 里,@PostMapping定義了一個接收文件上傳的接口。先把上傳的文件保存到臨時(shí)目錄,再調(diào)用WordToPdfConverter.convert方法進(jìn)行轉(zhuǎn)換,最后可以根據(jù)實(shí)際需求,把生成的 PDF 返回給用戶下載,或者存到指定位置。
五、總結(jié)
到這兒,從接到需求到代碼實(shí)現(xiàn),Java 用 Spring Boot 把 Word 轉(zhuǎn) PDF 的整個流程就走完了。當(dāng)然,實(shí)際項(xiàng)目里還得考慮更多,比如文件存儲優(yōu)化、并發(fā)處理、轉(zhuǎn)換進(jìn)度監(jiān)控。要是你在做這個功能時(shí)遇到啥問題,或者有更好的方案,歡迎一起嘮嘮!
到此這篇關(guān)于Java SpringBoot將Word文檔轉(zhuǎn)為PDF的全流程解析的文章就介紹到這了,更多相關(guān)SpringBoot Word轉(zhuǎn)PDF內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Log4j關(guān)閉Spring和Hibernate日志打印方式
這篇文章主要介紹了Log4j關(guān)閉Spring和Hibernate日志打印方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12java開發(fā)_圖片截取工具實(shí)現(xiàn)原理
本文將詳細(xì)介紹java開發(fā)_圖片截取工具實(shí)現(xiàn)原理,需要了解的朋友可以參考下2012-11-11Java使用BigDecimal精確運(yùn)算浮點(diǎn)數(shù)
這篇文章主要介紹了Java使用BigDecimal精確運(yùn)算浮點(diǎn)數(shù),幫助大家更好的處理浮點(diǎn)數(shù)數(shù)據(jù),感興趣的朋友可以了解下2020-10-10java基礎(chǔ)之 “==”與“equals”區(qū)別詳解
這篇文章主要介紹了java基礎(chǔ)之 “==”與“equals”區(qū)別詳解,需要的朋友可以參考下2020-02-02Java靜態(tài)static關(guān)鍵字原理詳解
這篇文章主要介紹了Java靜態(tài)static關(guān)鍵字原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12ibatis學(xué)習(xí)之搭建Java項(xiàng)目
本文的主要內(nèi)容是簡單介紹了ibatis和如何通過iBatis搭建JAVA項(xiàng)目,包含了一個相關(guān)實(shí)例,需要的朋友可以參考下。2017-09-09