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

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 或 htmllog.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.mzph.cn/news/816600.shtml

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

相关文章

Flutter - iOS 开发者速成篇

首先 安装FLutter开发环境&#xff1a;M1 Flutter SDK的安装和环境配置 然后了解Flutter和Dart 开源电子书&#xff1a;Flutter实战 将第一章初略看一下&#xff0c;你就大概了解一下Flutter和Dart这门语言 开始学习Dart语言 作为有iOS经验的兄弟们&#xff0c;学习Dart最快…

C# dynamic 数据类型

在C#中&#xff0c;dynamic是一种数据类型&#xff0c;它允许在运行时推迟类型检查和绑定。使用dynamic类型&#xff0c;可以编写更具灵活性的代码&#xff0c;因为它允许在编译时不指定变量的类型&#xff0c;而是在运行时根据实际情况进行解析。 dynamic类型的变量可以存储任…

【脚本】多功能Ubuntu临时授予用户sudo权限管理工具

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 设计原理和初衷可以看这里&#xff1a;【技巧】Ubuntu临时授予用户sudo权限&#xff0c;并在一定时间后自动撤销_ubuntu jianshao sudo-CSDN博客文章浏览阅读404次。非常实用_ubuntu jianshao sudohttps://blog.c…

SpringBoot+FreeMaker

目录 1.FreeMarker说明2.SpringBootFreeMarker快速搭建Pom文件application.properties文件Controller文件目录结构 3.FreeMarker数据类型3.1.布尔类型3.2.数值类型3.3.字符串类型3.4.日期类型3.5.空值类型3.6.sequence类型3.7.hash类型 4.FreeMarker指令assign自定义变量指令if…

C++版【AVL树的模拟实现】

前言 在学习AVL树的底层之前&#xff0c;先回顾一下二叉搜索树&#xff0c;我们知道二叉搜索树在极端场景是会形成单支树的&#xff0c;如下图&#xff1a; 在退化成单支树后&#xff0c;查找的效率就会降到O(n)&#xff0c;所以为了解决退化成单支树的情况&#xff0c;AVL树就…

stm32移植嵌入式数据库FlashDB

本次实验的程序链接stm32f103FlashDB嵌入式数据库程序资源-CSDN文库 一、介绍 FlashDB 是一款超轻量级的嵌入式数据库&#xff0c;专注于提供嵌入式产品的数据存储方案。与传统的基于文件系统的数据库不同&#xff0c;FlashDB 结合了 Flash 的特性&#xff0c;具有较强的性能…

Ubuntu20.04安装FloodLight最新版本

Ubuntu20.04安装FloodLight最新版本 网上的很多教程尝试了一下都不对&#xff0c;并且很多都是基于Ubuntu14的旧版本系统&#xff0c;其中的Python环境大多是基于2.0的&#xff0c;由于本人所使用的系统是Ubuntu20.04&#xff0c;后再油管澳大利亚某个学校的网络教学视频的帮助…

【Vue】面试题

vue的组建通信方式 父子关系&#xff1a;props & $emit 、 $parent / $children 、 ref / $refs 、 插槽跨层级关系&#xff1a; provide & inject通用方案&#xff1a;Vuex 或 eventbus 插播&#xff1a;兄弟组建怎么通信&#xff1f; eventbusVuex通过中间件&…

架构师系列-搜索引擎ElasticSearch(六)- 映射

映射配置 在创建索引时&#xff0c;可以预先定义字段的类型&#xff08;映射类型&#xff09;及相关属性。 数据库建表的时候&#xff0c;我们DDL依据一般都会指定每个字段的存储类型&#xff0c;例如&#xff1a;varchar、int、datetime等&#xff0c;目的很明确&#xff0c;就…

STM32之DHT11温湿度传感器

目录 一 DHT11温湿度传感器简介 1.1 传感器特点 1.2 传感器特性 1.3 传感器引脚说明 二 测量原理及方法 2.1 典型应用电路 2.2 单线制串行简介 2.2.1 串行接口 (单线双向) 2.2.2 数据示例 2.3 通信时序 三 单片机简介 3.1 STM32F103C8T6最小系统板 四 接线说明 …

