Java實(shí)現(xiàn)辦公文檔在線預(yù)覽功能
java實(shí)現(xiàn)辦公文件在線預(yù)覽功能是一個(gè)大家在工作中也許會遇到的需求,網(wǎng)上些公司專門提供這樣的服務(wù),不過需要收費(fèi)
如果想要免費(fèi)的,可以用openoffice,實(shí)現(xiàn)原理就是:
通過第三方工具openoffice,將word、excel、ppt、txt等文件轉(zhuǎn)換為pdf文件流;
當(dāng)然如果裝了Adobe Reader XI,那把pdf直接拖到瀏覽器頁面就可以直接打開預(yù)覽,前提就是瀏覽器支持pdf文件瀏覽。
我這里介紹通過poi實(shí)現(xiàn)word、excel、ppt轉(zhuǎn)pdf流,這樣就可以在瀏覽器上實(shí)現(xiàn)預(yù)覽了。
1.到官網(wǎng)下載Apache OpenOffice 安裝包,安裝運(yùn)行。(不同系統(tǒng)的安裝方法,自行百度,這里不做過多說明)
2.再項(xiàng)目的pom文件中引入依賴
<!--openoffice--> <dependency> <groupId>com.artofsolving</groupId> <artifactId>jodconverter</artifactId> <version>2.2.1</version> </dependency>
3.將word、excel、ppt轉(zhuǎn)換為pdf流的工具類代碼
import com.artofsolving.jodconverter.DefaultDocumentFormatRegistry; import com.artofsolving.jodconverter.DocumentConverter; import com.artofsolving.jodconverter.DocumentFormat; import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.converter.StreamOpenOfficeDocumentConverter; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; /** * 文件格式轉(zhuǎn)換工具類 * * @author tarzan * @version 1.0 * @since JDK1.8 */ public class FileConvertUtil { /** 默認(rèn)轉(zhuǎn)換后文件后綴 */ private static final String DEFAULT_SUFFIX = "pdf"; /** openoffice_port */ private static final Integer OPENOFFICE_PORT = 8100; /** * 方法描述 office文檔轉(zhuǎn)換為PDF(處理本地文件) * * @param sourcePath 源文件路徑 * @param suffix 源文件后綴 * @return InputStream 轉(zhuǎn)換后文件輸入流 * @author tarzan */ public static InputStream convertLocaleFile(String sourcePath, String suffix) throws Exception { File inputFile = new File(sourcePath); InputStream inputStream = new FileInputStream(inputFile); return covertCommonByStream(inputStream, suffix); } /** * 方法描述 office文檔轉(zhuǎn)換為PDF(處理網(wǎng)絡(luò)文件) * * @param netFileUrl 網(wǎng)絡(luò)文件路徑 * @param suffix 文件后綴 * @return InputStream 轉(zhuǎn)換后文件輸入流 * @author tarzan */ public static InputStream convertNetFile(String netFileUrl, String suffix) throws Exception { // 創(chuàng)建URL URL url = new URL(netFileUrl); // 試圖連接并取得返回狀態(tài)碼 URLConnection urlconn = url.openConnection(); urlconn.connect(); HttpURLConnection httpconn = (HttpURLConnection) urlconn; int httpResult = httpconn.getResponseCode(); if (httpResult == HttpURLConnection.HTTP_OK) { InputStream inputStream = urlconn.getInputStream(); return covertCommonByStream(inputStream, suffix); } return null; } /** * 方法描述 將文件以流的形式轉(zhuǎn)換 * * @param inputStream 源文件輸入流 * @param suffix 源文件后綴 * @return InputStream 轉(zhuǎn)換后文件輸入流 * @author tarzan */ public static InputStream covertCommonByStream(InputStream inputStream, String suffix) throws Exception { ByteArrayOutputStream out = new ByteArrayOutputStream(); OpenOfficeConnection connection = new SocketOpenOfficeConnection(OPENOFFICE_PORT); connection.connect(); DocumentConverter converter = new StreamOpenOfficeDocumentConverter(connection); DefaultDocumentFormatRegistry formatReg = new DefaultDocumentFormatRegistry(); DocumentFormat targetFormat = formatReg.getFormatByFileExtension(DEFAULT_SUFFIX); DocumentFormat sourceFormat = formatReg.getFormatByFileExtension(suffix); converter.convert(inputStream, sourceFormat, out, targetFormat); connection.disconnect(); return outputStreamConvertInputStream(out); } /** * 方法描述 outputStream轉(zhuǎn)inputStream * * @author tarzan */ public static ByteArrayInputStream outputStreamConvertInputStream(final OutputStream out) throws Exception { ByteArrayOutputStream baos=(ByteArrayOutputStream) out; return new ByteArrayInputStream(baos.toByteArray()); } public static void main(String[] args) throws IOException { //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層在線預(yù)覽方法代碼
/** * @Description:系統(tǒng)文件在線預(yù)覽接口 * @Author: tarzan */ public void onlinePreview(String url, HttpServletResponse response) throws Exception { //獲取文件類型 String[] str = SmartStringUtil.split(url,"\\."); if(str.length==0){ throw new Exception("文件格式不正確"); } String suffix = 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")){ throw new Exception("文件格式不支持預(yù)覽"); } InputStream in=FileConvertUtil.convertNetFile(url,suffix); OutputStream outputStream = response.getOutputStream(); //創(chuàng)建存放文件內(nèi)容的數(shù)組 byte[] buff =new byte[1024]; //所讀取的內(nèi)容使用n來接收 int n; //當(dāng)沒有讀取完時(shí),繼續(xù)讀取,循環(huán) while((n=in.read(buff))!=-1){ //將字節(jié)數(shù)組的數(shù)據(jù)全部寫入到輸出流中 outputStream.write(buff,0,n); } //強(qiáng)制將緩存區(qū)的數(shù)據(jù)進(jìn)行輸出 outputStream.flush(); //關(guān)流 outputStream.close(); in.close(); }
5.controler層代碼?
@ApiOperation(value = "系統(tǒng)文件在線預(yù)覽接口 by tarzan") @PostMapping("/api/file/onlinePreview") public void onlinePreview(@RequestParam("url") String url, HttpServletResponse response) throws Exception{ fileService.onlinePreview(url,response); }
到此這篇關(guān)于Java實(shí)現(xiàn)辦公文檔在線預(yù)覽功能的文章就介紹到這了,更多相關(guān)Java 文檔在線預(yù)覽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot WebSocket實(shí)時(shí)監(jiān)控異常的詳細(xì)流程
最近做了一個(gè)需求,消防的設(shè)備巡檢,如果巡檢發(fā)現(xiàn)異常,通過手機(jī)端提交,后臺的實(shí)時(shí)監(jiān)控頁面實(shí)時(shí)獲取到該設(shè)備的信息及位置,然后安排員工去處理。這篇文章主要介紹了SpringBoot WebSocket實(shí)時(shí)監(jiān)控異常的全過程,感興趣的朋友一起看看吧2021-10-10Java初學(xué)者問題圖解(動力節(jié)點(diǎn)Java學(xué)院整理)
本文通過圖文并茂的形式給大家介紹了java初學(xué)者問題,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2017-04-04Clojure?與Java對比少數(shù)據(jù)結(jié)構(gòu)多函數(shù)勝過多個(gè)單獨(dú)類的優(yōu)點(diǎn)
這篇文章主要介紹了Clojure?與Java對比少數(shù)據(jù)結(jié)構(gòu)多函數(shù)勝過多個(gè)單獨(dú)類的優(yōu)點(diǎn),在Clojure中,我們一次又一次地使用相同的數(shù)據(jù)結(jié)構(gòu),并在其上運(yùn)行許多函,更多相關(guān)介紹需要的朋友可以參考一下下面文章內(nèi)容2022-06-06java中form以post、get方式提交數(shù)據(jù)中文亂碼問題總結(jié)
這篇文章主要介紹了java中form以post、get方式提交數(shù)據(jù)中文亂碼問題總結(jié),需要的朋友可以參考下2014-10-10Java的CyclicBarrier循環(huán)屏障解析
這篇文章主要介紹了Java的CyclicBarrier循環(huán)屏障解析,CyclicBarrier和CountDownLatch一樣,是一個(gè)同步工具類,它允許一組線程相互等待直到達(dá)到某個(gè)common?barrier?point,在程序中CyclicBarrier是非常有用的,它適用于一組線程必須互相等待的情況,需要的朋友可以參考下2023-12-12Spring的RedisTemplate存儲的key和value有特殊字符的處理
這篇文章主要介紹了Spring的RedisTemplate存儲的key和value有特殊字符的處理方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12