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
官網地址:
下載完畢, 一直下一步即可 ,安裝完畢後 ,雙擊開啟執行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方法