openoffice+jquery.media.js实现文档在线预览
Posted wentaokyle
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了openoffice+jquery.media.js实现文档在线预览相关的知识,希望对你有一定的参考价值。
1.功能:
实现Windows环境与Linux环境下文档在线预览功能,支持.doc、.docx、.xls、.xlsx、.ppt、.pptx、.pdf格式的文档,对IE浏览器不太兼容。如要实现Linux环境下文档在线预览功能,改变相应配置和代码,要安装Linux版的OpenOffice。
2.所需组件:
(1)OpenOffice4.0.1 :
下载地址:http://pan.baidu.com/s/1hsQkhzm
(2)jquery.media.js:
下载地址:http://pan.baidu.com/s/1c2vQcCS
(3)所需jar:
下载地址:http://pan.baidu.com/s/1micCZBa
3.具体实现:
(1)设置OpenOffice的配置文件openOfficeService.properties
OO_HOME = G:/java_app_common/OpenOffice4/program/
oo_host = 127.0.0.1
oo_port =8100
(2)jsp页面
1 <script type="text/javascript" src="/js/jquery.media.js"></script> 2 <script language="javascript"> 3 //设置预览框的大小 4 $(function() { 5 $("#media").media({width:1000, height:950}); 6 }); 7 </script> 8 <body> 9 <div> 10 <a class="media" id="media" href="生成的pdf文件的路径"></a> 11 </div> 12 </body>
(3)java代码
DocConverter.java转换类
2 3 import java.io.BufferedInputStream; 4 import java.io.BufferedOutputStream; 5 import java.io.BufferedReader; 6 import java.io.File; 7 import java.io.FileInputStream; 8 import java.io.FileOutputStream; 9 import java.io.IOException; 10 import java.io.InputStream; 11 import java.io.InputStreamReader; 12 import java.util.ResourceBundle; 13 14 import com.artofsolving.jodconverter.DocumentConverter; 15 import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection; 16 import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection; 17 import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter; 18 19 public class DocConverter { 20 21 private String SWFTools_Windows = "G:/java_app_common/SWFTools/pdf2swf.exe "; 22 // private String SWFTools_Linux = "F:/sortware/testingsoftware/SWFTools/pdf2swf.exe "; 23 private static final int environment = 1;// 环境1:windows,2:linux(涉及pdf2swf路径问题) 24 private String fileString; 25 private String outputPath = "";// 输入路径,如果不设置就输出在默认位置 26 private String fileName; 27 private File pdfFile; 28 private File swfFile; 29 private File docFile; 30 private File odtFile; 31 32 33 public DocConverter(String fileString) { 34 ini(fileString); 35 } 36 37 /* 38 * 重新设置 file @param fileString 39 */ 40 public void setFile(String fileString) { 41 ini(fileString); 42 } 43 44 /* 45 * 初始化 @param fileString 46 */ 47 private void ini(String fileString) { 48 try { 49 System.out.println("fileString: " + fileString); 50 this.fileString = fileString; 51 52 fileName = fileString.substring(0, fileString.lastIndexOf("/")); 53 docFile = new File(fileString); 54 String s = fileString.substring(fileString.lastIndexOf("/") + 1,fileString.lastIndexOf(".")); 55 fileName = fileName + "/" + s; 56 // 用于处理TXT文档转化为PDF格式乱码,获取上传文件的名称(不需要后面的格式) 57 String txtName = fileString.substring(fileString.lastIndexOf(".")); 58 // 判断上传的文件是否是TXT文件 59 if (txtName.equalsIgnoreCase(".txt")) { 60 // 定义相应的ODT格式文件名称 61 odtFile = new File(fileName + ".odt"); 62 // 将上传的文档重新copy一份,并且修改为ODT格式,然后有ODT格式转化为PDF格式 63 this.copyFile(docFile, odtFile); 64 pdfFile = new File(fileName + ".pdf"); // 用于处理PDF文档 65 } else if (txtName.equals(".pdf") || txtName.equals(".PDF")) { 66 pdfFile = new File(fileName + ".bac.pdf"); 67 this.copyFile(docFile, pdfFile); 68 } else { 69 pdfFile = new File(fileName + ".pdf"); 70 //this.copyFile(docFile, pdfFile); 71 System.out.println("pdfFile: " + pdfFile.getPath()); 72 } 73 swfFile = new File(fileName + ".swf"); 74 } catch (Exception e) { 75 e.printStackTrace(); 76 } 77 } 78 79 /** 80 * @Title: copyFile 81 * @Description: TODO 82 * @param: @param docFile2 83 * @param: @param odtFile2 84 * @return: void 85 * @author: hl 87 * @throws 88 */ 89 private void copyFile(File sourceFile,File targetFile)throws Exception{ 90 //新建文件输入流并对它进行缓冲 91 FileInputStream input = new FileInputStream(sourceFile); 92 BufferedInputStream inBuff = new BufferedInputStream(input); 93 // 新建文件输出流并对它进行缓冲 94 FileOutputStream output = new FileOutputStream(targetFile); 95 BufferedOutputStream outBuff = new BufferedOutputStream(output); 96 // 缓冲数组 97 byte[]b = new byte[1024 * 1]; 98 int len; 99 while((len = inBuff.read(b)) != -1){ 100 outBuff.write(b,0,len); 101 } 102 // 刷新此缓冲的输出流 103 outBuff.flush(); 104 // 关闭流 105 inBuff.close(); 106 outBuff.close(); 107 output.close(); 108 input.close(); 109 } 110 111 /* 112 * 转为PDF @param file 113 */ 114 private void doc2pdf() throws Exception { 115 System.out.println("此文件是否存在:" + docFile.exists()); 116 if (docFile.exists()) { 117 if (!pdfFile.exists()) { 118 OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100); 119 ResourceBundle rb = ResourceBundle.getBundle("openOfficeService"); 120 String OpenOffice_HOME = rb.getString("OO_HOME"); 121 String host_Str = rb.getString("oo_host"); 122 String port_Str = rb.getString("oo_port"); 123 try { 124 // 自动启动OpenOffice的服务 soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard 125 String command = OpenOffice_HOME 126 + "soffice -headless -accept=\\"socket,host=" 127 + host_Str + ",port=" + port_Str + ";urp;\\"" + "-nofirststartwizard"; 128 System.out.println("###\\n" + command); 129 Process pro = Runtime.getRuntime().exec(command); 130 // 连接openoffice服务 131 // OpenOfficeConnection connection = new SocketOpenOfficeConnection( 132 // host_Str, Integer.parseInt(port_Str)); 133 connection.connect(); 134 DocumentConverter converter = new OpenOfficeDocumentConverter(connection); 135 converter.convert(docFile, pdfFile); 136 // close the connection 137 connection.disconnect(); 138 pro.destroy(); 139 System.out.println("****pdf转换成功,PDF输出:" + pdfFile.getPath() + "****"); 140 } catch (java.net.ConnectException e) { 141 // ToDo Auto-generated catch block 142 e.printStackTrace(); 143 System.out.println("****swf转换异常,openoffice服务未启动!****"); 144 doc2pdf(); 145 throw e; 146 } catch (com.artofsolving.jodconverter.openoffice.connection.OpenOfficeException e) { 147 e.printStackTrace(); 148 System.out.println("****swf转换器异常,读取转换文件失败****"); 149 doc2pdf(); 150 throw e; 151 } catch (Exception e) { 152 e.printStackTrace(); 153 doc2pdf(); 154 throw e; 155 } 156 } else { 157 System.out.println("****已经转换为pdf,不需要再进行转化****"); 158 } 159 } else { 160 System.out.println("****swf转换器异常,需要转换的文档不存在,无法转换****"); 161 } 162 } 163 164 /* 165 * 转换成swf,此方法未用到 166 */ 167 @SuppressWarnings("unused") 168 private void pdf2swf() throws Exception { 169 Runtime r = Runtime.getRuntime(); 170 if (!swfFile.exists()) { 171 if (pdfFile.exists()) { 172 if (environment == 1){// windows环境处理 173 try { 174 // 这里根据SWFTools安装路径需要进行相应更改 175 Process p = r.exec(SWFTools_Windows + pdfFile.getPath() + " -o " + swfFile.getPath() + " -T 9"); 176 //Process p = r.exec(SWFTools_Windows + pdfFile.getPath() + " -s languageedir=G:/java_app_common/xpdf/xpdf-chinese-simplified " + " -o " + swfFile.getPath() + " -T 9"); 177 178 System.out.print(loadStream(p.getInputStream())); 179 System.err.print(loadStream(p.getErrorStream())); 180 System.out.print(loadStream(p.getInputStream())); 181 System.err.println("****swf转换成功,文件输出:" + swfFile.getPath() + "****"); 182 // if (pdfFile.exists()) { 183 // pdfFile.delete(); 184 // } 185 } catch (Exception e) { 186 // e.printStackTrace(); 187 System.out.println("找到你了"); 188 throw e; 189 } 190 } else if (environment == 2){// linux环境处理 191 try { 192 Process p = r.exec("pdf2swf " + pdfFile.getPath() + " -o " + swfFile.getPath() + " -T 9"); 193 System.out.print(loadStream(p.getInputStream())); 194 System.err.print(loadStream(p.getErrorStream())); 195 System.err.println("****swf转换成功,文件输出:" + swfFile.getPath() + "****"); 196 if (pdfFile.exists()) { 197 pdfFile.delete(); 198 } 199 } catch (Exception e) { 200 e.printStackTrace(); 201 throw new RuntimeException(); 202 } 203 } 204 } else { 205 System.out.println("****pdf不存在,无法转换****"); 206 } 207 } else { 208 System.out.println("****swf已存在不需要转换****"); 209 } 210 } 211 212 static String loadStream(InputStream in) throws IOException { 213 int ptr = 0; 214 //把InputStream字节流 替换为BufferedReader字符流 2013-07-17修改 215 BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 216 StringBuilder buffer = new StringBuilder(); 217 while ((ptr = reader.read()) != -1) { 218 buffer.append((char) ptr); 219 } 220 return buffer.toString(); 221 } 222 223 /* 224 * 转换主方法 225 */ 226 public boolean conver() { 227 // if (swfFile.exists()) { 228 // System.out.println("****swf转换器开始工作,该文件已经转换为swf****"); 229 // return true; 230 // } 231 232 if (environment == 1) { 233 System.out.println("****swf转换器开始工作,当前设置运行环境windows****"); 234 } else { 235 System.out.println("****swf转换器开始工作,当前设置运行环境linux****"); 236 } 237 238 try { 239 doc2pdf(); 240 //pdf2swf();//以前找的资料是要把PDF转换为swf格式的文件再用flexpaper预览,此种方法问题较多,所以没用,改变为只转换成pdf,然后用jquery.media.js直接预览pdf 241 return true; 242 } catch (Exception e) { 243 // TODO: Auto-generated catch block 244 e.printStackTrace(); 245 return false; 246 } 247 248 // if (swfFile.exists()) { 249 // return true; 250 // } else { 251 // return false; 252 // } 253 } 254 255 /* 256 * 返回文件路径 @param s 257 */ 258 public String getswfPath() { 259 if (swfFile.exists()) { 260 String tempString = swfFile.getPath(); 261 tempString = tempString.replaceAll("\\\\\\\\", "/"); 262 System.out.println(tempString); 263 264 return tempString; 265 } else { 266 return ""; 267 } 268 } 269 270 /* 271 * 设置输出路径 272 */ 273 public void setOutputPath(String outputPath) { 274 this.outputPath = outputPath; 275 if (!outputPath.equals("")) { 276 String realName = fileName.substring(fileName.lastIndexOf("/"), fileName.lastIndexOf(".")); 277 if (outputPath.charAt(outputPath.length()) == \'/\') { 278 swfFile = new File(outputPath + realName + ".swf"); 279 } else { 280 swfFile = new File(outputPath + realName + ".swf"); 281 } 282 } 283 } 284 285 public static void main(String s[]) { 286 DocConverter d = new DocConverter("G:/java_app_common/Tomcat/apache-tomcat-6.0.45/webapps/project_data/vc_space_file/1497492316364495484.docx"); 287 d.conver(); 288 } 289 }
部分controller代码:
1 //判断文件是否为PDF格式,如是pdf格式直接预览,如不是pdf格式转换成pdf格式再预览 2 if(fileName.substring(fileName.lastIndexOf(".")).equals(".pdf") || fileName.substring(fileName.lastIndexOf(".")).equals(".PDF")) 3 { 4 //直接把此文件的路径传到jsp页面 5 }else 6 { 7 //调用转换类DocConverter,并将需要转换的文件传递给该类的构造方法 8 DocConverter d = new DocConverter(文件路径); 9 //调用conver方法开始转换,执行doc2pdf()将office文件转换为pdf 10 System.out.println("调用conver方法开始转换..."); 11 d.conver(); 12 //将转换后的pdf格式的文件的路径传到jsp页面 13 }
4.在linux中配置openoffice
linux版本的openoffice:http://pan.baidu.com/s/1slK3WK1
(1)安装openoffice,网上安装教程很多,这里不再多说。
(2)修改配置文件openOfficeService.properties中 OO_HOME的路径。
(3)进入openoffice的安装目录:
cd /opt/openoffice4/program
执行命令启动openoffice:./soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &
(4)处理中文转PDF乱码问题:
1)在linux中的 /usr/share/fonts目录下新建一个fallback文件夹,将Windows中的字体全部拷贝到fallback中。
Windows中的字体在C:\\Windows\\Fonts目录下。
然后执行命令:
mkfontscale
mkfontdir
fc-cache
2)关闭openoffice,重新启动openoffice:
关闭openoffice的所有相关的进程: ps -ef|grep soffice.bin|grep -v grep|cut -c 9-15|xargs kill -9
查看8100端口是否启用:netstat -pln
如未看到8100端口的信息,说明已成功关闭openoffice。
执行命令启动openoffice:./soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &
查看8100端口是否启用:netstat -pln
如看到8100端口的信息,说明已成功启动openoffice。
3)如按上述操作执行后还有乱码,解决方法如下:
找到linux中jdk的安装位置,进入jdk中的jre中的lib下的fonts文件夹,如:cd /data/jdk1.6.2_27/jre/lib/fonts,执行上述(4)中1)的操作。
找到openoffice的安装目录,进入openoffice4/share/fonts/truetype目录,执行上述(4)中1)的操作。
再执行(4)中2)的操作。
以上是关于openoffice+jquery.media.js实现文档在线预览的主要内容,如果未能解决你的问题,请参考以下文章
OpenOffice Basic 宏与 openoffice API