1. 程式人生 > >java使用Openoffice 轉存 office 檔案格式

java使用Openoffice 轉存 office 檔案格式

本機環境

win7 ,java8 ,openoffice.org4

使用apache開源的openoffice軟體, 將word,ppt,轉存為pdf

最近尋找將常用的word,ppt轉換成pdf,和將excel轉換成html的方案,看到一篇文章

Office線上預覽及PDF線上預覽的實現方式大集:
http://www.officeweb365.com/officetoview.html
嘗試過jacob, 但是跨平臺性太差勁 ,且換個機器還需要除錯, 甚是麻煩
於是決定採用 openoffice 方案

安裝openoffice.org

官網地址:

http://www.openoffice.org/download/index.html
下載完畢, 一直下一步即可 ,安裝完畢後 ,雙擊開啟執行openoffice程式,
然後進入到軟體家目錄 (C:\Program Files (x86)\OpenOffice 4\program)
開啟命令列,執行一下程式碼 ,開啟服務

soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard

執行完畢,可以看到工作管理員>程序>中出現了soffice.bin 和 soffice.exe ,至此,環境安裝和準備工作完成, 接下來就是寫程式碼了

pom依賴包

<!-- 兩個openoffice 依賴, 必須2.2.2支援07格式-->
        <dependency>
            <groupId>com.artofsolving</groupId>
            <artifactId>jodconverter</artifactId>
            <version>2.2.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.github.livesense/jodconverter-core -->
<dependency> <groupId>com.github.livesense</groupId> <artifactId>jodconverter-core</artifactId> <version>1.0.5</version> </dependency>

com.github.livesense ,使用這個包是可以省去在引入其他依賴包,省事 ,不一定必須非用這個, 但是jodconverter-2.2.2是必須的 ,只有2.2.2版本支援07以上的格式 ,需要去官網https://sourceforge.net/projects/jodconverter/files/下載 ,maven倉庫只有2.2.1的版本 ,下載完畢自行處理和引入

核心程式碼

// 核心程式碼很簡潔,無非就是: 連線 -> 轉存為其他格式 -> 斷開
OpenOfficeConnection connection = new SocketOpenOfficeConnection(HOST, PORT);
connection.connect();
DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
// 可以直接輸入檔名實現轉存 ,converter會自行判斷格式
  converter.convert("d://a.docx", "d://aaaaa.pdf");
 connection.disconnect();

封裝個工具類程式碼

import com.artofsolving.jodconverter.BasicDocumentFormatRegistry;
import com.artofsolving.jodconverter.DefaultDocumentFormatRegistry;
import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.DocumentFormat;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;
import com.sun.istack.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.validation.constraints.NotNull;
import java.io.File;
import java.net.ConnectException;

public class OpenOfficeUtil {
    private static final String HOST = "127.0.0.1";
    private static final int PORT = 8100;

/**
     * convert("原檔案路徑","docx", "目標檔案路徑", "pdf")
     *
     * @param sourceFile
     * @param sourceExtension
     * @param targetFile
     * @param targetExtension
     */
    public static boolean convert(@NotNull String sourceFile, @NotNull String sourceExtension, @NotNull String targetFile, @Nullable String targetExtension) {
        // 原始檔是否存在
        File inputFile = new File(sourceFile);
        if (!inputFile.exists()) {
            logger.error("原始檔不存在:{} " + sourceFile);
            return false;
        }
        if (!inputFile.canRead()) {
            logger.error("原始檔存在, 但是不可讀:{} " + sourceFile);
            return false;
        }
        // 輸出檔案的父目錄建立.
        File outputFile = new File(targetFile);
        File targetParentFolders = outputFile.getParentFile();
        if (!targetParentFolders.exists()) {
            //noinspection ResultOfMethodCallIgnored
            targetParentFolders.mkdirs();
        }

        // 連線, 轉換, 然後關閉
        OpenOfficeConnection connection = new SocketOpenOfficeConnection(HOST, PORT);
        try {
            if (!connection.isConnected()) {
                connection.connect();
            }
        } catch (ConnectException e) {
            e.printStackTrace();
            logger.error("嚴重錯誤: openoffice 服務連線失敗." + HOST + ":" + PORT);
            return false;
        }

        boolean isSuccess;
        try {
            //原始檔型別  @see document-formats.xml
            DefaultDocumentFormatRegistry ddfr = new DefaultDocumentFormatRegistry();

            DocumentFormat sourceDF = ddfr.getFormatByFileExtension(sourceExtension);
            DocumentFormat targetDF = ddfr.getFormatByFileExtension(targetExtension);

            DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
            converter.convert(inputFile, sourceDF, outputFile, targetDF);
            isSuccess = true;
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("嚴重錯誤: 檔案轉換失敗:{}" + e.getMessage());
            isSuccess = false;
        } finally {
            if (connection.isConnected()) {
                connection.disconnect();
            }
        }
        return isSuccess;
    }

    public static void main(String[] args) {

convert("d://a.docx", "docx", "d://aa.pdf", "pdf");
convert("d://a.pptx", "pptx", "d://aa.pdf", "pdf");
convert("d://a.xlsx", "xlsx", "d://aa.html", "html");//巨醜
}
}

完結

java程式碼部分寫的太多了, 其核心部分就幾句, 自行體會:

OpenOfficeConnection connection = new SocketOpenOfficeConnection(HOST, PORT);
connection.connect();
DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
            converter.convert("d://a.docx", "d://aaaaa.pdf");
 connection.disconnect();

其中 ,DefaultDocumentFormatRegistry 是為了應對檔案沒有後綴(例如d://a), 而指定檔案型別而做的操作 ,可以看看 OpenOfficeDocumentConverter 原始碼 ,裡面有多個過載的convert方法