日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

word、excel、ppt 办公文件 在线预览

發(fā)布時(shí)間:2024/9/27 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 word、excel、ppt 办公文件 在线预览 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.



如果想要免費(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格式異常

package com.artofsolving.jodconverter;import java.util.ArrayList; import java.util.Iterator; import java.util.List;/*** @description: 重寫(xiě) BasicDocumentFormatRegistry 文檔格式* * @Author: gblfy* @Data: 2021-10-27**/ public class BasicDocumentFormatRegistry implements DocumentFormatRegistry {private List/* <DocumentFormat> */ documentFormats = new ArrayList();public void addDocumentFormat(DocumentFormat documentFormat) {documentFormats.add(documentFormat);}protected List/* <DocumentFormat> */ getDocumentFormats() {return documentFormats;}/*** @param extension the file extension* @return the DocumentFormat for this extension, or null if the extension* is not mapped*/@Overridepublic DocumentFormat getFormatByFileExtension(String extension) {if (extension == null) {return null;}//將文件名后綴統(tǒng)一轉(zhuǎn)化if (extension.indexOf("doc") >= 0) {extension = "doc";}if (extension.indexOf("ppt") >= 0) {extension = "ppt";}if (extension.indexOf("xls") >= 0) {extension = "xls";}String lowerExtension = extension.toLowerCase();for (Iterator it = documentFormats.iterator(); it.hasNext(); ) {DocumentFormat format = (DocumentFormat) it.next();if (format.getFileExtension().equals(lowerExtension)) {return format;}}return null;}@Overridepublic DocumentFormat getFormatByMimeType(String mimeType) {for (Iterator it = documentFormats.iterator(); it.hasNext(); ) {DocumentFormat format = (DocumentFormat) it.next();if (format.getMimeType().equals(mimeType)) {return format;}}return null;} }
2.7. 全局配置
  • windows環(huán)境
# linux #files: # location: /app/files/ # mapping: /flies/# windows files:location: D:/files/mapping: /flies/#server: # port: 80
  • linux環(huán)境
```bash # linux files:location: /app/files/mapping: /flies/# windows #files: # location: D:/files/ # mapping: /flies/#server: # port: 80

安裝字體
生成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.git
2.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è)置就好

格式測(cè)試鏈接
ppthttp://127.0.0.1:80/file/onlinePreview/api?fileUrl=http://127.0.0.1:80/flies/多彩工作總結(jié)計(jì)劃PPT模板2.pptx
excelhttp://127.0.0.1:80/file/onlinePreview/apifileUrl=http://127.0.0.1:80/flies/中文測(cè)試.xlsx
wordhttp://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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。