杰瑞科技汇

Linux下Java如何实现Word转PDF?

核心思路

在 Java 中实现 Word 转 PDF,通常有两种核心思路:

Linux下Java如何实现Word转PDF?-图1
(图片来源网络,侵删)
  1. 使用服务器端组件(推荐):在服务器上安装一个“无头”的办公软件(如 LibreOffice),然后通过 Java 代码调用其命令行接口来完成转换,这是最稳定、兼容性最好的方法。
  2. 使用纯 Java 库:使用第三方 Java 库(如 Apache POI + iText, 或商业库如 Aspose.Words, Spire.Doc)直接解析 Word 文件并生成 PDF,这种方法不需要安装额外软件,但可能存在兼容性或格式还原度的问题。

使用 LibreOffice 命令行(最推荐)

这是业界最常用、最可靠的方法,LibreOffice 是一个开源的办公套件,它提供了一个强大的命令行工具 soffice,可以完美地处理文档转换。

优点

  • 高兼容性:使用 LibreOffice 内核,能完美还原 Word 中的复杂格式(如表格、图片、页眉页脚、样式等)。
  • 稳定可靠:作为独立进程运行,内存占用相对可控,不易导致 JVM 崩溃。
  • 免费开源:LibreOffice 和其命令行接口都是免费的。

缺点

  • 需要预装软件:必须在 Linux 服务器上安装 LibreOffice。
  • 启动延迟:每次转换都需要启动一个新的 soffice 进程,第一次或冷启动时可能会有几秒的延迟。

详细步骤

安装 LibreOffice

在基于 Debian/Ubuntu 的系统上:

sudo apt update
sudo apt install libreoffice

在基于 RedHat/CentOS 的系统上:

sudo yum install libreoffice
# 或者对于较新版本
sudo dnf install libreoffice

安装完成后,你可以通过以下命令验证是否安装成功:

Linux下Java如何实现Word转PDF?-图2
(图片来源网络,侵删)
soffice --version

Java 代码实现

我们将使用 ProcessBuilder 来调用 soffice 的命令行。

转换 .docx 文件