011、Python+fastapi,第一个后台管理项目走向第11步:建立python+fastapi项目,简单测试一下

一、说明 本文章就是记录自己的学习过程&#xff0c;如果有用您可以参考&#xff0c;没用你就略过&#xff0c;没有好与不好之分&#xff0c;今天主要是参考了gitee上的一些项目&#xff0c;一步一步的往后i建立 对于学习来说&#xff0c;如果您有java c等经验&#xff0c;py…

wpf下RTSP|RTMP播放器两种渲染模式实现

技术背景 在这篇blog之前&#xff0c;我提到了wpf下播放RTMP和RTSP渲染的两种方式&#xff0c;一种是通过控件模式&#xff0c;另外一种是直接原生RTSP、RTMP播放模块&#xff0c;回调rgb&#xff0c;然后在wpf下渲染&#xff0c;本文就两种方式做个说明。 技术实现 以大牛直…

RT-thread信号量与互斥量

1,信号量 信号量是一种轻型的用于解决线程间同步问题的内核对象,线程可以获取或释放它,从而达到同步或互斥的目的。理解资源计数适合于线程间工作处理速度不匹配的场合;信号量在大于0时才能获取,在中断、线程中均可释放信号量。 为了体现使用信号量来达到线程间的同步,…

qemu源码解析一

基于qemu9.0.0 简介 QEMU是一个开源的虚拟化软件&#xff0c;它能够模拟各种硬件设备&#xff0c;支持多种虚拟化技术&#xff0c;如TCG、Xen、KVM等 TCG 是 QEMU 中的一个组件&#xff0c;它可以将高级语言编写的代码&#xff08;例如 C 代码&#xff09;转换为可在虚拟机中…

稀碎从零算法笔记Day49-LeetCode:设计哈希集合

题型&#xff1a;模拟 链接&#xff1a;705. 设计哈希集合 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 不使用任何内建的哈希表库设计一个哈希集合&#xff08;HashSet&#xff09;。 实现 MyHashSet 类&#xff1a; void add(key) 向哈…

关闭win10搜索中的热门搜索广告

任务目标&#xff0c;关闭掉这个煞笔热门搜索功能 1.首先WinR快捷键&#xff0c;输入“regedit”来打开注册表 2.在注册表中定位到计算机\HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows 并在Windows下新建“项”&#xff0c;命名为“Explorer”&#xff0c;并在这新…

Python大数据分析——一元与多元线性回归模型

Python大数据分析——一元与多元线性回归模型 相关分析概念示例 一元线性回归模型概念理论分析函数示例 多元线性回归模型概念理论分析示例 线性回归模型的假设检验模型的F检验理论分析示例 模型的T检验理论分析示例 相关分析 概念 a 正相关&#xff1b;b 负相关&#xff1b;c…

2024 十五届蓝桥杯省赛Python B组

以下仅是我的答案&#xff0c;仅供参考&#xff0c;欢迎讨论。 A&#xff1a;穿越时空之门 二进制、四进制转换。答案&#xff1a;63。 B&#xff1a;数字串个数 排除0&#xff0c;总的方案数9^10000,减去不存在3和不存在7的2*8^10000&#xff0c;再加上同时不存在3和7的7^…

RedisTemplate

3.3.RedisTemplate 在Sentinel集群监管下的Redis主从集群&#xff0c;其节点会因为自动故障转移而发生变化&#xff0c;Redis的客户端必须感知这种变化&#xff0c;及时更新连接信息。Spring的RedisTemplate底层利用lettuce实现了节点的感知和自动切换。 下面&#xff0c;我们…

InnoDB中高度为3的B+树最多可以存多少数据?

参考&#xff1a; &#x1f525;我说MySQL每张表最好不超过2000万数据&#xff0c;面试官让我回去等通知&#xff1f; - 掘金 考虑到磁盘IO是非常高昂的操作&#xff0c;计算机操作系统做了预读的优化&#xff0c;当一次IO时&#xff0c;不光把当前磁盘地址的数据&#xff0c;…