思路:瀏覽器無法直接打開word,excel唤反,ppt等文件,思路是通過openOffice先把文件轉(zhuǎn)成pdf保存在服務(wù)器上鸭津,再通過瀏覽器直接打開pdf從而實(shí)現(xiàn)預(yù)覽功能彤侍。
OpenOffice
OpenOffice.org 是一套跨平臺(tái)的辦公室軟件套件,能在 Windows逆趋、Linux盏阶、MacOS X (X11)、和 Solaris 等操作系統(tǒng)上執(zhí)行闻书。它與各個(gè)主要的辦公室軟件套件兼容名斟。OpenOffice.org 是自由軟件,任何人都可以免費(fèi)下載魄眉、使用砰盐、及推廣它。
下載地址
JodConverter
jodconverter-2.2.2.zip 下載地址:
http://sourceforge.net/projects/jodconverter/files/JODConverter/
下載openOffce軟件坑律,安裝相應(yīng)系統(tǒng)版本岩梳,這里以windows為例
所需jar包:
或者maven地址下載
<dependency>
<groupId>com.artofsolving</groupId>
<artifactId>jodconverter</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.artofsolving.jodconverter</groupId>
<artifactId>jodconverter-core</artifactId>
<version>3.0-beta-4-jahia2</version>
</dependency>
上面的第二個(gè)jar包可能有些資源庫沒有,可以先去maven官網(wǎng)下載下來之后安裝到本地maven庫就行了晃择。
新建實(shí)體類PDFDemo
import java.io.File;
import java.net.ConnectException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.artofsolving.jodconverter.OfficeDocumentConverter;
import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration;
import org.artofsolving.jodconverter.office.OfficeManager;
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.StreamOpenOfficeDocumentConverter;
public class PDFDemo {
public static boolean officeToPDF(String sourceFile, String destFile) {
try {
File inputFile = new File(sourceFile);
if (!inputFile.exists()) {
// 找不到源文件, 則返回false
return false;
}
// 如果目標(biāo)路徑不存在, 則新建該路徑
File outputFile = new File(destFile);
if (!outputFile.getParentFile().exists()) {
outputFile.getParentFile().mkdirs();
}
//如果目標(biāo)文件存在冀值,則刪除
if (outputFile.exists()) {
outputFile.delete();
}
// DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
DefaultOfficeManagerConfiguration config = new DefaultOfficeManagerConfiguration();
// OpenOffice安裝在本地環(huán)境的目錄
String officeHome = "D:\\profiles\\openOfice4";
config.setOfficeHome(officeHome);
config.setPortNumber(8100);
config.setTaskExecutionTimeout(1000 * 60 * 5);// 設(shè)置任務(wù)執(zhí)行超時(shí)為5分鐘
config.setTaskQueueTimeout(1000 * 60 * 60 * 24);// 設(shè)置任務(wù)隊(duì)列超時(shí)為24小時(shí)
OfficeManager officeManager = config.buildOfficeManager();
officeManager.start();
OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager);
if (inputFile.exists()) {
// 進(jìn)行PDF格式的轉(zhuǎn)換
converter.convert(inputFile, outputFile);
}
officeManager.stop();
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
public static void main(String[] args) {
boolean flag = officeToPDF("D:\\testE.xls", "D:\\test3.pdf");
System.out.println(flag);
}
}
上面officceToPDF方法的第一個(gè)參數(shù)是原文件路徑,第二個(gè)參數(shù)是輸出文件路徑宫屠,后綴名改成html就轉(zhuǎn)成html,后綴名是pdf就轉(zhuǎn)成pdf
上面的方法比較浪費(fèi)性能 每次都要打開關(guān)閉列疗,可以在服務(wù)器端開啟soffice服務(wù)的方式直接調(diào)用連接會(huì)比較可行;
去到安裝目錄的program文件夾 cmd打開,運(yùn)行
soffice -headless -accept="socket,host=127.0.0.1,
port=8100;urp;"-nofirststartwizard
D:\profiles\openOfice4\program>soffice -headless -accept="socket,host=127.0.0.1,
port=8100;urp;"-nofirststartwizard
可以上圖看到進(jìn)程已開啟
以下代碼可調(diào)用
public static boolean officeToPDF(String sourceFilePath, String destFilePath) {
boolean flag = false;
//try {
File inputFile = new File(sourceFilePath);
if (!inputFile.exists()) {
// 找不到源文件, 則返回false
return flag;
}
// 如果目標(biāo)路徑不存在, 則新建該路徑
File outputFile = new File(destFilePath);
if (!outputFile.getParentFile().exists()) {
outputFile.getParentFile().mkdirs();
}
// 如果目標(biāo)文件存在激况,則刪除
if (outputFile.exists()) {
outputFile.delete();
}
// DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
try {
OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
connection.connect();
DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
if (inputFile.exists()) {
// 進(jìn)行PDF格式的轉(zhuǎn)換
converter.convert(inputFile, outputFile);
}
connection.disconnect();
flag = true;
} catch (Exception e) {
flag = false;
e.printStackTrace();
}
return flag;
}