[java] 使用免费 Docx4j word转pdf 方法

本文介绍了如何使用Docx4j库将Word文档转换为PDF格式,包括导入依赖、创建转换工具类并处理中文字体映射,最后展示了转换前后效果以及提及Linux系统中的潜在问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言: 最近做了一个生成pdf 的项目, 先用了word模板生成样式,需要转化成pdf,最终决定用免费的Docx4j

1.导入依赖

        <dependency>
            <groupId>org.docx4j</groupId>
            <artifactId>docx4j-JAXB-MOXy</artifactId>
            <version>8.2.9</version>
        </dependency>
        <!-- Helps to export as PDF -->
        <dependency>
            <groupId>org.docx4j</groupId>
            <artifactId>docx4j-export-fo</artifactId>
            <version>8.2.9</version>
        </dependency>

2.转换工具类

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;

public class WordToPdfTest_Docx4j {

    public static void wordToPdf(String docFile,String pdfFile) throws Exception {

        WordprocessingMLPackage pkg = Docx4J.load(new File(docFile));
        Mapper fontMapper = new IdentityPlusMapper();
        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"));
        pkg.setFontMapper(fontMapper);


        FileOutputStream fileOutputStream = new FileOutputStream(pdfFile);
        Docx4J.toPDF(pkg, fileOutputStream);
        fileOutputStream.flush();
        fileOutputStream.close();
    }

}



3.word 原图与转换后的pdf效果图

word:
在这里插入图片描述
pdf:
在这里插入图片描述

在linux 系统还没有测试中文字体会不会乱码

05-14
### docx4j 使用指南 #### 什么是 docx4j? `docx4j` 是一个用于创建和操作基于 Microsoft Open XML 文件格式(如 Word `.docx`、PowerPoint `.pptx` 和 Excel `.xlsx`)的 Java 库[^1]。它类似于微软的 OpenXML SDK,但专为 Java 开发者设计。 #### 如何导入 docx4j 到项目中? 如果使用 Maven 构建工具,在 `pom.xml` 中可以添加以下依赖项以引入 `docx4j` 及其相关组件: ```xml <dependency> <groupId>org.docx4j</groupId> <artifactId>docx4j</artifactId> <version>8.3.3</version> </dependency> ``` 此外,如果有其他需求(例如数据库集成),还可以加入相应的 JDBC 驱动支持[^3]。 #### 基础功能演示——Hello World 示例 下面是一个简单的例子展示如何利用 `docx4j` 创建一个新的 Word 文档并写入一段文字: ```java import org.docx4j.jaxb.Context; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import org.docx4j.wml.ObjectFactory; import org.docx4j.wml.P; import org.docx4j.wml.R; import org.docx4j.wml.Text; public class Docx4jExample { public static void main(String[] args) throws Exception { // 初始化新的 WordProcessingMLPackage 实例 WordprocessingMLPackage wordPackage = WordprocessingMLPackage.createPackage(); // 定义 ObjectFactory 来构建 WML 元素 ObjectFactory factory = Context.getWmlObjectFactory(); // 添加段落 P P paragraph = factory.createP(); // 在段落后追加运行 R 并设置文本内容 Text R run = factory.createR(); Text text = factory.createText(); text.setValue("Hello, this is my first document with docx4j!"); run.getContent().add(text); paragraph.getContent().add(run); // 将新段落插入至主体部分 wordPackage.getMainDocumentPart().getContent().add(paragraph); // 输出到文件 system.out.println(wordPackage.toString()); wordPackage.save(new java.io.File("output.docx")); } } ``` 此代码片段展示了通过 `docx4j` API 编程方式生成包含单一文本字符串的新文档过程[^4]。 #### WordPDF 流程概述 除了基本的文字处理外,`docx4j` 还提供了将 Word 文档换成 PDF 的能力。通常涉及以下几个阶段的操作流程描述如下[^2]: 1. **加载源 DOCX 文件**: 使用 `WordprocessingMLPackage.load()` 方法载入目标 .docx 文件作为输入数据流。 2. **配置渲染器参数**: 设置字体映射表及其他样式选项以便于最终输出效果更贴近原始布局表现形式。 3. **执行实际化动作**: 调用内置服务类完成具体变换逻辑实现。 4. **保存结果产物**: 把经过加工后的二进制字节流传回客户端或者存储介质当中去。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值