Java连接OpenOffice4的使用

项目使用背景

内部使用的文件管理系统,实现doc,docx文件的在线预览功能;整体功能类似于知网的功能缩减版:文件的管理,在线预览,查重功能。其中还使用到pdf2htmlEX实现pdf转html,最终实现文章重复部分标红操作。

官方下载:https://www.openoffice.org/download/

优点

doc,docx格式转其它pdf,html格式快速便捷。

缺点

  1. docx解析,支持有限很多文本格式无法解析,例如嵌入的excel画布图等
  2. 无法控制解析转换完的样式

服务启动

Windows环境

(1)下载安装省略。启动命令如下:

1
2
3
4
5
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端口
1
2
3
4
netstat -ano
可以查看到端口的状态,有服务的端口即可
telnet ip:port
查询外部能否访问

如有开放服务的状态0.0.0.0:8100,基本就能使用

Linux环境

Linux环境一向是比较坑,端口开放这些同理Windows

命令

1
2
3
4
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使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 /**
* 将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放在自己的仓库中

1
2
3
4
5
6
<!-- 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>

或重写方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/**
*其中不支持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;
}
}