Java连接OpenOffice4的使用
项目使用背景
内部使用的文件管理系统,实现doc,docx文件的在线预览功能;整体功能类似于知网的功能缩减版:文件的管理,在线预览,查重功能。其中还使用到pdf2htmlEX实现pdf转html,最终实现文章重复部分标红操作。
官方下载:https://www.openoffice.org/download/
优点
doc,docx格式转其它pdf,html格式快速便捷。
缺点
- docx解析,支持有限很多文本格式无法解析,例如嵌入的excel画布图等
- 无法控制解析转换完的样式
服务启动
Windows环境
(1)下载安装省略。启动命令如下:
1.找到安装目录
cd C:\Program Files (x86)\OpenOffice 4\program
2.运行启动命令
soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard
安装命令介绍
host=127.0.0.1
项目本地能访问,改成host=0.0.0.0
可外网访问port=8100
监测的端口,默认8100
,可以更改端口
(2)插件的使用
- 本地使用
host=127.0.0.1
服务和插件在一台windows服务器上 - 插件和服务分开
host=0.0.0.0
,开放端口访问,增加入库规则放开8100端口
netstat -ano
可以查看到端口的状态,有服务的端口即可
telnet ip:port
查询外部能否访问
如有开放服务的状态0.0.0.0:8100
,基本就能使用
Linux环境
Linux环境一向是比较坑,端口开放这些同理Windows
命令
cd /opt/openoffice4/program
./soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &
或
/opt/openoffice4/program/soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &
公司的环境都是用的Docker,所以在Docker Hub
搜索一个镜像开启服务即可,如果觉得有什么不对,可以自己安装制作一个镜像
特别说明:docker 做这类的模块服务是非常合适的,单独启动起来,所有的模块都可以通过ip和端口来访问,谁用谁知道
Linux环境下的OpenOffice解析乱码
原因是Linux缺少Windows环境的字体库,解决方案:
- 复制Windows系统的字体库
C:\Windows\Fonts
到/usr/share/fonts
然后 fc-cache
更新缓存,重启OpenOffice
,搞定!
Java使用
/**
* 将word文档转换成html文档
*
* @param docFilePath 需要转换的word文档
* @param filepath 转换之后html的存放路径
* @return 转换之后的html文件
*/
public static void convert(String docFilePath, String filepath) throws Exception {
File docFile = new File(docFilePath);
// 创建保存html的文件
File htmlFile = new File(filepath);
// 创建Openoffice连接,指定服务ip 端口
OpenOfficeConnection con = new SocketOpenOfficeConnection("192.168.0.158", 8100);
// 连接
con.connect();
System.out.println("获取链接成功!!!!!!!!!!!!!!!!!!");
// 创建转换器
DocumentConverter converter;
// 转换文档问html
try {
converter = new StreamOpenOfficeDocumentConverter(con);
converter.convert(docFile, htmlFile);
System.out.println("获取链接成功!!OpenOfficeDocumentConverter");
} catch (Exception e) {
converter = new OpenOfficeDocumentConverter(con);
converter.convert(docFile, htmlFile);
System.out.println("获取链接成功!!StreamOpenOfficeDocumentConverter");
e.printStackTrace();
}
// 关闭openoffice连接
con.disconnect();
System.out.println("关闭连接!!");
}
jodconverter-2.2.1
不支持docx解析,maven仓库没有,可以自行下载jodconverter-2.2.2
放在自己的仓库中
<!-- https://mvnrepository.com/artifact/com.artofsolving/jodconverter-maven-plugin -->
<dependency>
<groupId>com.artofsolving</groupId>
<artifactId>jodconverter-maven-plugin</artifactId>
<version>2.2.1</version>
</dependency>
或重写方法:
/**
*其中不支持docx解析,重写源码
*注意新建同名的包com.artofsolving.jodconverter,类名保持一致ok
*/
package com.artofsolving.jodconverter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class BasicDocumentFormatRegistry implements DocumentFormatRegistry {
private List documentFormats = new ArrayList();
public BasicDocumentFormatRegistry() {
}
public void addDocumentFormat(DocumentFormat documentFormat) {
this.documentFormats.add( documentFormat );
}
protected List getDocumentFormats() {
return this.documentFormats;
}
@Override
public DocumentFormat getFormatByFileExtension(String extension) {
if (extension == null) {
return null;
} else {
if (extension.indexOf( "doc" ) >= 0) {
extension = "doc";
}
if (extension.indexOf( "ppt" ) >= 0) {
extension = "ppt";
}
if (extension.indexOf( "xls" ) >= 0) {
extension = "xls";
}
String lowerExtension = extension.toLowerCase();
Iterator it = this.documentFormats.iterator();
DocumentFormat format;
do {
if (!it.hasNext()) {
return null;
}
format = (DocumentFormat) it.next();
} while (!format.getFileExtension().equals( lowerExtension ));
return format;
}
}
@Override
public DocumentFormat getFormatByMimeType(String mimeType) {
Iterator it = this.documentFormats.iterator();
DocumentFormat format;
do {
if (!it.hasNext()) {
return null;
}
format = (DocumentFormat) it.next();
} while (!format.getMimeType().equals( mimeType ));
return format;
}
}
版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/04/01/using-java-to-connect-openoffice4/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论