首页>>后端>>java->如何用Java实现word、excel等文档在线预览?

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

时间:2023-12-05 本站 点击:0

java实现办公文件在线预览功能是一个大家在工作中也许会遇到的需求,网上有些公司专门提供这样的服务,不过需要收费;如果想要免费的,可以用openoffice,实现原理就是:

通过第三方工具openoffice,将word、excel、ppt、txt等文件转换为pdf文件流;

当然如果装了Adobe Reader XI,那把pdf直接拖到浏览器页面就可以直接打开预览,前提就是浏览器支持pdf文件浏览。

本文主要介绍通过poi实现word、excel、ppt转pdf流,这样就可以在浏览器上实现预览了。

1.到官网下载Apache OpenOffice 安装包,安装运行。

不同系统的安装方法,自行百度,这里不做过多说明。

2.再项目的pom文件中引入依赖

<!--openoffice--><dependency><groupId>com.artofsolving</groupId><artifactId>jodconverter</artifactId><version>2.2.1</version></dependency>

3.将word、excel、ppt转换为pdf流的工具类代码

importcom.artofsolving.jodconverter.DefaultDocumentFormatRegistry;importcom.artofsolving.jodconverter.DocumentConverter;importcom.artofsolving.jodconverter.DocumentFormat;importcom.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;importcom.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;importcom.artofsolving.jodconverter.openoffice.converter.StreamOpenOfficeDocumentConverter;importjava.io.*;importjava.net.HttpURLConnection;importjava.net.URL;importjava.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)throwsException{FileinputFile=newFile(sourcePath);InputStreaminputStream=newFileInputStream(inputFile);returncovertCommonByStream(inputStream,suffix);}/***方法描述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();returncovertCommonByStream(inputStream,suffix);}returnnull;}/***方法描述将文件以流的形式转换**@paraminputStream源文件输入流*@paramsuffix源文件后缀*@returnInputStream转换后文件输入流*@authortarzan*/publicstaticInputStreamcovertCommonByStream(InputStreaminputStream,Stringsuffix)throwsException{ByteArrayOutputStreamout=newByteArrayOutputStream();OpenOfficeConnectionconnection=newSocketOpenOfficeConnection(OPENOFFICE_PORT);connection.connect();DocumentConverterconverter=newStreamOpenOfficeDocumentConverter(connection);DefaultDocumentFormatRegistryformatReg=newDefaultDocumentFormatRegistry();DocumentFormattargetFormat=formatReg.getFormatByFileExtension(DEFAULT_SUFFIX);DocumentFormatsourceFormat=formatReg.getFormatByFileExtension(suffix);converter.convert(inputStream,sourceFormat,out,targetFormat);connection.disconnect();returnoutputStreamConvertInputStream(out);}/***方法描述outputStream转inputStream**@authortarzan*/publicstaticByteArrayInputStreamoutputStreamConvertInputStream(finalOutputStreamout)throwsException{ByteArrayOutputStreambaos=(ByteArrayOutputStream)out;returnnewByteArrayInputStream(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("文件格式不正确");}Stringsuffix=str[str.length-1];if(!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();//创建存放文件内容的数组byte[]buff=newbyte[1024];//所读取的内容使用n来接收intn;//当没有读取完时,继续读取,循环while((n=in.read(buff))!=-1){//将字节数组的数据全部写入到输出流中outputStream.write(buff,0,n);}//强制将缓存区的数据进行输出outputStream.flush();//关流outputStream.close();in.close();}

5.controler层代码

@ApiOperation(value="系统文件在线预览接口bytarzan")@PostMapping("/api/file/onlinePreview")publicvoidonlinePreview(@RequestParam("url")Stringurl,HttpServletResponseresponse)throwsException{fileService.onlinePreview(url,response);}

链接:blog.csdn.net/weixin_40986713/article/details/109527294


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/java/12182.html