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

news2024/11/23 8:46:11

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

  • 1. 先行工作
    • 1.1 OpenOffice官网下载
    • 1.2 JODConverter官网下载
    • 1.3 下载内容
  • 2.介绍
  • 3. 安装OpenOffice服务
    • 3.1.Windows环境
    • 3.2 Linux环境
  • 4. maven依赖
  • 5. 转换代码

1. 先行工作

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

1.1 OpenOffice官网下载

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

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

OpenOffice官网下载

image-20240204084355610

1.2 JODConverter官网下载

JODConverter官网下载

1.3 下载内容

image-20240204143339196

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

image-20240204144733832

3.2 Linux环境

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

mkdir openoffice

执行解压缩命令

tar -zxvf Apache_OpenOffice_4.1.15_Linux_x86-64_install-rpm_zh-CN.tar.gz

image-20240205113503769

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

yum localinstall *.rpm

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

image-20240205113852876

进入desktop-integration目录 安装

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

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

image-20240205114311409

后台服务方式启动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

image-20240204164608484

5. 转换代码

转换工具类:FileConversionUtil.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;
    }
}

测试类:

@Test
void createIndexAndSetMapping11() {
    String file ="C:\\Users\\zhouquan\\Desktop\\叙述词导入模板.xlsx";
    String pdfFile = "C:\\Users\\zhouquan\\Desktop\\test.pdf";
    FileConversionUtil.conversionPdfOrHtml(file, pdfFile);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1597166.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

zookeeper分布式应用程序协调服务+消息中间件kafka分布式数据处理平台

一、zookeeper基本介绍 1.1 zookeeper的概念 Zookeeper是一个开源的分布式的&#xff0c;为分布式框架提供协调服务的Apache项目。 是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域名服务、…

半导体材料(一)

本篇为西安交通大学本科课程《电气材料基础》的笔记。 本篇为这一单元的第一篇笔记&#xff0c;下一篇传送门。 半导体是导电能力介于均属导体和绝缘体之间的固体材料。 半导体基本特征 室温下其电阻数量级约为 1 0 − 6 ∼ 1 0 8 Ω ⋅ m 10^{-6}\sim10^{8}\mathrm{\Omega…

供应IMX415-AAQR-C索尼芯片

长期供应各进口品牌芯片现货&#xff1a; IMX415-AAQR-C IMX492LLJ-C IMX492LQJ-C IMX455ALK-K IMMX455AQK-K IMX461ALR-C IMX461AQR-C IMX661-AAMR-C IMX661-AAQR-C IMX411ALR-C IMX411AQR-C IMX290LQR-C FS32K118LFT0MLHT FS32K146UAT0VLLT FS32K146UAT0VLQT …

什么数据集成(Data Integration):如何将业务数据集成到云平台?

说到数据集成&#xff08;Data Integration&#xff09;&#xff0c;简单地将所有数据倒入数据湖并不是解决办法。 在这篇文章中&#xff0c;我们将介绍如何轻松集成数据、链接不同来源的数据、将其置于合适的环境中&#xff0c;使其具有相关性并易于使用。 数据集成&#xff1…

机器学习实训 Day1(线性回归练习)

线性回归练习 Day1 手搓线性回归 随机初始数据 import numpy as np x np.array([56, 72, 69, 88, 102, 86, 76, 79, 94, 74]) y np.array([92, 102, 86, 110, 130, 99, 96, 102, 105, 92])from matplotlib import pyplot as plt # 内嵌显示 %matplotlib inlineplt.scatter…

针对MaxCompute优化案例分享

声明 原文来源&#xff1a;微信公众号&#xff1a;阿里云开发者 前言 MaxCompute 是阿里巴巴集团推出的一种大数据计算平台&#xff0c;用于处理海量数据和进行数据分析。它提供了高可靠性、高扩展性和高性能的数据处理能力&#xff0c;支持 SQL 查询、MapReduce 计算和机器…

【快捷部署】017_MongoDB(6.0.14)

&#x1f4e3;【快捷部署系列】017期信息 编号选型版本操作系统部署形式部署模式复检时间017MongoDB6.0.14Ubuntu 20.04apt单机2024-04-11 一、快捷部署 #!/bin/bash ################################################################################# # 作者&#xff1a;…

链表基础3——单链表的逆置

链表的定义 #include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node* next; } Node; Node* createNode(int data) { Node* newNode (Node*)malloc(sizeof(Node)); if (!newNode) { return NULL; } newNode->data …

ceph集群管理节点高可用

一、前言 ceph集群想要高可用也必须要有多个管理节点&#xff0c;不然只有单管理节点&#xff0c;在一个管理节点挂了的情况下就没法进行集群的管理&#xff0c;可以分为web管理和客户端管理&#xff0c;web管理和mgr服务相关&#xff0c;客户端管理和mon服务相关 二、部署 mg…

品深茶都有什么功效,为什么那么贵?

品深国茶是一款高端商务用茶品牌。以中国传统中医理论为指导&#xff0c;精选天然有机茶叶为原料&#xff0c;经过严格配方科学制茶&#xff0c;再经现代生物技术加工制成的高端茶&#xff0c;有排毒养颜、补充营养、调节免疫、调节血脂和血压、调节血糖、促消化、解酒护肝、软…

【深度学习实战(6)】搭建通用的语义分割推理流程

一、代码 #---------------------------------------------------# # 检测图片 #---------------------------------------------------# def detect_image(self, image, countFalse, name_classesNone):#---------------------------------------------------------## 在…

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题6

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题5 信息安全管理与评估 网络系统管理 网络搭建与应用 云计算 软件测试 移动应用开发 任务书&#xff0c;赛题&#xff0c;解析等资料&#xff0c;知识点培训服务 添加博主wx&#xff1a;liuliu548…

Decorator 装饰

意图 动态的给一个对象添加一些额外的职责。就增加功能而言&#xff0c;Decorator模式比生成子类更加灵活 结构 其中&#xff1a; Component定义一个对象接口&#xff0c;可以给这些对象动态的添加职责。ConcreteComponent定义一个对象&#xff0c;可以给这个对象添加一些职…

C++修炼之路之list模拟实现--C++中的双向循环链表

目录 引言 一&#xff1a;STL源代码中关于list的成员变量的介绍 二&#xff1a;模拟实现list 1.基本结构 2.普通迭代器 const迭代器的结合 3.构造拷贝构造析构赋值重载 清空 4.inserterase头尾插入删除 5.打印不同数据类型的数据《使用模板加容器来完成》 三&#xf…

水库之大坝安全监测系统解决方案

一、系统介绍 水库之大坝安全监测系统主要包括渗流监测系统、流量监测系统、雨量监测系统、沉降监测系统组成。每一个监测系统由监测仪器及自动化数据采集装置&#xff08;内置通信装置、防雷设备&#xff09;、附件&#xff08;电缆、通信线路、电源线路&#xff09;等组成&a…

YOLO算法改进Backbone系列之:HAT-Net

本文旨在解决ViT中与多头自我关注&#xff08;MHSA&#xff09;相关的高计算/空间复杂性问题。为此&#xff0c;我们提出了分层多头自注意&#xff08;H-MHSA&#xff09;&#xff0c;这是一种以分层方式计算自注意的新方法。具体来说&#xff0c;我们首先按照通常的方法将输入…

llama-factory SFT系列教程 (二),大模型在自定义数据集 lora 训练与部署

文章目录 简介支持的模型列表2. 添加自定义数据集3. lora 微调4. 大模型 lora 权重&#xff0c;部署问题 参考资料 简介 文章列表&#xff1a; llama-factory SFT系列教程 (一)&#xff0c;大模型 API 部署与使用llama-factory SFT系列教程 (二)&#xff0c;大模型在自定义数…

ClickHouse--18--argMin() 和argMax()函数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 argMin() 和argMax()函数业务场景使用案例1.准备表和数据&#xff1a;业务场景一&#xff1a;查看salary 最高和最小的user业务场景二&#xff1a;根据更新时间获取…

一种基于OpenCV的图片倾斜矫正方法

需求描述&#xff1a; 对倾斜的图片进行矫正&#xff0c;返回倾斜角度和矫正后的图片。 解决方法&#xff1a; 1、各种角度点被投影到一个累加器阵列中&#xff0c;其中倾斜角度可以定义为在最大化对齐的搜索间隔内的投影角度。 2、以不同的角度旋转图像&#xff0c;并为每…

Chatgpt掘金之旅—有爱AI商业实战篇|编写代码业务|(十九)

演示站点&#xff1a; https://ai.uaai.cn 对话模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 一、程序员使用 ChatGPT 进行编码搞副业 程序员不仅拥有将抽象概念转化为实际应用的能力&#xff0c;还通常具备强大的逻辑思维和问题解决能力。然而&#xff0c;许多程序员并…