嘿,朋友们!在开发中,经常会碰到需要把 Word 文档转换成 PDF 格式的需求,像生成报告、合同啥的。Java 有不少好用的库能实现这个功能,下面就给大家介绍两种常见的方法,分别使用 Apache POI 和 Docx4J 结合 iText 库来实现 Word 转 PDF。
方法一:使用 Apache POI 和 iText
1. 引入依赖
如果你用 Maven 管理项目,在 pom.xml
里添加以下依赖:
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
里添加以下依赖:
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"));
// 转换并保存为 PDF
Docx4J.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。你可以根据自己的需求和喜好选择合适的方法。赶紧动手试试,让你的程序轻松搞定文档转换!