使用docx4j将Word文档转换为PDF

使用 docx4j 实现 DOCX 转 PDF,核心是通过 XSL-FO + Apache FOP 进行格式转换。以下是完整、可直接运行的方案(Maven + Java)。

一、核心依赖(Maven)

需引入 docx4j-core 和 PDF 导出模块 docx4j-export-fo

xml 复制代码
<dependencies>
    <!-- docx4j 核心库 -->
    <dependency>
        <groupId>org.docx4j</groupId>
        <artifactId>docx4j-core</artifactId>
        <version>11.5.4</version>
    </dependency>
    <!-- FO 导出(转PDF必需) -->
    <dependency>
        <groupId>org.docx4j</groupId>
        <artifactId>docx4j-export-fo</artifactId>
        <version>11.5.4</version>
    </dependency>
    <!-- JAXB 实现(JDK 9+ 必须显式引入) -->
    <dependency>
        <groupId>org.docx4j</groupId>
        <artifactId>docx4j-JAXB-ReferenceImpl</artifactId>
        <version>11.5.4</version>
    </dependency>
</dependencies>

二、最简转换代码(含中文支持)

java 复制代码
import org.docx4j.Docx4J;
import org.docx4j.fonts.IdentityPlusMapper;
import org.docx4j.fonts.Mapper;
import org.docx4j.fonts.PhysicalFonts;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class DocxToPdfConverter {

    public static void convert(String docxPath, String pdfPath) throws Exception {
        // 1. 加载 DOCX 文件
        WordprocessingMLPackage pkg = WordprocessingMLPackage.load(new File(docxPath));

        // 2. 配置字体映射(解决中文乱码/方框问题)
        Mapper fontMapper = new IdentityPlusMapper();
        // 自动扫描系统字体
        PhysicalFonts.discoverPhysicalFonts();
        
        // 常用中文字体映射(Windows/Linux通用)
        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("LiSu"));

        pkg.setFontMapper(fontMapper);

        // 3. 转换并输出 PDF
        try (OutputStream os = new FileOutputStream(pdfPath)) {
            // FLAG_EXPORT_PREFER_XSL:兼容性最好
            Docx4J.toPDF(pkg, os);
        }
    }

    // 测试
    public static void main(String[] args) throws Exception {
        convert("input.docx", "output.pdf");
        System.out.println("转换完成");
    }
}

三、测试结果

  1. 原始文档
  1. 转换效果

四、结论

  1. 格式兼容性问题比较多,简单文档可以使用,兼容性要求高的情况下,建议放弃
  2. 由于不能预知要转换的文档中使用了哪些中文字体,可能出现###,这个问题比较严重
相关推荐
evans在进步14 分钟前
Tomcat NIO 工作原理详解:从 Acceptor、Poller 到容器处理链
java·tomcat·nio
渡我白衣2 小时前
并查集:基础认识与模拟实现
android·java·javascript·数据结构·c++·算法·并查集
电商API_180079052472 小时前
电商商品价格监控工具淘宝京东商品价格抓取API项目实操分享
java·大数据·开发语言·前端·数据挖掘
zzzll11112 小时前
深度剖析:HashMap 并发死循环与 ConcurrentHashMap 两代演进全解
java·开发语言
秋名RG2 小时前
2026/5/27 生产事故复盘与整改方案
java
血小板要健康2 小时前
链表 阶段算法总结
java·数据结构·笔记·算法·leetcode·链表
坐吃山猪2 小时前
【多线程】CompletableFuture使用
java·开发语言·多线程
m0_587383003 小时前
点餐预约核销系统的架构脉络
java·架构·系统架构·需求分析
代码方舟3 小时前
O2O二手车交易平台B端车商管理后台:基于天远车信盟出险构建自动化车况评估网关
java·运维·人工智能·自动化
爱学堂IT分享3 小时前
图灵Java互联网架构师六期
java·开发语言