Java实现Word转PDF文件

高效、稳定、不失真的文档转换解决方案

引言

在企业级Java应用开发中,经常需要将Word文档(.doc/.docx)转换为PDF格式,以确保文档的格式一致性、安全性和可打印性。本文将详细介绍几种主流的Java实现方案,分析其优缺点,并提供可运行的代码示例。

提示: 本文重点解决不失真问题,即转换后PDF能完美保留原Word文档的样式、图片、表格和字体。

方案一:使用Apache POI + iText(仅限.docx)

适用于现代Word文档(.docx),基于XML解析,无需外部依赖。

Maven依赖

<dependencies>
  <dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.4</version>
  </dependency>
  <dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext7-core</artifactId>
    <version>7.1.16</version>
    <type>pom</type>
  </dependency>
</dependencies>

Java代码示例

import org.apache.poi.xwpf.usermodel.*;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;

public class WordToPdfConverter {
    public static void convert(String docxPath, String pdfPath) throws Exception {
        XWPFDocument document = new XWPFDocument(new FileInputStream(docxPath));
        PdfWriter writer = new PdfWriter(pdfPath);
        PdfDocument pdfDoc = new PdfDocument(writer);
        Document pdf = new Document(pdfDoc);

        for (IBodyElement element : document.getBodyElements()) {
            if (element instanceof XWPFParagraph) {
                XWPFParagraph para = (XWPFParagraph) element;
                pdf.add(new Paragraph(para.getText()));
            }
        }

        pdf.close();
        document.close();
    }
}

优点: 纯Java,跨平台,轻量级。

缺点: 样式保留不完整,复杂文档易失真。

方案二:使用Jacob(推荐用于Windows环境)

Jacob(Java COM Bridge)调用Windows系统自带的Microsoft Word进行转换,转换质量最高。

实现步骤

Java代码示例

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;

public class JacobConverter {
    public static final int wdFormatPDF = 17;

    public static void convert(String docPath, String pdfPath) {
        ActiveXComponent word = new ActiveXComponent("Word.Application");
        try {
            word.setProperty("Visible", false);
            Dispatch documents = word.getProperty("Documents").toDispatch();
            Dispatch doc = Dispatch.call(documents, "Open", docPath).toDispatch();
            Dispatch.call(doc, "SaveAs", pdfPath, wdFormatPDF);
            Dispatch.call(doc, "Close");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            word.invoke("Quit");
        }
    }
}

优点: 转换质量极高,100%保留原始样式,支持.doc和.docx。

缺点: 仅限Windows,需安装Microsoft Office,线程安全需注意。

方案三:使用LibreOffice + JODConverter

跨平台解决方案,利用LibreOffice的文档转换能力。

实现步骤

Maven依赖

<dependency>
  <groupId>org.jodconverter</groupId>
  <artifactId>jodconverter-core</artifactId>
  <version>4.4.3</version>
</dependency>

Java代码示例

import org.jodconverter.DocumentConverter;
import org.jodconverter.local.LocalConverter;

public class LibreOfficeConverter {
    public static void convert(String inputPath, String outputPath) {
        DocumentConverter converter = LocalConverter.builder()
            .build();
        converter.convert(new File(inputPath))
            .to(new File(outputPath))
            .execute();
    }
}

优点: 跨平台(Windows/Linux/Mac),高质量转换,免费。

缺点: 需要安装LibreOffice,占用资源较多。

方案对比与选择建议

