word、excel、ppt 办公文件 在线预览
生活随笔
收集整理的這篇文章主要介紹了
word、excel、ppt 办公文件 在线预览
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
如果想要免費的,可以用 openoffice,實現原理就是:
通過第三方工具openoffice,將word、excel、ppt、txt等文件轉換為pdf文件流;當然如果裝了Adobe Reader XI,那把pdf直接拖到瀏覽器頁面就可以直接打開預覽,前提就是瀏覽器支持pdf文件瀏覽。
文章目錄
- 一、安裝openoffice
- 1. windows環境
- 2. linux環境
- 二、springboot項目
- 2.1. 導入依賴
- 2.2. controller
- 2.2. 接口
- 2.3. 實現類
- 2.4. 格式轉換
- 2.5. 配置類
- 2.6. 擴展配置
- 2.7. 全局配置
- 2.8. 項目源碼
- 2.9. 項目拉取
- 2.10.效果圖
- 三、源碼心得分享
- 3.1. 適配兼容
- 3.2. 兼容不足
- 3.3. 解決方案
一、安裝openoffice
1. windows環境
openoffice 安裝windows 環境
2. linux環境
openoffice 安裝 linux環境
二、springboot項目
2.1. 導入依賴
<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 = "在線預覽入口") @RestController @RequestMapping("/file/onlinePreview") public class PreviewController {@Autowiredprivate IPreviewService previewService;//在線預覽處理類/*** 在線預覽主入口** @param fileUrl* @param response* @throws Exception*/@ApiOperation("在線預覽主方法")@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;/*** 文件在線預覽接口** @author gblfy* @date 2021-10-28*/ public interface IPreviewService {void onlinePreview(String url, HttpServletResponse response) throws Exception; }2.3. 實現類
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;/*** 在線預覽處理類** @author gblfy* @date 2021-10-28*/ @Service public class PreviewServiceImpl implements IPreviewService {/*** 文件在線預覽** @param fileUrl 預覽的文件路徑* @param response 以pdf文件流的形式返回瀏覽器完成預覽操作* @throws Exception*/@Overridepublic void onlinePreview(String fileUrl, HttpServletResponse response) throws IOException {//對url中文件名稱進行統一編碼,解決400問題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("該文件格式不支持預覽");}//文件轉換處理InputStream in = FileConvertUtil.convertNetFile(uRLEncoder, suffix);OutputStream outputStream = response.getOutputStream();//創建存放文件內容的數組byte[] buff = new byte[1024];//所讀取的內容使用n來接收int n;//當沒有讀取完時,繼續讀取,循環while ((n = in.read(buff)) != -1) {//將字節數組的數據全部寫入到輸出流中outputStream.write(buff, 0, n);}//強制將緩存區的數據進行輸出outputStream.flush();//關流outputStream.close();in.close();} }2.4. 格式轉換
文件格式轉換工具類
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.*;/*** 文件格式轉換工具類** @author gblfy* @date 2021-10-28*/ @Component public class FileConvertUtil {/*** 默認轉換后文件后綴*/private static final String DEFAULT_SUFFIX = "pdf";/*** openoffice_port*/private static final Integer OPENOFFICE_PORT = 8100;/*** 方法描述 office文檔轉換為PDF(處理本地文件)** @param sourcePath 源文件路徑* @param suffix 源文件后綴* @return InputStream 轉換后文件輸入流* @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文檔轉換為PDF(處理網絡文件)** @param netFileUrl 網絡文件路徑* @param suffix 文件后綴* @return InputStream 轉換后文件輸入流* @author tarzan*/public static InputStream convertNetFile(String netFileUrl, String suffix) throws IOException {// 創建URLURL url = new URL(netFileUrl);// 試圖連接并取得返回狀態碼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;}/*** 方法描述 將文件以流的形式轉換** @param inputStream 源文件輸入流* @param suffix 源文件后綴* @return InputStream 轉換后文件輸入流* @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轉inputStream** @author tarzan*/public static ByteArrayInputStream outputStreamConvertInputStream(final OutputStream out) {ByteArrayOutputStream baos = (ByteArrayOutputStream) out;return new ByteArrayInputStream(baos.toByteArray());}/*** 通過文件名獲取文件后綴** @param fileName 文件名稱* @return 文件后綴*/public static String suffixFromFileName(String fileName) {return fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();}/*** 對url中的文件名進行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;/*** 靜態資源映射*/@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {//本應用\static\editor\fontsregistry.addResourceHandler("/flies/**").addResourceLocations("file:" + files);} }2.6. 擴展配置
說明:添加擴展配置原因
解決jodconverter 2.2.1 版本不支持docx、xlsx、pptx 轉換成PDF格式異常
2.7. 全局配置
- windows環境
- linux環境
安裝字體
生成PDF亂碼問題解決方案
2.8. 項目源碼
https://gitee.com/gb_90/online-preview
2.9. 項目拉取
git clone git@gitee.com:gb_90/online-preview.git2.10.效果圖
三、源碼心得分享
3.1. 適配兼容
日常office 格式文件轉換可以滿足,支持文件格式很多,
例如:doc、docx、xls、xlsx、ppt、pptx、txt 等,這里不一一列舉
3.2. 兼容不足
-
效果圖:
雖然可以滿足日常office文件轉換場景,但是,實現效果和原版文件有差距,如果要求不要能接受就可以。 -
excel 轉換有限制
默認只支持a4紙大小,寬度超過,會在下一頁打印,這一點不是太好。 -
導致的原因
轉換內置了轉換后的紙張大小
3.3. 解決方案
修改源碼預覽之前,對將要預覽的尺寸大小,先辦法獲取到,然后再動態設置就好
| ppt | http://127.0.0.1:80/file/onlinePreview/api?fileUrl=http://127.0.0.1:80/flies/多彩工作總結計劃PPT模板2.pptx |
| excel | http://127.0.0.1:80/file/onlinePreview/apifileUrl=http://127.0.0.1:80/flies/中文測試.xlsx |
| word | http://127.0.0.1:80/file/onlinePreview/apifileUrl=http://127.0.0.1:80/flies/前端3天速成手冊.docx |
總結
以上是生活随笔為你收集整理的word、excel、ppt 办公文件 在线预览的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: yarn : 无法加载文件 C:\Use
- 下一篇: elementui更改el-table表