SpringBoot使用Docx4j实现DOCX转PDF功能

 更新时间:2026年02月05日 09:02:15   作者:小沈同学呀  
在当今的企业级应用中,文档格式转换是一个高频但又容易被低估的需求,从合同签署、报表生成到知识库管理,DOCX转PDF的需求无处不在,今天我们就介绍一款使用纯Java实现 DOCX 转 PDF的方案,超级简单,简直不要太爽,需要的朋友可以参考下

前言

在当今的企业级应用中,文档格式转换是一个高频但又容易被低估的需求。从合同签署、报表生成到知识库管理,DOCX转PDF的需求无处不在。市面上的解决方案五花八门,但真正能平衡"成本、质量、可维护性"的方案却寥寥无几。今天我们就介绍一款使用纯Java实现 DOCX 转 PDF的方案,超级简单,简直不要太爽。

Docx4j的核心优势

Docx4j之所以成为企业级应用的首选方案,主要得益于其以下核心优势:
1.纯Java实现:无需安装任何外部软件,部署简单
2.开源免费:采用Apache 2.0 License,可商用
3.样式保真度高:能完美保留Word文档中的图片、表格、页眉页脚等复杂格式
4.易于集成:可以无缝集成到SpringBoot项目中

实战演示

项目依赖配置

在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>

核心工具类

创建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. 创建输出流并执行转换
            try (FileOutputStream os = new FileOutputStream(pdfPath)) {
                Docx4J.toPDF(wordMLPackage, os);
            }
            log.info("PDF 生成成功:{}" ,pdfPath);
        } catch (Exception e) {
            log.error("转换失败:{}",e.getMessage(),e);
        }
    }
}

测试用例

创建类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环境中,中文乱码主要是由于字体映射问题导致的。我们需要在工具类中添加中文字体映射表,确保docx4j能够正确识别和转换中文字体。

Linux

在Linux环境中,中文乱码问题更为复杂,需要安装Windows字体。具体步骤如下:

1.新建字体文件夹:

sudo mkdir -p /usr/share/fonts/win_font

2.拷贝Windows字体文件:将Windows系统中路径为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是一个优秀的开源文档处理工具,它为SpringBoot项目提供了一种轻量级、高性能的DOCX转PDF解决方案。通过本文的介绍,我们了解了docx4j的核心优势、并使用springboot实战落了一个简单的案例。在实际项目中,我们可以根据业务需求和技术选型战略,选择最适合的文档转换方案。对于大多数企业级应用来说,Docx4j无疑是一个性价比极高的选择。

以上就是SpringBoot使用Docx4j实现DOCX转PDF功能的详细内容,更多关于SpringBoot DOCX转PDF的资料请关注脚本之家其它相关文章!

相关文章

  • Springmvc和ajax如何实现前后端交互

    Springmvc和ajax如何实现前后端交互

    这篇文章主要介绍了Springmvc和ajax如何实现前后端交互,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • 解决创建springboot后启动报错:Failed to bind properties under‘spring.datasource‘

    解决创建springboot后启动报错:Failed to bind properties under‘spri

    在Spring Boot项目中,application.properties和application.yml是用于配置参数的两种文件格式,properties格式简洁但不支持层次结构,而yml格式支持层次性,可读性更好,在yml文件中,要注意细节,比如冒号后面需要空格
    2024-10-10
  • SpringBoot整合Kafka工具类的详细代码

    SpringBoot整合Kafka工具类的详细代码

    Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据,这篇文章主要介绍了SpringBoot整合Kafka工具类的代码详解,需要的朋友可以参考下
    2022-09-09
  • SpringBoot日志级别与日志分组详解

    SpringBoot日志级别与日志分组详解

    文章介绍了日志级别(ALL至OFF)及其作用,说明SpringBoot默认日志级别为INFO,可通过application.properties调整全局或特定类的日志级别,并展示了日志调试技巧和分组配置方法,感兴趣的朋友跟随小编一起看看吧
    2025-08-08
  • SWT JFace 拖曳效果

    SWT JFace 拖曳效果

    SWT(JFace)体验之拖曳效果
    2009-06-06
  • 归并排序的原理及java代码实现

    归并排序的原理及java代码实现

    归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。递归形式的算法在形式上较简洁,但实用性很差。一般情况下,很少利用二路归并排序法进行内部排序。
    2016-02-02
  • java中SPI服务提供者的接口使用总结

    java中SPI服务提供者的接口使用总结

    SPI英文全称为Service Provider Interface,顾名思义,服务提供者接口,它是jdk提供给“服务提供厂商”或者“插件开发者”使用的接口
    2022-02-02
  • java实现2048小游戏

    java实现2048小游戏

    这篇文章主要为大家详细介绍了java实现2048小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-02-02
  • idea中mapper如何快速跳转到xml插件

    idea中mapper如何快速跳转到xml插件

    这篇文章主要介绍了idea中mapper如何快速跳转到xml插件问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • SpringBoot利用自定义注解实现多数据源

    SpringBoot利用自定义注解实现多数据源

    这篇文章主要为大家详细介绍了SpringBoot如何利用自定义注解实现多数据源效果,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以了解一下
    2022-10-10

最新评论