Spring Boot 实现 DOCX 转 PDF(基于 docx4j 的轻量级开源方案)

Spring Boot 实现 DOCX 转 PDF(基于 docx4j 的轻量级开源方案)

目录

在日常项目开发中,我们经常遇到这样的需求:
用户上传 Word( .docx)文件,希望后台自动生成 PDF,用于下载、归档或在线预览。

网上方案很多——有收费的 Aspose、有重量级的 LibreOffice,也有轻量的 docx4j
本文将介绍一个完全开源、部署简单、纯 Java 的实现方案:

使用 docx4j 在 Spring Boot 中实现 .docx → .pdf 转换。

一、方案选型对比

方案是否开源外部依赖样式保真度部署复杂度备注
Apache POI + iText对复杂格式支持差
docx4j⭐⭐推荐,纯 Java
LibreOffice + JODConverter需安装 LibreOffice很高⭐⭐⭐部署复杂
Aspose.Words最高收费,商业许可

💡 选择理由

  • docx4j 是纯 Java 实现,无需安装 Office 或 LibreOffice;
  • 开源(Apache 2.0 License),免费可商用;
  • 转换质量好,能保留图片、表格、页眉页脚;
  • 容易集成进 Spring Boot。

二、添加 Maven 依赖

pom.xml 中加入以下依赖:

<dependencies><dependency><groupId>org.docx4j</groupId><artifactId>docx4j-core</artifactId><version>11.4.8</version></dependency><dependency><groupId>org.docx4j</groupId><artifactId>docx4j-JAXB-ReferenceImpl</artifactId><version>11.4.8</version></dependency><dependency><groupId>org.docx4j</groupId><artifactId>docx4j-export-fo</artifactId><version>11.4.8</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>2.0.9</version></dependency></dependencies>

三、核心工具类:DocxToPdfUtil

utils 包下创建 DocxToPdfUtil.java

