SpringBoot使用Docx4j實現(xiàn)DOCX轉PDF功能
前言
在當今的企業(yè)級應用中,文檔格式轉換是一個高頻但又容易被低估的需求。從合同簽署、報表生成到知識庫管理,DOCX轉PDF的需求無處不在。市面上的解決方案五花八門,但真正能平衡"成本、質量、可維護性"的方案卻寥寥無幾。今天我們就介紹一款使用純Java實現(xiàn) DOCX 轉 PDF的方案,超級簡單,簡直不要太爽。

Docx4j的核心優(yōu)勢
Docx4j之所以成為企業(yè)級應用的首選方案,主要得益于其以下核心優(yōu)勢:
1.純Java實現(xiàn):無需安裝任何外部軟件,部署簡單
2.開源免費:采用Apache 2.0 License,可商用
3.樣式保真度高:能完美保留Word文檔中的圖片、表格、頁眉頁腳等復雜格式
4.易于集成:可以無縫集成到SpringBoot項目中
實戰(zhàn)演示
項目依賴配置
在pom.xml中添加docx4j相關依賴:
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-core</artifactId>
<!-- 使用兼容 Java 8 的版本 Java 11 11.4.8-->
<version>8.3.4</version>
</dependency>
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-JAXB-ReferenceImpl</artifactId>
<version>8.3.4</version>
</dependency>
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-export-fo</artifactId>
<version>8.3.4</version>
</dependency>
核心工具類
創(chuàng)建DocxToPdfUtil工具類,封裝DOCX轉PDF的核心邏輯:
/**
* DocxToPdfUtil
* @author senfel
* @version 1.0
* @date 2026/2/4 17:21
*/
@Slf4j
public class DocxToPdfUtil {
/**
* 將docx文件轉換為 PDF
* @param docxPath
* @param pdfPath
* @author senfel
* @date 2026/2/4 17:22
* @return void
*/
public static void convert(String docxPath, String pdfPath) {
try {
// 1. 加載 Word 文檔
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new File(docxPath));
// 2. 配置字體映射(防止中文亂碼)
Mapper fontMapper = new IdentityPlusMapper();
PhysicalFonts.discoverPhysicalFonts();
PhysicalFont simsun = PhysicalFonts.get("SimSun");
if (simsun != null) {
fontMapper.put("SimSun", simsun);
// 常用中文字體映射表
fontMapper.put("隸書", PhysicalFonts.get("LiSu"));
fontMapper.put("宋體", PhysicalFonts.get("SimSun"));
fontMapper.put("微軟雅黑", PhysicalFonts.get("Microsoft YaHei"));
fontMapper.put("黑體", PhysicalFonts.get("SimHei"));
fontMapper.put("楷體", PhysicalFonts.get("KaiTi"));
fontMapper.put("新宋體", PhysicalFonts.get("NSimSun"));
fontMapper.put("華文行楷", PhysicalFonts.get("STXingkai"));
fontMapper.put("華文仿宋", PhysicalFonts.get("STFangsong"));
fontMapper.put("仿宋", PhysicalFonts.get("FangSong"));
fontMapper.put("幼圓", PhysicalFonts.get("YouYuan"));
fontMapper.put("華文宋體", PhysicalFonts.get("STSong"));
fontMapper.put("華文中宋", PhysicalFonts.get("STZhongsong"));
fontMapper.put("等線", PhysicalFonts.get("SimSun"));
fontMapper.put("等線 Light", PhysicalFonts.get("SimSun"));
fontMapper.put("華文琥珀", PhysicalFonts.get("STHupo"));
fontMapper.put("華文隸書", PhysicalFonts.get("STLiti"));
fontMapper.put("華文新魏", PhysicalFonts.get("STXinwei"));
fontMapper.put("華文彩云", PhysicalFonts.get("STCaiyun"));
fontMapper.put("方正姚體", PhysicalFonts.get("FZYaoti"));
fontMapper.put("方正舒體", PhysicalFonts.get("FZShuTi"));
fontMapper.put("華文細黑", PhysicalFonts.get("STXihei"));
fontMapper.put("宋體擴展", PhysicalFonts.get("simsun-extB"));
fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312"));
fontMapper.put("新細明體", PhysicalFonts.get("SimSun"));
// 修復體(正文)/宋體(標題亂碼
PhysicalFonts.put("PMingLiU", PhysicalFonts.get("SimSun"));
PhysicalFonts.put("新細明體", PhysicalFonts.get("SimSun"));
wordMLPackage.setFontMapper(fontMapper);
}
// 3. 創(chuàng)建輸出流并執(zhí)行轉換
try (FileOutputStream os = new FileOutputStream(pdfPath)) {
Docx4J.toPDF(wordMLPackage, os);
}
log.info("PDF 生成成功:{}" ,pdfPath);
} catch (Exception e) {
log.error("轉換失?。簕}",e.getMessage(),e);
}
}
}
測試用例
創(chuàng)建類DocxToPdfTest,驗證提供DOCX轉PDF的工具類:
/**
* DocxToPdfTest
* @author senfel
* @version 1.0
* @date 2026/2/4 17:26
*/
@SpringBootTest
public class DocxToPdfTest {
/**
* covertTest
* @author senfel
* @date 2026/2/4 17:27
* @return void
*/
@Test
public void covertTest() {
String docxPath = "D:\\blank\\小程序簡介中英文.docx";
String pdfPath = "D:\\blank\\小程序簡介中英文.pdf";
DocxToPdfUtil.convert(docxPath, pdfPath);
}
}

