Java连接OpenOffice4的使用

项目使用背景

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

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

优点

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

缺点

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

服务启动

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全栈技术分享
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
海报
Java连接OpenOffice4的使用
项目使用背景 内部使用的文件管理系统,实现doc,docx文件的在线预览功能;整体功能类似于知网的功能缩减版:文件的管理,在线预览,查重功能。其中还使用到pd……
<<上一篇
下一篇>>
文章目录
关闭
目 录