Java 一键将 Word 文档转为 PDF

news/2025/2/10 20:14:36/

嘿,朋友们!在开发中,经常会碰到需要把 Word 文档转换成 PDF 格式的需求,像生成报告、合同啥的。Java 有不少好用的库能实现这个功能,下面就给大家介绍两种常见的方法,分别使用 Apache POI 和 Docx4J 结合 iText 库来实现 Word 转 PDF。

方法一:使用 Apache POI 和 iText

1. 引入依赖

如果你用 Maven 管理项目,在 pom.xml 里添加以下依赖:

 
<dependencies><!-- Apache POI 处理 Word 文档 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version></dependency><!-- iText 生成 PDF 文档 --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.3</version></dependency>
</dependencies>

2. 代码示例

 
java">import com.itextpdf.text.*;
import com.itextpdf.text.pdf.PdfWriter;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;import java.io.*;public class WordToPdfWithPOI {public static void main(String[] args) {try {// 读取 Word 文档FileInputStream fis = new FileInputStream("input.docx");XWPFDocument document = new XWPFDocument(fis);// 创建 PDF 文档Document pdfDoc = new Document();PdfWriter.getInstance(pdfDoc, new FileOutputStream("output.pdf"));pdfDoc.open();// 遍历 Word 文档的段落for (XWPFParagraph paragraph : document.getParagraphs()) {StringBuilder text = new StringBuilder();// 遍历段落中的文本运行对象for (XWPFRun run : paragraph.getRuns()) {text.append(run.getText(0));}// 将段落文本添加到 PDF 文档中Paragraph pdfParagraph = new Paragraph(text.toString());pdfDoc.add(pdfParagraph);}// 关闭文档和流pdfDoc.close();document.close();fis.close();System.out.println("Word 转 PDF 成功!");} catch (Exception e) {e.printStackTrace();System.out.println("Word 转 PDF 失败:" + e.getMessage());}}
}

3. 代码解释

  • 读取 Word 文档:用 FileInputStream 读取 input.docx 文件,再用 XWPFDocument 类把它加载到内存。

  • 创建 PDF 文档:创建 Document 对象表示 PDF 文档,用 PdfWriter 关联输出流,然后打开文档准备写入内容。

  • 遍历 Word 文档段落:遍历 Word 文档的每个段落,把段落里的文本提取出来,添加到 StringBuilder 里,再创建 Paragraph 对象添加到 PDF 文档中。

  • 关闭文档和流:操作完成后,关闭 PDF 文档、Word 文档和输入流。

方法二:使用 Docx4J

1. 引入依赖

pom.xml 里添加以下依赖:

 
<dependencies><dependency><groupId>org.docx4j</groupId><artifactId>docx4j-JAXB-Internal</artifactId><version>11.4.9</version></dependency><dependency><groupId>org.docx4j</groupId><artifactId>docx4j-JAXB-ReferenceImpl</artifactId><version>11.4.9</version></dependency><dependency><groupId>org.docx4j</groupId><artifactId>docx4j</artifactId><version>11.4.9</version></dependency><dependency><groupId>org.docx4j</groupId><artifactId>docx4j-export-fo</artifactId><version>11.4.9</version></dependency>
</dependencies>

2. 代码示例

 
java">import org.docx4j.Docx4J;
import org.docx4j.convert.out.FOSettings;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;public class WordToPdfWithDocx4J {public static void main(String[] args) {try {// 加载 Word 文档WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new File("input.docx"));// 创建 FOSettings 对象FOSettings foSettings = Docx4J.createFOSettings();foSettings.setWmlPackage(wordMLPackage);// 创建输出流OutputStream os = new FileOutputStream(new File("output.pdf"));// 转换并保存为 PDFDocx4J.toPDF(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL);// 关闭输出流os.close();System.out.println("Word 转 PDF 成功!");} catch (Exception e) {e.printStackTrace();System.out.println("Word 转 PDF 失败:" + e.getMessage());}}
}

3. 代码解释

  • 加载 Word 文档:用 WordprocessingMLPackage.load 方法加载 input.docx 文件。

  • 创建 FOSettings 对象FOSettings 用于配置转换设置,把加载的 Word 文档设置进去。

  • 创建输出流:创建 FileOutputStream 用于输出 PDF 文件。

  • 转换并保存为 PDF:调用 Docx4J.toPDF 方法进行转换,并将结果保存到输出流。

  • 关闭输出流:操作完成后,关闭输出流。

嘿,朋友们!这两种方法都能帮你用 Java 把 Word 文档转换成 PDF。你可以根据自己的需求和喜好选择合适的方法。赶紧动手试试,让你的程序轻松搞定文档转换!


http://www.ppmy.cn/news/1570949.html

相关文章

在Mac mini M4上部署DeepSeek R1本地大模型

在Mac mini M4上部署DeepSeek R1本地大模型 安装ollama 本地部署&#xff0c;我们可以通过Ollama来进行安装 Ollama 官方版&#xff1a;【点击前往】 Web UI 控制端【点击安装】 如何在MacOS上更换Ollama的模型位置 默认安装时&#xff0c;OLLAMA_MODELS 位置在"~/.o…

Python----Python高级(网络编程:网络基础:发展历程,IP地址,MAC地址,域名,端口,子网掩码,网关,URL,DHCP,交换机)

一、网络 早期的计算机程序都是在本机上运行的&#xff0c;数据存储和处理都在同一台机器上完成。随着技术的发展&#xff0c;人 们开始有了让计算机之间相互通信的需求。例如安装在个人计算机上的计算器或记事本应用&#xff0c;其运行环 境仅限于个人计算机内部。这种设置虽然…

探索robots.txt:网站管理者的搜索引擎指南

在数字时代&#xff0c;网站如同企业的在线名片&#xff0c;其内容和结构对搜索引擎的可见性至关重要。而在这背后&#xff0c;有一个默默工作的文件——robots.txt&#xff0c;它扮演着搜索引擎与网站之间沟通桥梁的角色。本文将深入探讨robots.txt的功能、编写方法及其在现代…

AI时代医疗大健康微服务编程提升路径和具体架构设计

一、引言 1.1 研究背景与意义 随着科技的飞速发展,人工智能(Artificial Intelligence,AI)已逐渐渗透至各个领域,医疗大健康领域亦不例外。人工智能与医疗大健康的融合,正引领着医疗行业迈向智能化、精准化、个性化的新时代,为解决医疗资源分布不均、提升医疗服务效率和…

Qt监控设备离线检测/实时监测设备上下线/显示不同的状态图标/海康大华宇视华为监控系统

一、前言说明 监控系统中一般有很多设备&#xff0c;有些用户希望知道每个设备是否已经上线&#xff0c;最好有不同的状态图标提示&#xff0c;海康的做法是对设备节点的图标和颜色变暗处理&#xff0c;离线的话就变暗&#xff0c;有可能是加了透明度&#xff0c;而大华的处理…

【C++学习篇】C++11第二期学习

目录 1. 可变参数模板 1.1 基本语法及原理 1.2 包扩展 1.3empalce系列接⼝ 2. lamba 2.1 lambda的语法表达式 2.2 捕捉列表 2.3 lamba的原理 1. 可变参数模板 1.1 基本语法及原理 1. C11⽀持可变参数模板&#xff0c;也就是说⽀持可变数量参数的函数模板和类模板&…

【电商数据分析项目经验分享】数据采集——数据清洗——数据分析与可视化——数据决策”

前言 由于国内电商行业的竞争环境更加激烈&#xff0c;数据化运营、精细化运营早已代替经验化运营已成为主流的电商运营方式&#xff0c;不断变化的风向和难以捉摸的热点使得电商运营对电商数据变化更加敏感。攻破数据壁垒&#xff0c;就是抓住了商机&#xff01;那么电商怎么…

pytest-xdist 进行多进程并发测试!

在软件开发过程中&#xff0c;测试是确保代码质量和可靠性的关键步骤。随着项目规模的扩大和复杂性的增加&#xff0c;测试用例的执行效率变得尤为重要。为了加速测试过程&#xff0c;特别是对于一些可以并行执行的测试用 例&#xff0c;pytest-xdist 提供了一种强大的工具&…