最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot使用Docx4j實(shí)現(xiàn)DOCX轉(zhuǎn)PDF功能

 更新時(shí)間:2026年02月05日 09:02:15   作者:小沈同學(xué)呀  
在當(dāng)今的企業(yè)級(jí)應(yīng)用中,文檔格式轉(zhuǎn)換是一個(gè)高頻但又容易被低估的需求,從合同簽署、報(bào)表生成到知識(shí)庫管理,DOCX轉(zhuǎn)PDF的需求無處不在,今天我們就介紹一款使用純Java實(shí)現(xiàn) DOCX 轉(zhuǎn) PDF的方案,超級(jí)簡單,簡直不要太爽,需要的朋友可以參考下

前言

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

Docx4j的核心優(yōu)勢(shì)

Docx4j之所以成為企業(yè)級(jí)應(yīng)用的首選方案,主要得益于其以下核心優(yōu)勢(shì):
1.純Java實(shí)現(xiàn):無需安裝任何外部軟件,部署簡單
2.開源免費(fèi):采用Apache 2.0 License,可商用
3.樣式保真度高:能完美保留Word文檔中的圖片、表格、頁眉頁腳等復(fù)雜格式
4.易于集成:可以無縫集成到SpringBoot項(xiàng)目中

實(shí)戰(zhàn)演示

項(xiàng)目依賴配置

在pom.xml中添加docx4j相關(guān)依賴:

<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轉(zhuǎn)PDF的核心邏輯:

/**
 * DocxToPdfUtil
 * @author senfel
 * @version 1.0
 * @date 2026/2/4 17:21
 */
