在工作中用到这功能,找了好多方法,都出现不同的问题,故整合下,随意看看。
转载:点击打开链接
拿出一个例子。。
1.下载安装openoffice:点击打开链接
2.openoffice启动服务两种:
1.在安装目录下的program文件夹中:D:\installs\OpenOffice 4\program按住shift并右击,打开命令窗口:
soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard
缺点就是长期打开服务,占用资源
2.java代码中调用,调用结束服务就关闭(我采用的就是这种方式)
详见代码
3.jar包:Jodconverter 2.2.2 我放在了百度云盘上了:http://pan.baidu.com/s/1o8eTV3G
其中Jodconverter 2.2.2,在maven库上只有2.2.1,到不支持docx等07版文件格式,所以要自己导入2.2.2;其他都能在maven公共库上依赖到
代码如下:
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
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;
import com.beyondsoft.hz.bysworkprd.common.util.ErrorCodeConstants;
/**
*
* @author Administrator
* @version $Id: FileConverter.java, v 0.1 2016年4月14日 上午10:52:54 Administrator Exp $
*/
public class FileConverter {
private static final String FILEURL = "E:/workspace/bkprd_20160315/bprd/webapp/src/main/webapp";
private String fileString; //需要预览的目标文件地址
private String outputPath = "";// 输入路径,如果不设置就输出在默认位置
private String fileName;
private File pdfFile;
private File docFile;
static String loadStream(InputStream in) throws IOException {
int ptr = 0;
//把InputStream字节流 替换为BufferedReader字符流 2013-07-17修改
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder buffer = new StringBuilder();
while ((ptr = reader.read()) != -1) {
buffer.append((char) ptr);
}
return buffer.toString();
}
public FileConverter(String fileString) {
ini(fileString);
}
/*初始化
@param fileString
*/
private void ini(String fileurl) {
//拼接文件地址
this.fileString = FileConverter.FILEURL + fileurl;
//截取文件名(去掉点以后的文件后缀)
fileName = fileString.substring(0, fileString.lastIndexOf("."));
// System.out.println("截取文件名[fileName]:" + fileName);
docFile = new File(fileString);
pdfFile = new File(fileName + ".pdf");
}
/*转换主方法
* true:转换完成
* false:
*/
public String conver() {
if (fileString.endsWith(".pdf")) {
return ErrorCodeConstants.PDF_EXIST;
}
String rsult = file2pdf();
return rsult;
}
/*转为PDF
@param file
*/
private String file2pdf() {
/**
* 检测目标文件是否存在
* exists:true:存在 false:不存在
*/
if (!docFile.exists()) {
// System.out.println("****doc2pdf()-swf转换器异常,需要转换的文档不存在,无法转换****");
return ErrorCodeConstants.NO_AIM_FILE;
}
/**
* pdf文档已存在
*/
if (pdfFile.exists()) {
return ErrorCodeConstants.PDF_EXIST;
}
/**********************自动启动服务************************/
try {
//OpenOffice的安装目录
String OpenOffice_HOME = "D:\\installs\\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;\"";
// System.out.println("-------服务开始启动-----------");
Process pro = Runtime.getRuntime().exec(command);
OpenOfficeConnection connection = new SocketOpenOfficeConnection("127.0.0.1", 8100);
connection.connect();
DocumentConverter converter = new StreamOpenOfficeDocumentConverter(connection);
// System.out.println("-------服务已启动-----------");
converter.convert(docFile, pdfFile);
// close the connection
connection.disconnect();
// 关闭OpenOffice服务的进程
pro.destroy();
// System.out.println("-------服务已停止-----------");
// System.out.println("****doc2pdf()-pdf转换成功,PDF输出:" + pdfFile.getPath() + "****");
} catch (java.net.ConnectException e) {
return ErrorCodeConstants.SERVER_ERROR;
// System.out.println("****doc2pdf()-swf转换异常,openoffice服务未启动!****");
} catch (com.artofsolving.jodconverter.openoffice.connection.OpenOfficeException e) {
return ErrorCodeConstants.LOAD_FILE_FAIL;
// System.out.println("****doc2pdf()-swf转换器异常,读取转换文件失败****");
} catch (Exception e) {
return ErrorCodeConstants.UNKNOWN_ERROR;
}
return ErrorCodeConstants.SUCCESS;
}
}