Java使用OpenOffice将office文件转换为PDF

Java使用OpenOffice将office文件转换为PDF

  • [1. 先行工作](#1. 先行工作)
    • [1.1 OpenOffice官网下载](#1.1 OpenOffice官网下载)
    • [1.2 JODConverter官网下载](#1.2 JODConverter官网下载)
    • [1.3 下载内容](#1.3 下载内容)
  • 2.介绍
  • [3. 安装OpenOffice服务](#3. 安装OpenOffice服务)
  • [4. maven依赖](#4. maven依赖)
  • [5. 转换代码](#5. 转换代码)

1. 先行工作

请注意,无论是windows还是liunx环境都需要安装jdk环境,版本jdk7+

1.1 OpenOffice官网下载

本地开发环境使用windows,因此下载Windows 32-bit (x86)(EXE)

测试环境使用linux,所以下载Linux 64-bit(x86-64)

OpenOffice官网下载

1.2 JODConverter官网下载

JODConverter官网下载

1.3 下载内容

2.介绍

OpenOffice: OpenOffice是一套跨平台的办公室软件套件,功能非常强大,适用windows、linux、mac等各大平台,简单来说Office能做到的OpenOffice也基本都能做到。

JODConverter: 是一个Java的OpenDocument文件转换器,可以进行许多文件格式的转换。它依赖于OpenOffice.org或者LibreOffice提供的服务来进行转换,它能将Microsoft Office文档(Word,Excel,PowerPoint)转换为PDF格式。你可以将JODConverter内嵌在Java应用程序里,也可以单独作为命令行由脚本调用,更可以应用为网页程序或者Web Service以供网络应用。

3. 安装OpenOffice服务

3.1.Windows环境

  • 首先安装OpenOffice,可直接默认安装

  • 通过命令行方式启动OpenOffice服务(这步可不执行,仅作为验证是否安装正确,代码中会自动启动服务)

    //进入目录
    cd C:\Program Files (x86)\OpenOffice 4\program
    //启动OpenOffice服务
    soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard
    //查看是否启动成功
    netstat -ano|findstr "8100"
    //终止进程
    taskkill /F /PID 2032

3.2 Linux环境

创建指定目录并上传下载的liunx下的安装包

复制代码
mkdir openoffice

执行解压缩命令

复制代码
tar -zxvf Apache_OpenOffice_4.1.15_Linux_x86-64_install-rpm_zh-CN.tar.gz

进入zh-CN/RPMS/目录下安装rpm文件

shell 复制代码
yum localinstall *.rpm

输入y确认安装,安装完成后会生成目录:desktop-integration

进入desktop-integration目录 安装

apache 复制代码
yum localinstall openoffice4.1.15-redhat-menus-4.1.15-9813.noarch.rpm 

输入y确认安装,如果报错:

复制代码
Transaction check error:
  file /usr/bin/soffice from install of openoffice4.1.15-redhat-menus-4.1.15-9813.noarch conflicts with file from package libreoffice-core-1:5.3.6.1-24.el7.x86_64

执行以下命令

复制代码
sudo yum remove libreoffice-core

然后重新执行上一步的安装命令,成功如下:

后台服务方式启动openoffice服务

复制代码
/opt/openoffice4/program/soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &

4. maven依赖

jodconverter-2.2.2中的有些jar文件的依赖并不一定会在maven仓库中找到,因此需要手动install

打开命令行执行以下命令,注意-Dfile替换为 jodconverter-2.2.2\jodconverter-2.2.2\lib 的目录

复制代码
mvn install:install-file -Dfile="E:\开发工具\openoffice-word转pdf\jodconverter-2.2.2\jodconverter-2.2.2\lib\unoil-3.0.1.jar" -DgroupId=org.apache.openoffice -DartifactId=unoil -Dversion=3.0.1 -Dpackaging=jar
mvn install:install-file -Dfile="E:\开发工具\openoffice-word转pdf\jodconverter-2.2.2\jodconverter-2.2.2\lib\jodconverter-2.2.2.jar" -DgroupId=org.jodconverter -DartifactId=jodconverter -Dversion=2.2.2 -Dpackaging=jar
mvn install:install-file -Dfile="E:\开发工具\openoffice-word转pdf\jodconverter-2.2.2\jodconverter-2.2.2\lib\jodconverter-cli-2.2.2.jar" -DgroupId=org.jodconverter -DartifactId=jodconverter-cli -Dversion=2.2.2 -Dpackaging=jar
mvn install:install-file -Dfile="E:\开发工具\openoffice-word转pdf\jodconverter-2.2.2\jodconverter-2.2.2\lib\juh-3.0.1.jar" -DgroupId=org.apache.odftoolkit -DartifactId=juh -Dversion=3.0.1-incubating -Dpackaging=jar
mvn install:install-file -Dfile="E:\开发工具\openoffice-word转pdf\jodconverter-2.2.2\jodconverter-2.2.2\lib\jurt-3.0.1.jar" -DgroupId=org.apache.odftoolkit -DartifactId=jurt -Dversion=3.0.1-incubating -Dpackaging=jar
mvn install:install-file -Dfile="E:\开发工具\openoffice-word转pdf\jodconverter-2.2.2\jodconverter-2.2.2\lib\ridl-3.0.1.jar" -DgroupId=org.apache.odftoolkit -DartifactId=ridl -Dversion=3.0.1-incubating -Dpackaging=jar

5. 转换代码

转换工具类:FileConversionUtil.java

java 复制代码
package com.cxstar.common.utils;

import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;

import java.io.File;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 文件转换工具类,支持将不同类型的文件转换为指定格式(pdf或html)。
 */
@Slf4j
public class FileConversionUtil {

    /**
     * 被转换文件类型的枚举,用于表示支持的文件类型。
     */
    public enum FileType {
        DOC, DOCX, XLS, XLSX, PPT, PPTX;

        /**
         * 获取小写文件类型列表
         *
         * @return 小写文件类型列表
         */
        public static List<String> getLowerCaseFileTypes() {
            return Arrays.stream(values())
                    .map(FileType::name)
                    .map(String::toLowerCase)
                    .collect(Collectors.toList());
        }
    }

    /**
     * 转换文件类型的枚举,用于表示支持的文件类型。
     */
    public enum ConvertFileType {
        PDF, HTML;

        /**
         * 获取小写文件类型列表
         *
         * @return 小写文件类型列表
         */
        public static List<String> getLowerCaseFileTypes() {
            return Arrays.stream(values())
                    .map(ConvertFileType::name)
                    .map(String::toLowerCase)
                    .collect(Collectors.toList());
        }
    }

    /**
     * 执行文件格式转换。
     *
     * @param originalFilePath  原始文件路径
     * @param convertedFilePath 转换后文件保存路径
     * @return 转换是否成功
     */
    public static boolean convertToPdf(String originalFilePath, String convertedFilePath) {
        // 获取原始文件扩展名
        String originalExt = FilenameUtils.getExtension(originalFilePath);
        List<String> lowerCaseFileTypes = FileType.getLowerCaseFileTypes();
        // 检查原始文件类型是否支持
        if (!lowerCaseFileTypes.contains(originalExt)) {
            throw new RuntimeException("错误的转换类型:只允许格式为:" + StringUtils.join(lowerCaseFileTypes, ",") + " 进行转换");
        }

        // 获取目标文件扩展名
        String convertExt = FilenameUtils.getExtension(convertedFilePath);
        List<String> convertFileTypes = ConvertFileType.getLowerCaseFileTypes();

        // 检查目标文件类型是否支持
        if (!convertFileTypes.contains(convertExt)) {
            throw new RuntimeException("错误的转换类型:只允许转换为:" + StringUtils.join(convertFileTypes, ","));
        }

        try {
            // 连接 OpenOffice 服务。需提前开启 OpenOffice 服务,否则会报错。
            OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
            try {
                connection.connect();
            } catch (Exception e) {
                throw new RuntimeException("连接 OpenOffice 服务失败,请检查是否启动 OpenOffice 服务,错误信息:" + e.getMessage());
            }

            // 转化原始文件转化为 pdf 或 html
            log.info("开始转换......");
            long startTime = System.currentTimeMillis();

            DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
            converter.convert(new File(originalFilePath), new File(convertedFilePath));

            long endTime = System.currentTimeMillis();
            log.info("转换完成,耗时: {} 毫秒", endTime - startTime);

            connection.disconnect();

        } catch (Exception e) {
            throw new RuntimeException("转换异常:" + e.getMessage());
        }
        return true;
    }
}

测试类:

java 复制代码
@Test
void createIndexAndSetMapping11() {
    String file ="C:\\Users\\zhouquan\\Desktop\\叙述词导入模板.xlsx";
    String pdfFile = "C:\\Users\\zhouquan\\Desktop\\test.pdf";
    FileConversionUtil.conversionPdfOrHtml(file, pdfFile);
}
相关推荐
钟离墨笺7 分钟前
Go 语言-->指针
开发语言·后端·golang
花落人散处37 分钟前
SpringAI——接入高德MCP服务
java·后端
超浪的晨37 分钟前
Java 代理机制详解:从静态代理到动态代理,彻底掌握代理模式的原理与实战
java·开发语言·后端·学习·代理模式·个人开发
天天摸鱼的java工程师39 分钟前
🧠 MySQL 索引结构有哪些?优缺点是什么?【原理 + 场景实战】
java·后端·面试
咖啡の猫1 小时前
bash的特性-bash中的引号
开发语言·chrome·bash
java叶新东老师1 小时前
idea提交时忽略.class、.iml文件和文件夹或目录的方法
java·开发语言
飞翔的佩奇1 小时前
Java项目:基于SSM框架实现的社区团购管理系统【ssm+B/S架构+源码+数据库+毕业论文+答辩PPT+远程部署】
java·数据库·vue.js·毕业设计·mybatis·答辩ppt·社区团购
走过,莫回头1 小时前
在OpenMP中,#pragma omp的使用
开发语言·openmp
TDengine (老段)1 小时前
TDengine 转化函数 TO_TIMESTAMP 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
Warren981 小时前
Java Collections工具类
java·开发语言·笔记·python·学习·oracle·硬件工程