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格式异常

package com.artofsolving.jodconverter;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;/*** @description: 重写 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;}//将文件名后缀统一转化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环境
# linux
#files:
#  location: /app/files/
#  mapping: /flies/# windows
files:location: D:/files/mapping: /flies/#server:
#  port: 80
  • linux环境

```bash
# linux
files:location: /app/files/mapping: /flies/# windows
#files:
#  location: D:/files/
#  mapping: /flies/#server:
#  port: 80

安装字体
生成PDF乱码问题解决方案

2.8. 项目源码

https://gitee.com/gb_90/online-preview

2.9. 项目拉取
git clone git@gitee.com:gb_90/online-preview.git
2.10.效果图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、源码心得分享
3.1. 适配兼容

日常office 格式文件转换可以满足,支持文件格式很多,
例如:doc、docx、xls、xlsx、ppt、pptx、txt 等,这里不一一列举

3.2. 兼容不足
  • 效果图:
    虽然可以满足日常office文件转换场景,但是,实现效果和原版文件有差距,如果要求不要能接受就可以。

  • excel 转换有限制
    默认只支持a4纸大小,宽度超过,会在下一页打印,这一点不是太好。

  • 导致的原因
    转换内置了转换后的纸张大小

3.3. 解决方案

修改源码预览之前,对将要预览的尺寸大小,先办法获取到,然后再动态设置就好

格式测试链接
ppthttp://127.0.0.1:80/file/onlinePreview/api?fileUrl=http://127.0.0.1:80/flies/多彩工作总结计划PPT模板2.pptx
excelhttp://127.0.0.1:80/file/onlinePreview/apifileUrl=http://127.0.0.1:80/flies/中文测试.xlsx
wordhttp://127.0.0.1:80/file/onlinePreview/apifileUrl=http://127.0.0.1:80/flies/前端3天速成手册.docx

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/516944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生成PDF乱码问题

文章目录1. 准备字体2. 安装字体3. 重启服务器1. 准备字体 将Windows下的Fonts&#xff0c;如&#xff1a;C:\Windows\Fonts&#xff0c;压缩成Fonts.zip压缩包 2. 安装字体 将压缩包拷贝到Linux目录下&#xff0c;执行如下命令即可&#xff1a; unzip Fonts.zip mkdir /u…

30 年开源老兵,10 年躬耕 OpenStack,开源 1000 万行核心代码

受访者 | Jonathan Bryce记者 | 伍杏玲出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;万物互联时代下&#xff0c;我们的一切都在依赖计算基础设施&#xff0c;科学、金融、政府、教育、通信和医疗保健依赖现代云基础设施来运行和改进。而开源是让全世界大多数人获…

力展物流公司上云 低成本、实例资源使用效率提升

公司介绍 我们公司是成都力展供应链管理有限公司&#xff0c;于2019年4月注册&#xff0c;注册资金1000万&#xff0c;并于2019年6月投资了四川力展物流有限责任公司和成都力展鸿翔物流有限公司&#xff0c;分别入股900W和400W。业务痛点 我们公司成立不久&#xff0c;但动作频…

OpenOffice+JodConverter实现Office文件到PDF的转换

文章目录1. OpenOffice 下载、安装、启动2. JodConverter下载3. 文件转化4. 中文乱码5. 解决中文乱码1. OpenOffice 下载、安装、启动 openoffice 安装 linux环境 2. JodConverter下载 JodConverter是一款利用OpenOffice进行转化的工具&#xff0c;可以在Office文件和OpenOff…

OpenInfra Days China 2020大会议程已上线!

距离OpenInfra Days China 2020线上活动开幕还有不到半个月的时间&#xff0c;议题征集与筛选工作已于七月底正式结束&#xff0c;目前大会议程已正式公布&#xff01; 本次OpenInfra Days China主题演讲由OpenStack基金会执行董事Jonathan Bryce&#xff0c;中国电子技术标准化…

阿里云高校“在家实践”计划,免费提供2.68亿小时算力!

计划简介 新冠肺炎疫情防控阻击战持续推进&#xff0c;为全力配合教育部延期开学&#xff0c;高校在线上课共同抗击疫情&#xff0c;阿里云弹性计算联合开发者社区紧急上线高校师生“在家实践”计划&#xff0c;向全国高校学生、教师免费提供2.68亿小时云服务器ECS算力&#xf…

启迪公交上云助力北京公交二维码乘车业务系统顺利上线

公司介绍 我们公司是国内领先的公交出行服务提供商&#xff0c;通过承接公交信息化和智慧化项目建设&#xff0c;应用最先进的互联网商业模式&#xff0c;将“人、车、线、站”的大数据资源及相关配套资源进行商业化转换&#xff0c;实现行业引领&#xff0c;提升公交系统的创新…

MVC与MVVM的区别

MVC与MVVM MVC是Model-View- Controller的简写&#xff1a;模型(model) 视图(view) 控制器(controller) ​ Model&#xff08;模型&#xff09;&#xff1a;是应用程序中用于处理应用程序数据逻辑的部分。 ​ View&#xff08;视图&#xff09;&#xff1a;是应用程序中处理…

项目 接入 在线预览

文章目录1. 项目链接2. 克隆项目3. 接入规范4. 项目接入测试5. 参考案例1. 项目链接 https://gitee.com/kekingcn/file-online-preview 2. 克隆项目 git clone gitgitee.com:kekingcn/file-online-preview.git3. 接入规范 # 如果你的项目需要接入文件预览项目&#xff0c;…

阿里技术文档:Redis+Nginx+Spring全家桶+Dubbo精选

最近花了很长的时间去搜罗整理Java核心技术好文&#xff0c;我把每个Java核心技术的优选文章都整理成了一个又一个的文档。今天就把这些东西分享给老铁们&#xff0c;也能为老铁们省去不少麻烦&#xff0c;想学什么技能了&#xff0c;遇到哪方面的问题了 直接打开文档学一学就好…

入门云监控部署业务

云监控概览为您提供了云服务资源使用概览、报警概览、重要事件概览和资源使用情况概览。 您可以实时了解各云服务的资源保有、使用水位和报警情况。 云服务概览 云服务概览提供主机&#xff08;包括云服务器 ECS 和安装云监控插件的非ECS 机器&#xff09;、负载均衡、弹性公…

游戏行业应该如何建设数据中台?

责编 | 晋兆雨来源 |智领云科技封图 | CSDN 下载自视觉中国随着网络世界的迅猛发展&#xff0c;“游戏”进入了前所未有的蓬勃发展期。根据Newzoo数据显示&#xff0c;2019年全球游戏市场规模约为1521亿美元&#xff0c;2015-2019年复合增长率达到13.4%&#xff0c;预计2020年全…

中台架构详解(上) | 大咖说中台

作者 | 耿立超责编 | 晋兆雨来源 | 《大数据平台架构与原型实现&#xff1a;数据中台建设实战》中台打破了应用系统的壁垒&#xff0c;从企业全局梳理和规划业务程&#xff0c;重构了组织架构、业务架构与IT 架构。 在梳理了企业的IT 现状并回顾了SOA 的历史之后&#xff0c;我…

入门云虚拟主机,为你的业务快速实现数据备份和数据恢复

备份方式 虚拟主机的备份分手工备份与自动备份两种。备份存储到单独系统提供的存储空间&#xff0c;不占用虚拟主机的网页空间和数据库空间。 手工备份 手工备份是指用户在控制台主动发起的备份操作&#xff0c;备份完毕后可随时下载和恢复。除非备份被主动删除&#xff0c;…

Web 前端自学很苦?来,手把手教你,拿下前端!

今年受经济下行与疫情叠加的影响&#xff0c;毕业生有800多万&#xff0c;就业形势十分严峻&#xff0c;但即便如此&#xff0c;Web前端人才在软件开发行业的就业市场中依旧供小于求&#xff0c;目前&#xff0c;全国总缺口每年大约为近百万人。行业对前端需求量持续增加&#…

景区门票系统上云 低成本、安全性高

公司介绍 我们是华南麟睿科技有限公司&#xff0c;是一家批发零售业企业。本公司成立于2019年8月&#xff0c;总部位于衡阳&#xff0c;实缴注册资金777万元&#xff0c;并于2019年11月成立了子公司华南麟睿文化传媒有限公司。目前主要需求是业务景区门票系统上云。 业务痛点…

垃圾回收策略和算法,看这篇就够了

作者 | Craig无忌来源 | 程序员大帝&#xff08;ID:kingcoding&#xff09;前言回收&#xff0c;旧手机&#xff0c;旧冰箱&#xff0c;旧空调&#xff0c;旧洗衣机&#xff0c;电瓶车摩托车&#xff0c;自行车&#xff0c;报纸&#xff0c;塑料......还记得小时候&#xff0c;…

手把手教你在物联网为产品定义物模型

物联网平台支持为产品定义物模型&#xff0c;将实际产品抽象成由属性、服务、事件所组成的数据模型&#xff0c;便于云端管理和数据交互。产品创建完成后&#xff0c;您可以为它定义物模型&#xff0c;产品下的设备将自动继承物模型内容。 操作步骤 产品列表中&#xff0c;选…

SpringBoot/Cloud AOP 统一日志输出

文章目录1. 导入依赖2. aop拦截器3. logback配置4. 测试类5. 关键点6. 效果图1. 导入依赖 <!-- AOP --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>&l…

社区网站类场景下的静态资源处理

社区网站类场景下静态资源处理 场景描述 解决的问题 本实践通过搭建WordPress博客系统&#xff0c;向用户展示如何l 静态资源&#xff08;图片、视频等&#xff09;CDN访问加速和刷新 将图片、附件等静态资源上传到阿里云OSS&#xff0c;并通过阿里l OSS对象跨国际区域进行复…