标签:
文档在线预览在项目中早就完成了,后来又经过了一次优化。但是一直都没时间去记录遇到的问题,文档在线预览的详细步骤可以参考http://blog.csdn.net/u013614451/article/details/24261503,感谢博主写了这么好的文章帮助我完成了项目中主要的模块。下面是文档转换的工具类DocConvert.java,并标注出我修改的部分。
package com.he.util;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.UUID;
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;
/**
* doc docx格式转换
*/
public class DocConverter {
private static final int environment = 1;// 环境 1:windows 2:linux
private String fileString;// (只涉及pdf2swf路径问题)
private String outputPath = "";// 输入路径 ,如果不设置就输出在默认的位置
private String fileName;
private File pdfFile;
private File swfFile;
private File docFile;
private String tempName;
private String extName ;
public DocConverter(String fileString,String outputPath) {
ini(fileString,outputPath);
}
/**
* 重新设置file
*
* @param fileString
*/
public void setFile(String fileString,String outputPath) {
ini(fileString,outputPath);
}
/**
* 初始化
*
* @param fileString
*/
private void ini(String fileString,String outputPath) {
this.fileString = fileString;
fileName=fileString.substring(0,fileString.lastIndexOf(".")); //获取文件路径
//转换后的文件名以要转换文件名的hash值命名
this.extName = fileString.substring(fileString.lastIndexOf(".")); //获取后缀名
//如果文件是txt的,则先对其编码成utf-8格式,
if(".txt".equalsIgnoreCase(extName)){
docFile = new File(copyFile2(fileString, outputPath+"/"+tempName+".txt"));
}else{
docFile = new File(fileString);
}
if(".pdf".equals(extName)){
pdfFile = new File(fileName+".pdf");
}else{
pdfFile = new File(outputPath+"/"+tempName + ".pdf");
}
swfFile = new File(outputPath+"/"+tempName + ".swf");
}
/**
* 转为PDF
*
* @param file
*/
private void doc2pdf() throws Exception {
if (docFile.exists()) {
if (!pdfFile.exists()) {
OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
try {
connection.connect();
DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
converter.convert(docFile, pdfFile);
// close the connection
connection.disconnect();
//如果文件是txt文件,将复制后的文件删除
if(".txt".equalsIgnoreCase(extName)){
if(docFile.exists()){
docFile.delete();
}
}
System.out.println("****pdf转换成功,PDF输出:" + pdfFile.getPath()+ "****");
} catch (java.net.ConnectException e) {
e.printStackTrace();
System.out.println("****swf转换器异常,openoffice服务未启动!****");
throw e;
} catch (com.artofsolving.jodconverter.openoffice.connection.OpenOfficeException e) {
e.printStackTrace();
System.out.println("****swf转换器异常,读取转换文件失败****");
throw e;
} catch (Exception e) {
e.printStackTrace();
throw e;
}
} else {
System.out.println("****已经转换为pdf,不需要再进行转化****");
}
} else {
System.out.println("****swf转换器异常,需要转换的文档不存在,无法转换****");
}
}
/**
* 转换成 swf
*/
@SuppressWarnings("unused")
private void pdf2swf() throws Exception {
if (pdfFile.exists()) {
Runtime r = Runtime.getRuntime();
if (!swfFile.exists()) {
if (environment == 1) {// windows环境处理
try {
Process p = r.exec("D:/SWFTools/pdf2swf.exe "+ pdfFile.getPath() + " -o "+ swfFile.getPath() + " -T 9");
System.out.print(loadStream(p.getInputStream()));
System.err.print(loadStream(p.getErrorStream()));
System.out.print(loadStream(p.getInputStream()));
System.err.println("****swf转换成功,文件输出:"
+ swfFile.getPath() + "****");
} catch (IOException e) {
e.printStackTrace();
throw e;
}
} else if (environment == 2) {// linux环境处理
try {
Process p = r.exec("pdf2swf " + pdfFile.getPath()
+ " -o " + swfFile.getPath() + " -T 9");
System.out.print(loadStream(p.getInputStream()));
System.err.print(loadStream(p.getErrorStream()));
System.err.println("****swf转换成功,文件输出:"
+ swfFile.getPath() + "****");
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
//文件不是pdf文档,并且文件存在才将pdf文件删除
if (!".pdf".equalsIgnoreCase(extName) && pdfFile.exists()) {
pdfFile.delete();
}
} else {
System.out.println("****pdf不存在,无法转换****");
}
} else {
System.out.println("****swf已经存在不需要转换****");
}
}
/**
* 把txt文件按照其原来的编码读出来,然后再以utf-8的编码写到一个新的txt文件中去,将utf-8文件转换成pdf,就不会乱码
* @param sourceFile 要读取的文件
* @param targetFile 目标文件
* @return
*/
@SuppressWarnings("unused")
private String copyFile2(String sourceFile,String targetFile){
//获取txt原始编码
String charSet = EncodingDetect.getJavaEncode(sourceFile);
return EncodingDetect.readFile(sourceFile, charSet, targetFile);
}
static String loadStream(InputStream in) throws IOException {
int ptr = 0;
in = new BufferedInputStream(in);
StringBuffer buffer = new StringBuffer();
while ((ptr = in.read()) != -1) {
buffer.append((char) ptr);
}
return buffer.toString();
}
/**
* 转换主方法
*/
@SuppressWarnings("unused")
public boolean conver() {
if (swfFile.exists()) {
System.out.println("****swf转换器开始工作,该文件已经转换为swf****");
return true;
}
if (environment == 1) {
System.out.println("****swf转换器开始工作,当前设置运行环境windows****");
} else {
System.out.println("****swf转换器开始工作,当前设置运行环境linux****");
}
try {
//如果文件本身就是pdf文件,就不需要经过OpenOffice转换
if(".pdf".equalsIgnoreCase(extName)){
pdf2swf();
}else{
doc2pdf();
pdf2swf();
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
if (swfFile.exists()) {
return true;
} else {
return false;
}
}
/**
* 返回文件路径
*
* @param s
*/
public String getswfPath() {
if (swfFile.exists()) {
String tempString = swfFile.getPath();
tempString = tempString.replaceAll("\\\\", "/");
return tempString;
} else {
return "";
}
}
/**
* 设置输出路径
*/
public void setOutputPath(String outputPath) {
this.outputPath = outputPath;
if (!outputPath.equals("")) {
String realName = fileName.substring(fileName.lastIndexOf("/"),
fileName.lastIndexOf("."));
if (outputPath.charAt(outputPath.length()) == ‘/‘) {
swfFile = new File(outputPath + realName + ".swf");
} else {
swfFile = new File(outputPath + realName + ".swf");
}
}
}
public static void main(String[] args) {
DocConverter d = new DocConverter("D:/swf/abc.pdf","D:/swf");
d.conver();
}
}
这个问题我开始是将要转换成的SWF文件以UUID命名,后来发现每次预览文件都得转换,很影响效率,同时也会使项目中转换的swf文件越来越多,浪费空间。最后想到每个文件夹中不会出现相同的文件名(包括后缀名),那就可以用文件名的hash值作为转换后SWF文件的文件名,这样就解决了中文名问题和文件只需要转换一次就能多次预览。具体代码实现是红色标记部分。
原文中并没有考虑这种情况,但是项目中大多数文件都是PDF格式的。PDF文档不需要经过OpenOffice转换,可以直接转换成SWF格式,而且原文中将PDF格式转换成SWF格式后就把PDF文件删除,所以我们先要判断文件的格式再删文件,这个问题的具体解决代码可以看灰色部分的标记和注解
这个问题原文中有解答,EncodingDetect类也可以在原文中下载。具体代码可以看黄色部分标记。
Java实现文档在线预览(openoffice+swfTools+FlexPaper)
标签:
原文地址:http://www.cnblogs.com/duoluomengxing/p/4909974.html