使用openOffice实现word、excel等转pdf功能

最近在公司项目中需要实现Excel转pdf的功能,一开始我自己写了工具类来实现转换,实现方式是将目标文件读流,再读出每个sheet,再将sheet数组一个个遍历取当页的数据,读数据的时候又需要每行每行的遍历,再将每个sheet拼接起来成为一个pdf。

本来自己想着简单,确实也实现了功能,但是还是存在很多小问题自己无法控制,比如说对excel的页面布局格式之类的需要严格控制调整,这样弄得很烦,所以想着另找出路。这时候想到了Appache的openOffice。
openOffice其实是一个服务,可以安装在windows、mac和linux下,用命令启动后,程序调用该端口,就能调用本机安装的office软件或者wps软件进行转格式,原理就是这样的。
接下来我们来看下怎么使用。


一.下载安装

这是一个开源程序,下载地址是:
https://www.openoffice.org/download/
进入下载页面,多个系统程序包可以选择,如图下:
20180916103231_367.png
这里介绍windows系统和linux系统的安装,因为开发环境西药先测试,然后是要部署至生产环境的,因为公司生产环境用的是redhat红帽系统,所以会针对性的介绍下。

windows
windows安装其实很简单,就是一步步点下一步就好了,安装完成后,我们需要记住相应的启动命令来启动程序。如下图:
打开cmd进入openoffice安装目录:
20180916103716_95.png
在program文件夹下输入启动命令,soffice.exe -headless -accept="socket,host=127.0.0.1,port=8100;urp;,然后回车就启动了
20180916103856_647.png

linux
linux下安装会复杂一点,这里以redhat为例,我们先下载对应的安装包,红帽系统需要选择rpm格式的,我们下载64位的,如下图:
20180916104119_512.png
然后安装过程如下:

一、安装openOffice
1.使用tar -xzvf xxxx.tar.gz解压缩后,会得到对应的解压文件 /zh-CN

目录。
2.进入/zh-CN//RPMS/目录
3.执行 rpm –ivh *rpm(安装所有rpm文件)
4.进入到desktop-integration目录 cd desktop-integration
5.执行 rpm -ivh openoffice.org3.2-redhat-menus-3.2-9472.noarch.rpm

这时openOffice己经安装完成,默认会安装在/opt下

二、启动openOffice服务 
1.进入opt目录:cd /opt
2.进入openoffice.org3目录: cd openoffice.org3
3.进入cd program目录
4.执行 soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard & 

三、停止openOffice服务

ps -aux | grep oppenoffice 查看是否openoffice服务是否已启动;

至此,openOffice的安装我们已经搞定了,接下来就是程序的编写了

二.转换程序编写

首先我们需要在项目里导入相应的jar包,所需jar包如下:

jodconverter-2.2.2.jar
ridl-3.2.1.jar
org.apache.commons.io.jar
juh.jar
jurt.jar
unoil.jar
slf4j-api-1.7.13.jar
slf4j-jdk14-1.7.13.jar
xstream-1.4.1.jar

转换的java方法我这边直接拿项目里用到的方法来讲,其实也很简单

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.ConnectException;

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;

public class Converter {
     /** 
     * 将Office文档转换为PDF. 运行该函数需要用到OpenOffice, OpenOffice下载地址为 
     * http://www.openoffice.org/ 
     *  
     * <pre> 
     * 方法示例: 
     * String sourcePath = "F:\\office\\source.doc"; 
     * String destFile = "F:\\pdf\\dest.pdf"; 
     * Converter.office2PDF(sourcePath, destFile); 
     * </pre> 
     *  
     * @param sourceFile 
     *            源文件, 绝对路径. 可以是Office2003-2007全部格式的文档, Office2010的没测试. 包括.doc, 
     *            .docx, .xls, .xlsx, .ppt, .pptx等. 示例: F:\\office\\source.doc 
     * @param destFile 
     *            目标文件. 绝对路径. 示例: F:\\pdf\\dest.pdf 
     * @return 操作成功与否的提示信息. 如果返回 -1, 表示找不到源文件, 或url.properties配置错误; 如果返回 0, 
     *         则表示操作成功; 返回1, 则表示转换失败 
     */  
    public static int office2PDF(String sourceFile, String destFile) {  
        try {  
            File inputFile = new File(sourceFile);  
            if (!inputFile.exists()) {  
                return -1;// 找不到源文件, 则返回-1  
            }  
  
            // 如果目标路径不存在, 则新建该路径  
            File outputFile = new File(destFile);  
         
            //String OpenOffice_HOME = "D:\\Program Files\\OpenOffice.org 4";//这里是OpenOffice的安装目录, 在我的项目中,为了便于拓展接口,没有直接写成这个样子,但是这样是绝对没问题的  
            String OpenOffice_HOME = "C:\\Program Files (x86)\\OpenOffice 4";
            // 如果从文件中读取的URL地址最后一个字符不是 '\',则添加'\'  
            if (OpenOffice_HOME.charAt(OpenOffice_HOME.length() - 1) != '\\') {  
                OpenOffice_HOME += "\\";  
            }  
            // 启动OpenOffice的服务  
            String command = OpenOffice_HOME  
                    + "program\\soffice.exe -headless -accept=\"socket,host=127.0.0.1,port=8100;urp;\"";
            //注意:linux系统的服务是已经启动好的,不需要另启动服务,下面这句本地需要,服务器不需要
            Process pro = Runtime.getRuntime().exec(command);  
            // connect to an OpenOffice.org instance running on port 8100  
            OpenOfficeConnection connection = new SocketOpenOfficeConnection(  
                    "127.0.0.1", 8100);  
            connection.connect();  
  
            // convert  
            DocumentConverter converter = new OpenOfficeDocumentConverter(  
                    connection);  
            converter.convert(inputFile, outputFile);  
  
            // close the connection  
            connection.disconnect();  
            //注意:关闭OpenOffice服务的进程 ,下面这句本地需要,服务器不需要
            pro.destroy();  
  
            return 0;  
        } catch (ConnectException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
  
        return 1;  
    }
}

这里很好理解,就是拿到文件,连接openOffice服务,调用转换方法。

其实开发和部署还是很顺利的,需要注意的是jar包不能少,不然会报错在服务器上。

Last modification:November 26th, 2019 at 10:52 am
如果觉得我的文章对你有用,请随意赞赏

Leave a Comment