package com.donglin.utils; import org.docx4j.Docx4J; import org.docx4j.fonts.IdentityPlusMapper; import org.docx4j.fonts.Mapper; import org.docx4j.fonts.PhysicalFont; import org.docx4j.fonts.PhysicalFonts; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import java.io.File; import java.io.FileOutputStream;publicclassDocxToPdfUtil{/** * 将 docx 文件转换为 PDF * * @param docxPath 输入文件路径 * @param pdfPath 输出文件路径 */publicstaticvoidconvert(String docxPath,String pdfPath){try{// 1. 加载 Word 文档WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(newFile(docxPath));// 2. 配置字体映射(防止中文乱码)Mapper fontMapper =newIdentityPlusMapper(); 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 =newFileOutputStream(pdfPath)){ Docx4J.toPDF(wordMLPackage, os);} System.out.println("✅ PDF 生成成功:"+ pdfPath);}catch(Exception e){ System.err.println("❌ 转换失败:"+ e.getMessage());}}}

四、Controller 示例

controller 包中创建一个上传接口:

importorg.springframework.web.bind.annotation.*;importorg.springframework.web.multipart.MultipartFile;importjava.io.File;@RestController@RequestMapping("/convert")publicclassFileController{@GetMapping("/convertToPdf")publicvoidconvertToPdf(@RequestParamString filePath,HttpServletResponse response)throwsException{// 1、 检查文件是否存在File inputFile =newFile(filePath);if(!inputFile.exists()){thrownewRuntimeException("文件不存在: "+ filePath);}// 2、 定义输出路径(临时文件)String pdfPath = filePath.replace(".docx",".pdf");// 3、 调用转换工具DocxToPdfUtil.convert(filePath, pdfPath);// 4、 设置响应头并输出 PDF 文件 response.setContentType("application/pdf"); response.setHeader("Content-Disposition","attachment; filename="+newFile(pdfPath).getName());try(FileInputStream fis =newFileInputStream(pdfPath);OutputStream os = response.getOutputStream()){ fis.transferTo(os); os.flush();}// 可选:删除临时 PDF 文件newFile(pdfPath).delete();}}

使用 Postman 发送请求:

GET http://localhost:8080/convertToPdf?filePath=filePath=E:/ai/report.docx 

选择一个 .docx 文件上传,即可生成同名 .pdf 文件。


五、Windows解决中文乱码问题

在这里插入图片描述


增加字体的类别

 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);

六、Linux解决中文乱码问题

在 Linux 环境中安装 Windows 字体

新建字体文件夹

sudomkdir -p /usr/share/fonts/win_font 

拷贝 Windows 字体文件

Windows 10 系统中路径为 C:\Windows\Fonts 的字体文件
拷贝到 Linux 的 /usr/share/fonts/win_font 目录中。

加载字体文件

进入字体目录并执行以下命令:

cd /usr/share/fonts/win_font sudo mkfontscale # 生成字体缩放文件sudo mkfontdir # 生成字体目录索引sudo fc-cache -fv # 刷新字体缓存

查看字体安装情况

执行以下命令查看中文字体是否成功加载:

fc-list :lang=zh 
在这里插入图片描述

七、总结

  • 使用开源库 docx4j
  • 无需安装 Office 或 LibreOffice;
  • 保留常见样式、图片、表格;
  • 性能高、部署轻量。

Read more

昇腾 (Ascend) NPU 实战指南:在 GitCode Notebook 中玩转 CodeLlama

昇腾 (Ascend) NPU 实战指南:在 GitCode Notebook 中玩转 CodeLlama

1.前言 随着大模型技术在软件开发领域的深入应用,越来越多的开发者开始尝试在本地或云端环境部署代码生成模型。华为昇腾(Ascend)计算产业随着 CANN 软件栈的不断成熟,已成为运行各类开源 LLM 的重要算力底座。 本文将以 CodeLlama 这一广受欢迎的代码生成模型为核心,结合 GitCode Notebook 提供的在线开发环境,讲解如何在本地或服务器的昇腾 NPU 环境中完成从依赖配置、模型加载到代码生成的完整流程。文章将通过结构化的流程讲解与可操作的示例代码,引导你在昇腾生态中顺利完成 CodeLlama 的部署与运行。 接下来我们就开始进行动手实践吧。 GitCode官网:https://gitcode.com/。 2.GitCode Notebook 环境准备 GitCode 是面向中国开发者的一站式代码协作与模型应用平台,集成了开源仓库托管、在线运行环境、模型中心等能力。其中的 GitCode Notebook 提供了无需本地配置的云端交互式开发环境,支持直接在浏览器中编写、运行和调试代码,非常适合进行大模型试验与算子验证。 进入Gitcode官网

在github codespaces部署开源个人智能体OpenClaw(Clawdbot/Moltbot)使用教程

openClaw官方仓库:https://github.com/openclaw/openclaw OpenClaw 是什么? OpenClaw(原名 Clawdbot,后更名为 Moltbot,现正式命名为 OpenClaw)是一个运行在你本地环境的高权限 AI 智能体。它的核心特性包括: * 本地部署:运行在你的服务器或电脑上,数据完全自主可控 * 多平台支持:支持飞书、WhatsApp、Telegram、Discord、Slack 等主流聊天工具 * 浏览器控制:可以浏览网页、填写表单、提取数据 * 系统访问:读写文件、执行 Shell 命令、运行脚本 * 持久化记忆:记住你的偏好和上下文,成为真正属于你的 AI * 插件扩展:支持社区技能插件,甚至可以自己编写插件 无论是邮件管理、日程安排、数据查询还是代码编写,OpenClaw

免费开源AI工具:CoPaw与OpenFang整理

免费开源AI工具:CoPaw与OpenFang整理

CoPaw 和 OpenFang,两者软件本体都免费开源,但模型 API 可能产生费用。 CoPaw(阿里云) * 软件本身:完全免费开源(Apache 2.0),无会员、无广告、无功能限制 * 本地部署:免费,仅需 Python 环境,可跑本地模型(Ollama 等),零 API 费用 * 云端部署:魔搭创空间有免费测试额度;长期使用按云资源(CPU/GPU/ 存储)计费 * 模型 API:调用通义千问、OpenAI、DeepSeek 等按官方标准按量付费  CoPaw GitHub 地址 https://github.com/agentscope-ai/CoPaw OpenFang(

阿里云全品类 8 折券限时领,建站 / AI / 存储通用 立即领取