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

