java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot DOCX转PDF

SpringBoot使用Docx4j实现DOCX转PDF功能

作者:小沈同学呀

在当今的企业级应用中,文档格式转换是一个高频但又容易被低估的需求,从合同签署、报表生成到知识库管理,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的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文