方案 平台 质量 性能 适用场景
Apache POI + iText 跨平台 简单文档,轻量级需求
Jacob Windows 企业内部系统,要求完美还原
LibreOffice 跨平台 Linux服务器部署,高质量需求
推荐: 若部署在Windows且有Office,首选Jacob;若在Linux服务器,首选LibreOffice + JODConverter
DOC文件太大了怎么缩小?5种简单有效的方法 OFD怎么转换PDF文件格式?最全转换方法指南 三国志·孙礼传注释详解 - 孙礼生平与历史评价 Word波浪线怎么加?详细教程与使用技巧 张超三国 - 东汉末年名士与忠烈之臣生平事迹专题 三国志战略版荀彧 - 谋主之才,王佐之略 | 专题介绍 Word Power 翻译成中文 - 含义解析与使用指南 WPS如何将PPT转化为Word文档 - 详细图文教程 三国志11全部剧本一览 - 经典策略游戏回顾 Word下一页怎么新建?多种方法详解 - 实用办公技巧 Word文档波浪线怎么取消 - 完整解决方法指南 三国志11计谋暴击完全指南 - 掌握策略精髓 Word文档显示比例设置指南 - 调整缩放级别获得最佳阅读体验 三国志一共多少字?全文统计与解析 - 三国志专题 手机怎么打开OFD文件?详细操作方法指南 Word给文字添加阴影的详细方法 - 图文教程 三国鞠演 - 东汉末年蜀汉名臣生平与历史贡献 三国志7圣兽全解析 - 获取方法与能力详解 三国志·曹传原文 - 陈寿《三国志》曹操传记全文 WPS如何把PDF文件变小?详细操作步骤教程 Win10怎么安装DLL文件?详细图文教程 - 解决DLL缺失问题 DOCX文件打不开怎么办?多种解决方案详解 tudesk云电脑 - 高性能云端计算服务 PDF文件太大怎么压缩?5种简单有效的方法分享 三国志7郑玄四维属性详解 - 能力值与武将分析专题 两个Word文件怎么对比不同?5种实用方法详解 Word文档里查找和替换在哪里?位置及使用方法详解 三国志真实吗?历史与游戏的真相解析 Word文档跳页怎么解决?常见原因与详细解决方法 spacedesk无法断开连接?全面解决方案在此 - 问题排查与修复指南 Markdown软件推荐与使用指南 - 高效写作工具精选 图片嵌入Word文档:完整操作指南与技巧 手机如何查看VSD文件?安卓与iPhone实用方法指南 Word怎么画箭头 - 最详细的指南 Word文档怎么抠公章?手把手教你轻松提取公章图片 三国志最新 - 全面了解最新版本、更新内容与玩法攻略 Word文档如何添加行号 - 详细图文教程 Word文档拒绝修订后还能找回吗?完整恢复指南 SRT文件怎么转Word?简单几步完成字幕转文档 三国志王允属性专题 - 生平与能力解析 Word替换文字技巧大全 - 高效编辑文档的必备方法 三国志11官网入口 - 经典策略战棋游戏官方专题页 三国志14花木兰 - 武将介绍与使用攻略 | 三国志专题 Word吞掉后面的字?原因与解决方法全解析 解决Word文档文字背景有阴影的完整指南 - 去除阴影技巧 三国君王 - 探索三国时期杰出统治者的历史传奇 Word如何退出兼容模式?详细解决方法指南 三国志九事件详解 - 经典策略游戏历史事件专题 三国志9阵型选择指南 - 最佳战术阵型详解 Word找回历史文件 - 完整指南与实用技巧 三国臧霸 - 东汉末年泰山豪杰武将专题 spacedesk卸载不了?多种方法教你彻底解决卸载难题 Word文档页面突然变大了?快速解决方法大全 SolidWorks文件转CAD:完整操作指南与技巧 CAD如何打开DWF文件?详细步骤图文教程 Word如何把模糊图片转为高清?实用方法与技巧指南 三国志7宝物大全 - 宝物图鉴、获取方式与使用攻略 Word文字上下间隔很大怎么调整?一文解决行距问题 spacedesk如何使用USB连接进行屏幕扩展 - 完整教程指南 Word文档加字后面的字就没了?一招教你轻松解决 手机DWG文件查看器推荐 - 手机轻松查看CAD图纸 三国志11司马专题 - 司马懿、司马师、司马昭武将详解与攻略 CAJ文件转换成Word | 手机在线转换CAJ文档为Word教程 三国志孙坚传 - 江东猛虎的传奇一生 三国志司马昭传 - 经典策略战棋专题 Word实心圆点项目符号设置方法 - 完整教程与技巧 三国传奇武师童渊:北地枪王与他的弟子们 三国志老版下载 - 经典策略游戏怀旧专区 三国志·蜀书·邓芝传 原文及白话文翻译 - 三国历史人物传记 Word如何显示修改痕迹和批注 - 完整操作指南 三国韩馥 - 东汉末年冀州牧历史人物专题 Word文档怎么换底色?详细操作步骤图文教程 Word文档怎么自动编号 - 详细图文教程 怎么在Word文档中换行?多种方法详解 Word文档尺寸大小设置完全指南 - A4/Letter等纸张规格详解 Word文档替换在哪里?一文看懂查找与替换功能使用方法 SW映射文件下载 - 免费安全的映射配置资源站 Word文档内容对比工具 - 在线免费比较文本差异 Word不满一行换行了如何调整 - 解决方法大全 三国文鸾 - 深入探索三国历史与文化 Word取消显示修改痕迹 - 完整操作指南 Word历史保存文件去哪里找?完整查找指南 如何打开DOC文件?简单实用的DOC文档打开方法大全 Word行间距快捷键大全 - 快速调整文档排版 Word文字底色怎么设置?详细图文教程 - 文档排版技巧 三国志9四大蛮族详解 - 南蛮、山越、羌族与乌丸全面解析 Win11怎么打开ISO文件?3种简单方法教你轻松访问镜像内容 Word文档中图片全部显示为白色?原因与解决方法 女版三国 - 乱世巾帼英雄传 | 三国志女性角色专题 如何打开DWG格式文件?多种方法详解 Word如何打开审阅模式 - 完整操作指南 三国马休 - 东汉末年武将生平与历史事迹专题 spacedesk官网打不开?解决方案与替代方法 - 技术问题指南 Word统一调整图片尺寸快捷键 - 快速批量修改图片大小技巧 三国曹宪 - 乱世佳人,曹操之女的传奇人生 VSD文件怎么放在Word中?多种方法详解 spacedesk延迟问题分析与优化指南 三国志逐鹿天下 - 经典策略战棋专题页 三国志各代评价 - 全系列版本优缺点与玩家口碑汇总 Word文档打字不显示?一文解决输入无反应问题