当前位置: 首页 > 后端技术 > Java

如何用Java实现word、excel等文档的在线预览?

时间:2023-04-02 09:39:25 Java

java实现office文件的在线预览功能,是大家在工作中可能会遇到的一个需求。网上有些公司提供此类服务,但需要收费。如果你想免费,你可以使用openoffice。实现原理是:通过第三方工具openoffice将word、excel、ppt、txt等文件转换成pdf文件流;当然,如果安装了AdobeReaderXI,可以直接将pdf拖到浏览器页面打开预览,前提是浏览器支持pdf文件浏览。这里介绍下通过poi将word、excel、ppt转pdf,实现在浏览器上的预览。1、到官网下载ApacheOpenOffice安装包,安装运行。不同系统的安装方法可以自行百度,这里不再过多解释。2.在项目的pom文件中引入依赖com.artofsolvingjodconverter2.2.13。word、excel、ppt转pdf流的工具类代码connection.OpenOfficeConnection;导入com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;导入com.artofsolving.jodconverter.openoffice.converter.StreamOpenOfficeDocumentConverter;导入java.io.*;导入java.net.HttpURLConnection;导入java.net.URL;导入java.net.URLConnection;/***文件格式转换工具类**@authortarzan*@version1.0*@sinceJDK1.8*/publicclassFileConvertUtil{/**默认转换后的文件后缀*/privatestaticfinalStringDEFAULT_SUFFIX="pdf";/**openoffice_port*/privatestaticfinalIntegerOPENOFFICE_PORT=8100;/***方法说明将office文档转成PDF(处理本地文件)**@paramsourcePath源文件路径*@paramsuffix源文件后缀*@returnInputStream转换后文件输入流*@authortarzan*/publicstaticInputStreamconvertLocaleFile(StringsourcePath,Stringsuffix)抛出异常{FileinputFile=newFile(sourcePath);InputStreaminputStream=newFileInputStream(inputFile);returncoverCommonByStream;(inputStream)}/***方法说明将office文档转成PDF(处理网络文件)**@paramnetFileUrl网络文件路径*@paramsuffix文件后缀*@returnInputStream转换文件输入流*@authortarzan*/publicstaticInputStreamconvertNetFile(StringnetFileUrl,Stringsuffix)throwsException{//创建URLURLurl=newURL(netFileUrl);//尝试连接并获取返回状态码URLConnectionurlconn=url.openConnection();urlconn.connect();HTtpURLConnectionhttpconn=(HttpURLConnection)urlconn;inthttpResult=httpconn.getResponseCode();if(httpResult==HttpURLConnection.HTTP_OK){InputStreaminputStream=urlconn.getInputStream();返回coverCommonByStream(输入流,后缀);}returnnull***方法说明将文件以流的形式转换**@paraminputStream源文件输入流*@paramsuffix源文件后缀*@returnInputStream转换后的文件输入流*@authortarzan*/publicstaticInputStreamcovertCommonByStream(InputStreaminputStream,Stringsuffix)抛出异常{ByteArrayOutputStreamout=newByteArrayOutputStream();OpenOfficeConnection连接=newSocketOpenOfficeConnection(OPENOFFICE_PORT);连接.connect();DocumentConverter转换器=新的StreamOpenOfficeDocumentConverter(连接);DefaultDocumentFormatRegistryformatReg=newDefaultDocumentFormatRegistry();文档mentFormattargetFormat=formatReg.getFormatByFileExtension(DEFAULT_SUFFIX);DocumentFormatsourceFormat=formatReg.getFormatByFileExtension(suffix);converter.convert(inputStream,sourceFormat,out,targetFormat);connection.disconnect();返回输出流转换输入流(输出);}/***方法描述outputStream转inputStream**@authortarzan*/publicstaticByteArrayInputStreamoutputStreamConvertInputStream(finalOutputStreamout)throwsException{ByteArrayOutputStreambaos=(ByteArrayOutputStream)out;返回新的ByteArrayInputStream(baos.toByteArray());}publicstaticvoidmain(String[]args)throwsIOException{//convertNetFile("http://172.16.10.21/files/home/upload/department/base/201912090541573c6abdf2394d4ae3b7049dcee456d4f7.doc",".pdf");//convert("c:/Users/admin/Desktop/2.pdf","c:/Users/admin/Desktop/3.pdf");}}4.serve层在线预览方法代码/***@Description:系统文件在线预览界面*@Author:tarzan*/publicvoidonlinePreview(Stringurl,HttpServletResponseresponse)throwsException{//获取文件类型String[]str=SmartStringUtil.split(url,"\\.");if(str.length==0){thrownewException("文件格式不正确");}字符串后缀=str[str.length-1];如果(!suffix.equals("txt")&&!suffix.equals("doc")&&!suffix.equals("docx")&&!suffix.equals("xls")&&!suffix.equals("xlsx")&&!suffix.equals("ppt")&&!suffix.equals("pptx")){thrownewException("文件格式不支持预览");}InputStreamin=FileConvertUtil.convertNetFile(url,suffix);OutputStreamoutputStream=response.getOutputStream();//创建存储文件内容Arraybyte[]buff=newbyte[1024];//读取的内容使用n接收intn;//没有读取完,继续读取,循环while((n=in.read(buff))!=-1){//将字节数组的所有数据写入输出流outputStream.write(buff,0,n);}//强制输出缓冲区中的数据outputStream.flush();//关闭当前输出utStream.close();in.close();}5.controller层代码@ApiOperation(value="系统文件在线预览接口tarzan")@PostMapping("/api/file/onlinePreview")publicvoidonlinePreview(@RequestParam("url")字符串url,HttpServletResponse响应)抛出异常{fileService.onlinePreview(url,response);}