@Slf4j
public class DocxToPdfUtil {
    /**
     * 將docx文件轉(zhuǎn)換為 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("華文細(xì)黑", PhysicalFonts.get("STXihei"));
                fontMapper.put("宋體擴(kuò)展", PhysicalFonts.get("simsun-extB"));
                fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312"));
                fontMapper.put("新細(xì)明體", PhysicalFonts.get("SimSun"));
                // 修復(fù)體(正文)/宋體(標(biāo)題亂碼
                PhysicalFonts.put("PMingLiU", PhysicalFonts.get("SimSun"));
                PhysicalFonts.put("新細(xì)明體", PhysicalFonts.get("SimSun"));
                wordMLPackage.setFontMapper(fontMapper);
            }
            // 3. 創(chuàng)建輸出流并執(zhí)行轉(zhuǎn)換
            try (FileOutputStream os = new FileOutputStream(pdfPath)) {
                Docx4J.toPDF(wordMLPackage, os);
            }
            log.info("PDF 生成成功:{}" ,pdfPath);
        } catch (Exception e) {
            log.error("轉(zhuǎn)換失?。簕}",e.getMessage(),e);
        }
    }
}

測(cè)試用例

創(chuàng)建類DocxToPdfTest,驗(yàn)證提供DOCX轉(zhuǎn)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)境中,中文亂碼主要是由于字體映射問題導(dǎo)致的。我們需要在工具類中添加中文字體映射表,確保docx4j能夠正確識(shí)別和轉(zhuǎn)換中文字體。

Linux

在Linux環(huán)境中,中文亂碼問題更為復(fù)雜,需要安裝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.驗(yàn)證字體安裝:

fc-list :lang=zh

總結(jié)

Docx4j是一個(gè)優(yōu)秀的開源文檔處理工具,它為SpringBoot項(xiàng)目提供了一種輕量級(jí)、高性能的DOCX轉(zhuǎn)PDF解決方案。通過本文的介紹,我們了解了docx4j的核心優(yōu)勢(shì)、并使用springboot實(shí)戰(zhàn)落了一個(gè)簡單的案例。在實(shí)際項(xiàng)目中,我們可以根據(jù)業(yè)務(wù)需求和技術(shù)選型戰(zhàn)略,選擇最適合的文檔轉(zhuǎn)換方案。對(duì)于大多數(shù)企業(yè)級(jí)應(yīng)用來說,Docx4j無疑是一個(gè)性價(jià)比極高的選擇。

以上就是SpringBoot使用Docx4j實(shí)現(xiàn)DOCX轉(zhuǎn)PDF功能的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot DOCX轉(zhuǎn)PDF的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • idea實(shí)現(xiàn)讓打開的文件名tab多行顯示

    idea實(shí)現(xiàn)讓打開的文件名tab多行顯示

    本文介紹了IDEA中關(guān)于編輯標(biāo)簽頁的設(shè)置,特別是當(dāng)打開的文件太多時(shí),可以通過設(shè)置將編輯標(biāo)簽頁全部顯示在同一行,方便進(jìn)行點(diǎn)擊選中操作
    2026-03-03
  • Spring boot整合log4j2過程解析

    Spring boot整合log4j2過程解析

    這篇文章主要介紹了Spring boot整合log4j2過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Java 實(shí)現(xiàn)鏈表結(jié)點(diǎn)插入

    Java 實(shí)現(xiàn)鏈表結(jié)點(diǎn)插入

    這篇文章主要介紹了Java 實(shí)現(xiàn)鏈表結(jié)點(diǎn)插入操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • springboot實(shí)現(xiàn)極驗(yàn)校驗(yàn)的項(xiàng)目實(shí)踐

    springboot實(shí)現(xiàn)極驗(yàn)校驗(yàn)的項(xiàng)目實(shí)踐

    在系統(tǒng)業(yè)務(wù)中,需要想客戶發(fā)送手機(jī)驗(yàn)證碼,進(jìn)行驗(yàn)證后,才能提交,本文主要介紹了springboot實(shí)現(xiàn)極驗(yàn)校驗(yàn)的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • Guava中這些Map技巧可以讓代碼量減少了50%

    Guava中這些Map技巧可以讓代碼量減少了50%

    guava提供了非常強(qiáng)大的操作,可以讓我們把java代碼寫的很簡潔,下面這篇文章主要給大家介紹了關(guān)于Guava中這些Map使用技巧可以讓代碼量減少了50%的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Java實(shí)現(xiàn)多線程聊天室

    Java實(shí)現(xiàn)多線程聊天室

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)多線程聊天室,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Java8中List轉(zhuǎn)Map(Collectors.toMap) 的技巧分享

    Java8中List轉(zhuǎn)Map(Collectors.toMap) 的技巧分享

    在最近的工作開發(fā)之中,慢慢習(xí)慣了很多Java8中的Stream的用法,很方便而且也可以并行的去執(zhí)行這個(gè)流,這篇文章主要給大家介紹了關(guān)于Java8中List轉(zhuǎn)Map(Collectors.toMap) 的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • 使用java swing實(shí)現(xiàn)qq登錄界面示例分享

    使用java swing實(shí)現(xiàn)qq登錄界面示例分享

    這篇文章主要介紹了使用java swing實(shí)現(xiàn)qq登錄界面示例,需要的朋友可以參考下
    2014-04-04
  • MyBatis-Plus攔截器對(duì)敏感數(shù)據(jù)實(shí)現(xiàn)加密

    MyBatis-Plus攔截器對(duì)敏感數(shù)據(jù)實(shí)現(xiàn)加密

    做課程項(xiàng)目petstore時(shí)遇到需要加密屬性的問題,而MyBatis-Plus為開發(fā)者提供了攔截器的相關(guān)接口,本文主要介紹通過MyBatis-Plus的攔截器接口自定義一個(gè)攔截器類實(shí)現(xiàn)敏感數(shù)據(jù)如用戶密碼的加密功能,感興趣的可以了解一下
    2021-11-11
  • Java實(shí)現(xiàn)郵件發(fā)送QQ郵箱帶附件

    Java實(shí)現(xiàn)郵件發(fā)送QQ郵箱帶附件

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)郵件發(fā)送QQ郵箱帶附件功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03

最新評(píng)論

郧西县| 广昌县| 竹山县| 来宾市| 灵石县| 丰顺县| 蓬溪县| 富宁县| 阿巴嘎旗| 孙吴县| 横峰县| 三亚市| 德江县| 台北市| 贡嘎县| 甘孜县| 乌什县| 溆浦县| 阿拉善右旗| 唐河县| 彭水| 拜城县| 鹤壁市| 澳门| 铁岭县| 成安县| 西昌市| 五常市| 华容县| 福海县| 婺源县| 奉节县| 托克逊县| 顺昌县| 洛隆县| 汾阳市| 资溪县| 高邑县| 海伦市| 莱芜市| 贵港市|