解決中文亂碼
Windows
在Windows環(huán)境中,中文亂碼主要是由于字體映射問題導致的。我們需要在工具類中添加中文字體映射表,確保docx4j能夠正確識別和轉換中文字體。
Linux
在Linux環(huán)境中,中文亂碼問題更為復雜,需要安裝Windows字體。具體步驟如下:
1.新建字體文件夾:
sudo mkdir -p /usr/share/fonts/win_font
2.拷貝Windows字體文件:將Windows系統(tǒng)中路徑為C:\Windows\Fonts的字體文件拷貝到Linux的/usr/share/fonts/win_font目錄中。

3.加載字體文件:
cd /usr/share/fonts/win_font sudo mkfontscale # 生成字體縮放文件 sudo mkfontdir # 生成字體目錄索引 sudo fc-cache -fv # 刷新字體緩存
4.驗證字體安裝:
fc-list :lang=zh
總結
Docx4j是一個優(yōu)秀的開源文檔處理工具,它為SpringBoot項目提供了一種輕量級、高性能的DOCX轉PDF解決方案。通過本文的介紹,我們了解了docx4j的核心優(yōu)勢、并使用springboot實戰(zhàn)落了一個簡單的案例。在實際項目中,我們可以根據(jù)業(yè)務需求和技術選型戰(zhàn)略,選擇最適合的文檔轉換方案。對于大多數(shù)企業(yè)級應用來說,Docx4j無疑是一個性價比極高的選擇。
以上就是SpringBoot使用Docx4j實現(xiàn)DOCX轉PDF功能的詳細內容,更多關于SpringBoot DOCX轉PDF的資料請關注腳本之家其它相關文章!
相關文章
Java8中List轉Map(Collectors.toMap) 的技巧分享
在最近的工作開發(fā)之中,慢慢習慣了很多Java8中的Stream的用法,很方便而且也可以并行的去執(zhí)行這個流,這篇文章主要給大家介紹了關于Java8中List轉Map(Collectors.toMap) 的相關資料,需要的朋友可以參考下2021-07-07
使用java swing實現(xiàn)qq登錄界面示例分享
這篇文章主要介紹了使用java swing實現(xiàn)qq登錄界面示例,需要的朋友可以參考下2014-04-04
MyBatis-Plus攔截器對敏感數(shù)據(jù)實現(xiàn)加密
做課程項目petstore時遇到需要加密屬性的問題,而MyBatis-Plus為開發(fā)者提供了攔截器的相關接口,本文主要介紹通過MyBatis-Plus的攔截器接口自定義一個攔截器類實現(xiàn)敏感數(shù)據(jù)如用戶密碼的加密功能,感興趣的可以了解一下2021-11-11

