word、excel、ppt 办公文件 在线预览
如果想要免費(fèi)的,可以用 openoffice,實(shí)現(xiàn)原理就是:
通過(guò)第三方工具openoffice,將word、excel、ppt、txt等文件轉(zhuǎn)換為pdf文件流;當(dāng)然如果裝了Adobe Reader XI,那把pdf直接拖到瀏覽器頁(yè)面就可以直接打開(kāi)預(yù)覽,前提就是瀏覽器支持pdf文件瀏覽。
文章目錄
- 一、安裝openoffice
- 1. windows環(huán)境
- 2. linux環(huán)境
- 二、springboot項(xiàng)目
- 2.1. 導(dǎo)入依賴
- 2.2. controller
- 2.2. 接口
- 2.3. 實(shí)現(xiàn)類
- 2.4. 格式轉(zhuǎn)換
- 2.5. 配置類
- 2.6. 擴(kuò)展配置
- 2.7. 全局配置
- 2.8. 項(xiàng)目源碼
- 2.9. 項(xiàng)目拉取
- 2.10.效果圖
- 三、源碼心得分享
- 3.1. 適配兼容
- 3.2. 兼容不足
- 3.3. 解決方案
一、安裝openoffice
1. windows環(huán)境
openoffice 安裝windows 環(huán)境
2. linux環(huán)境
openoffice 安裝 linux環(huán)境
二、springboot項(xiàng)目
2.1. 導(dǎo)入依賴
<dependency><groupId>com.artofsolving</groupId><artifactId>jodconverter</artifactId><version>2.2.1</version></dependency>2.2. controller
package com.gblfy.controller;import com.gblfy.service.IPreviewService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;/*** @author gblfy* @date 2021-10-28*/ @Api(tags = "在線預(yù)覽入口") @RestController @RequestMapping("/file/onlinePreview") public class PreviewController {@Autowiredprivate IPreviewService previewService;//在線預(yù)覽處理類/*** 在線預(yù)覽主入口** @param fileUrl* @param response* @throws Exception*/@ApiOperation("在線預(yù)覽主方法")@PostMapping("/api")public void onlinePreview(@RequestParam("fileUrl") String fileUrl, HttpServletResponse response) throws Exception {previewService.onlinePreview(fileUrl, response);} }2.2. 接口
package com.gblfy.service;import javax.servlet.http.HttpServletResponse;/*** 文件在線預(yù)覽接口** @author gblfy* @date 2021-10-28*/ public interface IPreviewService {void onlinePreview(String url, HttpServletResponse response) throws Exception; }2.3. 實(shí)現(xiàn)類
package com.gblfy.service.impl;import com.gblfy.consts.FileTypeConst; import com.gblfy.service.IPreviewService; import com.gblfy.utils.FileConvertUtil; import org.springframework.stereotype.Service;import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream;/*** 在線預(yù)覽處理類** @author gblfy* @date 2021-10-28*/ @Service public class PreviewServiceImpl implements IPreviewService {/*** 文件在線預(yù)覽** @param fileUrl 預(yù)覽的文件路徑* @param response 以pdf文件流的形式返回瀏覽器完成預(yù)覽操作* @throws Exception*/@Overridepublic void onlinePreview(String fileUrl, HttpServletResponse response) throws IOException {//對(duì)url中文件名稱進(jìn)行統(tǒng)一編碼,解決400問(wèn)題String uRLEncoder = FileConvertUtil.encodeUrlFileName(fileUrl);//獲取文件類型 注意不要攜帶.String suffix = FileConvertUtil.suffixFromFileName(uRLEncoder);if (!FileTypeConst.TXT.equals(suffix) && !FileTypeConst.DOC.equals(suffix)&& !FileTypeConst.DOCX.equals(suffix) && !FileTypeConst.XLS.equals(suffix)&& !FileTypeConst.XLSX.equals(suffix) && !FileTypeConst.PPT.equals(suffix)&& !FileTypeConst.PPTX.equals(suffix)) {throw new RuntimeException("該文件格式不支持預(yù)覽");}//文件轉(zhuǎn)換處理InputStream in = FileConvertUtil.convertNetFile(uRLEncoder, suffix);OutputStream outputStream = response.getOutputStream();//創(chuàng)建存放文件內(nèi)容的數(shù)組byte[] buff = new byte[1024];//所讀取的內(nèi)容使用n來(lái)接收int n;//當(dāng)沒(méi)有讀取完時(shí),繼續(xù)讀取,循環(huán)while ((n = in.read(buff)) != -1) {//將字節(jié)數(shù)組的數(shù)據(jù)全部寫(xiě)入到輸出流中outputStream.write(buff, 0, n);}//強(qiáng)制將緩存區(qū)的數(shù)據(jù)進(jìn)行輸出outputStream.flush();//關(guān)流outputStream.close();in.close();} }2.4. 格式轉(zhuǎn)換
文件格式轉(zhuǎn)換工具類
package com.gblfy.utils;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 org.springframework.stereotype.Component;import java.io.*; import java.net.*;/*** 文件格式轉(zhuǎn)換工具類** @author gblfy* @date 2021-10-28*/ @Component 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 IOException {// 創(chuàng)建URLURL 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();//文件轉(zhuǎn)換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 ConnectException {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) {ByteArrayOutputStream baos = (ByteArrayOutputStream) out;return new ByteArrayInputStream(baos.toByteArray());}/*** 通過(guò)文件名獲取文件后綴** @param fileName 文件名稱* @return 文件后綴*/public static String suffixFromFileName(String fileName) {return fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();}/*** 對(duì)url中的文件名進(jìn)行UTF-8編碼** @param url url* @return 文件名編碼后的url*/public static String encodeUrlFileName(String url) {String noQueryUrl = url.substring(0, url.contains("?") ? url.indexOf("?") : url.length());int fileNameStartIndex = noQueryUrl.lastIndexOf('/') + 1;int fileNameEndIndex = noQueryUrl.lastIndexOf('.');String encodedFileName;try {encodedFileName = URLEncoder.encode(noQueryUrl.substring(fileNameStartIndex, fileNameEndIndex), "UTF-8");} catch (UnsupportedEncodingException e) {return null;}return url.substring(0, fileNameStartIndex) + encodedFileName + url.substring(fileNameEndIndex);}// public static void main(String[] args) {// String url ="http://127.0.0.1:8080/flies/新建MicrosoftExcel工作表.xlsx";// String ii = encodeUrlFileName(url);// System.out.println(ii);// } }2.5. 配置類
package com.gblfy.config;import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** web 配置類** @author gblfy* @Date 2019/11/12日 下午5:03:32*/ @Configuration public class WebConfig implements WebMvcConfigurer {/*** 在配置文件中配置的文件保存路徑*/@Value("${files.location}")private String files;/*** 靜態(tài)資源映射*/@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {//本應(yīng)用\static\editor\fontsregistry.addResourceHandler("/flies/**").addResourceLocations("file:" + files);} }2.6. 擴(kuò)展配置
說(shuō)明:添加擴(kuò)展配置原因
解決jodconverter 2.2.1 版本不支持docx、xlsx、pptx 轉(zhuǎn)換成PDF格式異常
2.7. 全局配置
- windows環(huán)境
- linux環(huán)境
安裝字體
生成PDF亂碼問(wèn)題解決方案
2.8. 項(xiàng)目源碼
https://gitee.com/gb_90/online-preview
2.9. 項(xiàng)目拉取
git clone git@gitee.com:gb_90/online-preview.git2.10.效果圖
三、源碼心得分享
3.1. 適配兼容
日常office 格式文件轉(zhuǎn)換可以滿足,支持文件格式很多,
例如:doc、docx、xls、xlsx、ppt、pptx、txt 等,這里不一一列舉
3.2. 兼容不足
-
效果圖:
雖然可以滿足日常office文件轉(zhuǎn)換場(chǎng)景,但是,實(shí)現(xiàn)效果和原版文件有差距,如果要求不要能接受就可以。 -
excel 轉(zhuǎn)換有限制
默認(rèn)只支持a4紙大小,寬度超過(guò),會(huì)在下一頁(yè)打印,這一點(diǎn)不是太好。 -
導(dǎo)致的原因
轉(zhuǎn)換內(nèi)置了轉(zhuǎn)換后的紙張大小
3.3. 解決方案
修改源碼預(yù)覽之前,對(duì)將要預(yù)覽的尺寸大小,先辦法獲取到,然后再動(dòng)態(tài)設(shè)置就好
| ppt | http://127.0.0.1:80/file/onlinePreview/api?fileUrl=http://127.0.0.1:80/flies/多彩工作總結(jié)計(jì)劃PPT模板2.pptx |
| excel | http://127.0.0.1:80/file/onlinePreview/apifileUrl=http://127.0.0.1:80/flies/中文測(cè)試.xlsx |
| word | http://127.0.0.1:80/file/onlinePreview/apifileUrl=http://127.0.0.1:80/flies/前端3天速成手冊(cè).docx |
總結(jié)
以上是生活随笔為你收集整理的word、excel、ppt 办公文件 在线预览的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: yarn : 无法加载文件 C:\Use
- 下一篇: elementui更改el-table表