手把手實現(xiàn)Word、Excel、PPT在線預覽
閱讀本文大概需要 4 分鐘。
來自:blog.csdn.net/weixin_40986713/article/details/109527294
通過第三方工具openoffice,將word、excel、ppt、txt等文件轉(zhuǎn)換為pdf文件流;

<dependency>
????<groupId>com.artofsolvinggroupId>
????<artifactId>jodconverterartifactId>
????<version>2.2.1version>
dependency>
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?{
????/**?默認轉(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");
????}
}
?/**
?????*?@Description:系統(tǒng)文件在線預覽接口
?????*?@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("文件格式不支持預覽");
????????}
????????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;
????????//當沒有讀取完時,繼續(xù)讀取,循環(huán)
????????while((n=in.read(buff))!=-1){
????????????//將字節(jié)數(shù)組的數(shù)據(jù)全部寫入到輸出流中
????????????outputStream.write(buff,0,n);
????????}
????????//強制將緩存區(qū)的數(shù)據(jù)進行輸出
????????outputStream.flush();
????????//關(guān)流
????????outputStream.close();
????????in.close();
????}
????@ApiOperation(value?=?"系統(tǒng)文件在線預覽接口?by?tarzan")
????@PostMapping("/api/file/onlinePreview")
????public?void?onlinePreview(@RequestParam("url")?String?url,?HttpServletResponse?response)?throws?Exception{
????????fileService.onlinePreview(url,response);
????}
推薦閱讀:
鼓勵師加成太刺激了,鼻血噴了半斤,代碼不一會兒就寫完了...
最近面試BAT,整理一份面試資料《Java面試BATJ通關(guān)手冊》,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。
朕已閱?

