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
Word文档突然不能编辑了怎么办?快速解决方法大全 PDF文件打不开怎么办?常见问题与解决方法大全 Word输入文字后原有文字消失?一招解决覆盖问题 | 实用办公技巧 怎样把金山文档转为Word文档?详细教程一步到位 如何将Excel表格转换成Word文档 - 简单实用方法大全 Word文字每行后出现空行?快速解决方法 - 文档排版技巧 Word文档怎么设置页码 - 图文详细教程 Word如何退出兼容模式 - 简单步骤指南 Word文件图标变白但能打开?一文解决图标异常问题 三国人物专题:魏国谋士薛悌生平事迹全解析 SRT文件如何转为Word文件 - 简单实用转换方法指南 Word文档文字处理技巧与实用指南 - 提升办公效率 三国奇人张裕:精通天文的预言方士 - 生平与传奇故事 Word文档空格后字不见了?原因与解决方法全解析 Win10 DLL文件应该放在哪里?一文详解正确存放位置 Word接受所有修订在哪里?详细操作指南 Word段落之间间隔太大怎么办?解决方法大全 三国志11iOS版 - 经典策略游戏移动体验 Word添加项目符号怎么设置 - 详细图文教程 三国志11军团系统详解 - 经典策略游戏深度指南 三国韩琮 - 生平事迹与历史探析 三国志11南蛮征伐专题 - 战略解析与游戏攻略 三国志战略版诸葛恪全解析 - 阵容搭配与实战技巧指南 三国许靖专题 - 生平事迹与历史评价 Word打开文件出错怎么修复?多种方法快速解决文档损坏问题 手机怎么制作PDF文件?超简单方法大全 Word文档如何更改背景底色?详细图文教程 三国志吴书孙坚传 - 东吴始祖孙坚生平专题 Word表格后面无法添加文字?一文解决所有常见问题 spacedesk安卓版安装不上?原因与解决方案全解析 spacedesk安卓怎么卸载?详细卸载步骤教程 三国郑袤:魏晋之际的贤臣风范 - 历史人物专题 Word文档撤回键没了?一键撤销功能消失的解决方法 md文件用什么软件打开?常用Markdown编辑器推荐 Word文档怎么加入图片?详细图文教程与技巧 三国志裴松之注专题 - 深入解读历史经典 三国志11官爵条件全解析 - 官职与爵位晋升攻略 三国志7战斗技巧全攻略 | 掌握经典SLG制胜之道 spacedeskx10 - 免费高效的屏幕扩展解决方案 | 多设备协同 Word取消批注模式 - 完整操作指南与技巧 PDF文件过大如何减小?5种简单有效的压缩方法 Word新建100页:快速创建长文档的实用技巧与方法 PPT转Word文档 - 免费在线将PowerPoint转换为Word Word怎么将文字互换位置?三种实用方法详解 Word表格宽度调不了怎么回事?原因与解决方法全解析 怎么在Word文档中给文字加横线?多种方法详解 doc文件手机怎么编辑?5种方法轻松搞定Word文档 - 手机办公指南 Word兼容模式编辑不了?原因与解决方法全解析 Word背景图片大小不合适怎么调整 - 实用解决方法大全 Word文档怎么删除修订?一文看懂彻底清除修订痕迹的方法 Word如何退出批注模式?详细步骤教程 手机如何打开DAT文件?详细方法与工具推荐 Word文档如何删除页面 - 详细图文教程 如何制作SRT字幕文件 - 详细图文教程 三国李恢专题 - 蜀汉忠臣李恢生平事迹全记录 Word的撤回键在哪?一文看懂撤销操作方法 三国志英雄传:关羽 - 忠义千秋的武圣 Word表格无法拖拽调整大小?原因与解决方法全解析 三国志11魏定国MOD专题页 - 经典策略游戏深度解析 spacedesk连接不显示?快速排查与解决方案 spacedesk驱动下载与安装指南 - 免费无线扩展您的电脑屏幕 Word文件对比内容不同 - 免费文档差异比对方法详解 三国王昶 - 生平事迹与历史贡献专题 Word文档怎么翻译成中文?5种简单有效的方法详解 如何比较两个Word文档?详细对比方法指南 Word文档上面空白太多?5种方法快速解决空白问题 Word带下划线的怎么只删除字 - 保留格式技巧指南 Word文档横线怎么打出来?5种简单方法详解 如何退出Word审阅模式?详细图文教程指南 王濬与三国末期历史 - 西晋灭吴名将专题 Word文字怎么换行?详细操作方法与技巧 Word文档横线怎么删除?详细图文教程 三国志·司马懿原文 - 历史文献专题页 三国志13周瑜专题 - 能力解析与玩法攻略 Word关闭夜间模式方法详解 - 恢复正常显示模式 spacedesk在苹果设备上的使用指南 - 无线扩展你的屏幕 三国志11花鬘专题页 - 武将介绍与使用攻略 三国志强化版手游 - 经典策略战棋手游 三国李胜 - 历史人物专题 三国志7 圣痕:经典策略游戏的深度MOD解析 HTML文件如何转换成Word文档?多种方法详解 三国龚景 - 东汉末年青州刺史历史人物专题 Word文字下方出现蓝色双线?原因与解决方法详解 三国志9隐藏属性全解析 - 深度揭秘游戏隐藏机制 手机如何打开OBB文件?详细图文教程 - 安卓数据包安装指南 三国志7新手攻略 - 新手入门与实用技巧指南 三国志战棋版苹果版 - 经典战棋策略手游iOS下载 电脑上OFD文件怎么转换格式?多种方法详解 三国志许攸传 - 深度解析东汉末年谋士许攸的传奇人生 手机怎么打开.md文件?详细方法教程 三国志魏书专题 - 深入解读魏国历史与人物 Word统一调整图片尺寸 - 快速批量修改文档中所有图片大小 Word文档编辑教程 - 零基础入门到精通 Word文档未保存怎么恢复?5种实用方法完整指南 如何比对两份Word文档的差异 - 详细方法指南 Word文档最舒服的字体大小:科学选择字号提升阅读体验 三国志10内政系统完全指南 - 策略与城市发展详解 Winlator下载OBB文件完整指南 | 安装与配置教程 解决Word文档文字背景有阴影的完整指南 - 去除阴影技巧 Word文档打不出字?常见原因与解决方法大全