import java.io.File;
public class LibreOfficeConverter {
    /**
     * 使用 LibreOffice 将 Word 文档转换为 PDF
     * @param inputFilePath  输入的 Word 文件路径 (.doc 或 .docx)
     * @param outputDirPath  输出的 PDF 文件目录
     */
    public static void convertDocxToPdf(String inputFilePath, String outputDirPath) {
        File inputFile = new File(inputFilePath);
        if (!inputFile.exists()) {
            System.err.println("输入文件不存在: " + inputFilePath);
            return;
        }
        // 确保输出目录存在
        File outputDir = new File(outputDirPath);
        if (!outputDir.exists()) {
            outputDir.mkdirs();
        }
        // soffice 命令
        // --headless: 无界面模式
        // //convert-to pdf: 指定转换为 pdf 格式
        // --outdir: 指定输出目录
        String[] command = {
            "soffice",
            "--headless",
            "--convert-to", "pdf",
            "--outdir", outputDirPath,
            inputFilePath
        };
        try {
            System.out.println("开始转换: " + inputFilePath);
            Process process = new ProcessBuilder(command).start();
            // 等待命令执行完成
            int exitCode = process.waitFor();
            if (exitCode == 0) {
                System.out.println("转换成功!");
                // LibreOffice 默认会生成与原文件名相同,但扩展名为 .pdf 的文件
                String outputFileName = inputFile.getName().replace(".docx", ".pdf").replace(".doc", ".pdf");
                File outputFile = new File(outputDir, outputFileName);
                System.out.println("PDF 文件已生成: " + outputFile.getAbsolutePath());
            } else {
                System.err.println("转换失败,退出码: " + exitCode);
                // 读取错误输出流
                java.util.Scanner s = new java.util.Scanner(process.getErrorStream()).useDelimiter("\\A");
                System.err.println("错误信息: " + s.hasNext() ? s.next() : "");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        // 示例用法
        String wordFilePath = "/path/to/your/document.docx"; // 替换为你的 Word 文件路径
        String outputDirectory = "/path/to/your/output/directory"; // 替换为你的输出目录
        convertDocxToPdf(wordFilePath, outputDirectory);
    }
}

转换 .doc 文件

上面的代码对 .doc.docx 文件都有效,因为 LibreOffice 能自动识别。

Linux下Java如何实现Word转PDF?-图3
(图片来源网络,侵删)

使用纯 Java 库(Apache POI + iText)

这种方法不依赖外部软件,所有操作都在 JVM 内部完成,它通常用于处理格式相对简单的文档。

优点

  • 无外部依赖:只需引入 JAR 包,无需在服务器上安装任何软件。
  • 集成度高:可以直接在 Java 应用中无缝调用。

缺点

  • 兼容性差:对于复杂的 Word 文档(如复杂的表格、浮动图片、艺术字、复杂的页眉页脚等),格式还原度非常低,经常出现错乱、丢失。
  • 实现复杂:直接操作 Word 和 PDF 的底层结构,代码量较大且难以维护。
  • 性能问题:对于大文件,可能会消耗大量内存。

注意:直接使用 POI 读取 Word 并用 iText 写入 PDF 是一个非常复杂且不推荐的做法,更常见的做法是使用 POI 读取 Word 内容(文本、段落、表格),然后手动用 iText 重新构建 PDF,这种方法几乎无法保留原始样式。

代码示例(仅作概念演示,不推荐用于生产)

这里展示一个极度简化的例子,只提取文本并生成一个无格式的 PDF。

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import com.itextpdf.text.Document;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class SimplePoiToPdfConverter {
    public static void convert(String inputDocxPath, String outputPdfPath) {
        try (XWPFDocument document = new XWPFDocument(new FileInputStream(inputDocxPath));
             FileOutputStream out = new FileOutputStream(outputPdfPath)) {
            Document pdfDoc = new Document();
            PdfWriter.getInstance(pdfDoc, out);
            pdfDoc.open();
            // 遍历 Word 文档中的所有段落
            for (XWPFParagraph p : document.getParagraphs()) {
                // 将段落文本添加到 PDF 中,所有样式丢失
                pdfDoc.add(new Paragraph(p.getText()));
            }
            pdfDoc.close();
            System.out.println("简单转换完成,但所有样式已丢失: " + outputPdfPath);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        String wordFilePath = "/path/to/your/document.docx";
        String pdfFilePath = "/path/to/your/output/document.pdf";
        convert(wordFilePath, pdfFilePath);
    }
}

Maven 依赖:

<dependencies>
    <!-- Apache POI for .docx -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>5.2.3</version>
    </dependency>
    <!-- iText for PDF generation -->
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itextpdf</artifactId>
        <version>5.5.13.3</version>
    </dependency>
</dependencies>

使用商业 Java 库(如 Aspose.Words)

商业库提供了强大的 API,旨在解决 POI 的兼容性问题,让开发者能以纯 Java 的方式实现高质量的转换。

优点

  • 高保真度:能非常好地还原 Word 文档的格式、布局和样式。
  • 功能强大:API 丰富,支持 Word 文档的读取、修改、创建和转换等几乎所有操作。
  • 易于使用:API 设计直观,几行代码就能完成转换。

缺点

  • 收费:需要购买许可证,对于商业项目是一笔开销(通常提供免费试用版)。

代码示例(Aspose.Words)

import com.aspose.words.Document;
import com.aspose.words.SaveFormat;
import java.io.File;
public class AsposeWordsConverter {
    public static void convert(String inputPath, String outputPath) {
        try {
            // 加载 Word 文档
            Document doc = new Document(inputPath);
分享:
扫描分享到社交APP
上一篇
下一篇