Vue2 doc、excel、pdf、ppt、txt、图片以及视频等在线预览

Vue2 doc、excel、pdf、ppt、txt、图片等在线预览

  • 安装
  • 使用
    • 目录结构
    • 直接上代码
      • src\components\FileView\doc\index.vue
      • src\components\FileView\excel\index.vue
      • src\components\FileView\img\index.vue
      • src\components\FileView\pdf\index.vue
      • src\components\FileView\ppt\index.vue
      • src\components\FileView\txt\index.vue
      • src\components\FileView\index.vue
      • src\components\FileView\video\index.vue
    • 应用实例
      • 我的使用场景

安装

npm install --save @vue-office/docx @vue-office/excel @vue-office/pdf vue-demi@0.14.6

vue-demi@0.14.6; 其中 @0.14.6 为版本号,可以不加,默认下载最新版。

如果是 vue2.6 版本或以下还需要额外安装 @vue/composition-api

npm install @vue/composition-api

使用

目录结构

src\components
在这里插入图片描述

直接上代码

src\components\FileView\doc\index.vue

<template><div><vue-office-docx:src="docx"style="height: 75vh"@rendered="rendered"@error="errorHandler"/></div>
</template><script>
//引入VueOfficeDocx组件
import VueOfficeDocx from "@vue-office/docx";
//引入相关样式
import "@vue-office/docx/lib/index.css";export default {components: {VueOfficeDocx,},props: {docx: {type: String,default:"http://qncdn.qkongtao.cn/lib/teamadmin/files/Hadoop2.7.1%E4%BC%AA%E5%88%86%E5%B8%83%E5%BC%8F%E9%9B%86%E7%BE%A4%E5%AE%89%E8%A3%85%E6%96%87%E6%A1%A3.docx", //设置文档网络地址,可以是相对地址},},data() {return {};},methods: {rendered() {console.log("渲染完成");},errorHandler() {console.log("渲染失败");},},
};
</script>

src\components\FileView\excel\index.vue

<template><vue-office-excel:src="excel":options="options"@rendered="renderedHandler"@error="errorHandler"style="height: 75vh"/>
</template><script>
//引入VueOfficeExcel组件
import VueOfficeExcel from "@vue-office/excel";
//引入相关样式
import "@vue-office/excel/lib/index.css";export default {components: {VueOfficeExcel,},props: {excel: {type: String,default:"http://qncdn.qkongtao.cn/lib/teamadmin/files/2021%E5%B1%8A%E5%85%A8%E5%9B%BD%E5%90%84%E5%9C%B0%E6%B4%BE%E9%81%A3%E5%9C%B0%E5%9D%80.xlsx", //设置文档地址},},data() {return {options: {xls: true, //预览xlsx文件设置为false 预览xls文件设置为trueminColLength: 0,minRowLength: 0,widthOffset: 10,heightOffset: 10,},};},methods: {renderedHandler() {console.log("渲染完成");},errorHandler() {console.log("渲染失败");},},
};
</script>

src\components\FileView\img\index.vue

<template><div style="display: flex; justify-content: center"><el-image :src="imgUrl" :preview-src-list="[imgUrl]"> fit="contain"></el-image></div>
</template><script>
export default {props: {imgUrl: {type: String,default: "",},},components: {},data() {return {};},methods: {closeImage() {},},
};
</script>

src\components\FileView\pdf\index.vue

<template><vue-office-pdf :src="pdf" style="height: 75vh" @rendered="rendered" />
</template><script>
//引入VueOfficePdf组件
import VueOfficePdf from "@vue-office/pdf";export default {components: {VueOfficePdf,},props: {pdf: {type: String,default:"http://qncdn.qkongtao.cn/lib/teamadmin/files/%E6%B7%B1%E5%9C%B3-xx-Java%E9%AB%98%E7%BA%A7.pdf",},},data() {return {};},methods: {rendered() {console.log("渲染完成");},},
};
</script>

src\components\FileView\ppt\index.vue

PPT预览使用微软提供的方法进行文件预览

<template><iframeid="iframe1"width="100%"height="700px"frameborder="0"border="0"marginwidth="0"marginheight="0"scrolling="no"allowtransparency="no":src="'https://view.officeapps.live.com/op/embed.aspx?src=' + fileUrl"></iframe>
</template><script>
export default {props: {fileUrl: {type: String,default: "",},},components: {},data() {return {};},methods: {},
};
</script>

src\components\FileView\txt\index.vue

<template><div><pre class="pre-txt">{{ txtContent }}</pre></div>
</template><script>
import axios from "axios";
export default {components: {},props: {fileUrl: {type: String,default: "https://example.com/your-txt-file.txt",},},data() {return {txtContent: "",};},mounted() {this.fetchTxtFile();},methods: {fetchTxtFile() {axios.get(this.fileUrl).then((response) => {this.txtContent = response.data;}).catch((error) => {console.error("获取txt文件失败:", error);});},},
};
</script>
<style scoped>
.pre-txt {font-size: 12px;padding: 0;width: 100%;max-height: 70vh;min-height: 70vh;margin: 0;background: #f0f0f0;line-height: 20px; /* 行距 */overflow: auto; /* 超出宽度出现滑动条 */overflow-y: auto; /* 作用是隐藏IE的右侧滑动条 */
}
</style>

src\components\FileView\index.vue

<template><el-dialogtitle="文件预览":visible.sync="open"width="50vw":before-close="handleClose":close-on-click-modal="true"><DOC :docx="url" v-if="componentToUse === 'DOC'"></DOC><PDF :pdf="url" v-if="componentToUse === 'PDF'"></PDF><EXCEL :excel="url" v-if="componentToUse === 'EXCEL'"></EXCEL><TXT :fileUrl="url" v-if="componentToUse === 'TXT'"></TXT><IMG :imgUrl="url" v-if="componentToUse === 'IMG'"></IMG><PPT :fileUrl="url" v-if="componentToUse === 'PPT'"></PPT><!-- <span slot="footer" class="dialog-footer"><el-button @click="handleClose" size="small">关 闭</el-button></span> --><div v-if="componentToUse === 'WZ'">不支持的文件类型</div></el-dialog>
</template><script>
import DOC from "./doc/index.vue";
import PDF from "./pdf/index.vue";
import EXCEL from "./excel/index.vue";
import TXT from "./txt/index.vue";
import IMG from "./img/index.vue";
import PPT from "./ppt/index.vue";export default {components: {DOC,PDF,EXCEL,TXT,IMG,PPT,},props: {open: {type: Boolean,default: false,},url: {type: String,default:"http://qncdn.qkongtao.cn/lib/teamadmin/files/Hadoop2.7.1%E4%BC%AA%E5%88%86%E5%B8%83%E5%BC%8F%E9%9B%86%E7%BE%A4%E5%AE%89%E8%A3%85%E6%96%87%E6%A1%A3.docx", //设置文档网络地址,可以是相对地址},},data() {return {componentToUse: null, // 用于存储要使用的组件};},watch: {url() {// 当 url 改变时,重新判断文件类型并设置组件this.determineComponentType();},},created() {// 在组件创建时判断文件类型并设置组件this.determineComponentType();},methods: {rendered() {console.log("渲染完成");},handleClose() {this.$emit("update:open", false);},determineComponentType() {const fileExtension = this.url.split(".").pop().toLowerCase();switch (fileExtension) {case "docx":this.componentToUse = "DOC";break;case "pdf":this.componentToUse = "PDF";break;case "xlsx":case "xls":this.componentToUse = "EXCEL";break;case "txt":case "html":case "vue":case "js":case "json":this.componentToUse = "TXT";break;case "png":case "jpg":case "jpeg":this.componentToUse = "IMG";break;case "ppt":case "pptx":this.componentToUse = "PPT";break;default:console.error("不支持的文件类型");this.componentToUse = "WZ";}},},
};
</script>

src\components\FileView\video\index.vue

<template><divclass="m-video":class="{ 'u-video-hover': !hidden }":style="`width: ${veoWidth}; height: ${veoHeight};`"><videoref="veoRef"class="u-video":style="`object-fit: ${zoom};`":src="src":poster="veoPoster":autoplay="autoplay":controls="!originPlay && controls":loop="loop":muted="autoplay || muted":preload="preload"crossorigin="anonymous"@loadeddata="poster ? () => false : getPoster()"@pause="showPlay ? onPause() : () => false"@playing="showPlay ? onPlaying() : () => false"@click.prevent.once="onPlay"v-bind="$attrs">您的浏览器不支持video标签。</video><svgv-show="originPlay || showPlay"class="u-play":class="{ hidden: hidden }":style="`width: ${playWidth}px; height: ${playWidth}px;`"viewBox="0 0 24 24"><pathstroke-linecap="round"stroke-linejoin="round"stroke-width="1.5"d="M4.75 6.75C4.75 5.64543 5.64543 4.75 6.75 4.75H17.25C18.3546 4.75 19.25 5.64543 19.25 6.75V17.25C19.25 18.3546 18.3546 19.25 17.25 19.25H6.75C5.64543 19.25 4.75 18.3546 4.75 17.25V6.75Z"></path><pathstroke-linecap="round"stroke-linejoin="round"stroke-width="1.5"d="M15.25 12L9.75 8.75V15.25L15.25 12Z"></path></svg></div>
</template>
<script>
export default {name: "Video",props: {src: {// 视频文件url,必传,支持网络地址 https 和相对地址 require('@/assets/files/Bao.mp4')type: String,required: true,default: "",},poster: {// 视频封面url,支持网络地址 https 和相对地址 require('@/assets/images/Bao.jpg')type: String,default: "",},second: {// 在未设置封面时,自动截取视频第 second 秒对应帧作为视频封面type: Number,default: 0.5,},width: {// 视频播放器宽度,单位 pxtype: [String, Number],default: 800,},height: {// 视频播放器高度,单位 pxtype: [String, Number],default: 450,},/*参考 MDN 自动播放指南:https://developer.mozilla.org/zh-CN/docs/Web/Media/Autoplay_guideAutoplay 功能据新政策,媒体内容将在满足以下至少一个的条件下自动播放:1.音频被静音或其音量设置为 02.用户和网页已有交互行为(包括点击、触摸、按下某个键等等)3.网站已被列入白名单;如果浏览器确定用户经常与媒体互动,这可能会自动发生,也可能通过首选项或其他用户界面功能手动发生4.自动播放策略应用到<iframe>或者其文档上autoplay:由于目前在最新版的Chrome浏览器(以及所有以Chromium为内核的浏览器)中,已不再允许自动播放音频和视频。就算你为video或audio标签设置了autoplay属性也一样不能自动播放!解决方法:设置视频 autoplay 时,视频必须设置为静音 muted: true 即可实现自动播放,然后用户可以使用控制栏开启声音,类似某宝商品自动播放的宣传视频逻辑*/autoplay: {// 视频就绪后是否马上播放,优先级高于 preloadtype: Boolean,default: false,},controls: {// 是否向用户显示控件,比如进度条,全屏等type: Boolean,default: true,},loop: {// 视频播放完成后,是否循环播放type: Boolean,default: false,},muted: {// 是否静音type: Boolean,default: false,},preload: {// 是否在页面加载后载入视频,如果设置了autoplay属性,则preload将被忽略;type: String,default: "metadata", // auto:一旦页面加载,则开始加载视频; metadata:当页面加载后仅加载视频的元数据 none:页面加载后不应加载视频},showPlay: {// 播放暂停时是否显示播放器中间的暂停图标type: Boolean,default: true,},playWidth: {// 中间播放暂停按钮的边长type: Number,default: 96,},zoom: {// video的poster默认图片和视频内容缩放规则type: String,default: "contain", // none:(默认)保存原有内容,不进行缩放; fill:不保持原有比例,内容拉伸填充整个内容容器; contain:保存原有比例,内容以包含方式缩放; cover:保存原有比例,内容以覆盖方式缩放},},data() {return {veoPoster: this.poster,originPlay: true,hidden: false,};},computed: {veoWidth() {return '100%';},veoHeight() {if (typeof this.height === "number") {return this.height + "px";}return this.height;},},mounted() {if (this.autoplay) {this.hidden = true;this.originPlay = false;}/*自定义设置播放速度,经测试:在vue2中需设置:this.$refs.veoRef.playbackRate = 2在vue3中需设置:veo.value.defaultPlaybackRate = 2*/// this.$refs.veoRef.playbackRate = 2},methods: {/*loadedmetadata 事件在元数据(metadata)被加载完成后触发loadeddata 事件在媒体当前播放位置的视频帧(通常是第一帧)加载完成后触发若在移动/平板设备的浏览器设置中开启了流量节省(data-saver)模式,该事件则不会被触发。preload 为 none 时不会触发*/getPoster() {// 在未设置封面时,自动获取视频0.5s对应帧作为视频封面// 由于不少视频第一帧为黑屏,故设置视频开始播放时间为0.5s,即取该时刻帧作为封面图this.$refs.veoRef.currentTime = this.second;// 创建canvas元素const canvas = document.createElement("canvas");const ctx = canvas.getContext("2d");// canvas画图canvas.width = this.$refs.veoRef.videoWidth;canvas.height = this.$refs.veoRef.videoHeight;ctx.drawImage(this.$refs.veoRef, 0, 0, canvas.width, canvas.height);// 把canvas转成base64编码格式this.veoPoster = canvas.toDataURL("image/png");},onPlay() {if (this.originPlay) {this.$refs.veoRef.currentTime = 0;this.originPlay = false;}if (this.autoplay) {this.$refs.veoRef.pause();} else {this.hidden = true;this.$refs.veoRef.play();}},onPause() {this.hidden = false;},onPlaying() {this.hidden = true;},},
};
</script>
<style scoped>
* {box-sizing: border-box;margin: 0;padding: 0;
}
.m-video {display: inline-block;position: relative;background: #000;cursor: pointer;
}.u-play {position: absolute;top: 0;right: 0;bottom: 0;left: 0;margin: auto;fill: none;color: #fff;pointer-events: none;opacity: 0.7;transition: opacity 0.3s;
}
.hidden {opacity: 0;
}
.u-video {display: inline-block;width: 100%;height: 100%;vertical-align: bottom;
}
.u-video-hover {
}
</style>

应用实例

建议在main.js中增加全局组件引用

import FileView from '@/components/FileView'
Vue.component('FileView',FileView)

如果不使用全局挂载,那么请局部注册

我的使用场景

<FileView :open.sync="fileViewOpen" :url="fileUrl" v-if="fileViewOpen" />

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

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

相关文章

[OpenGL]使用OpenGL实现硬阴影效果

一、简介 本文介绍了如何使用OpenGL实现硬阴影效果&#xff0c;并在最后给出了全部的代码。本文基于[OpenGL]渲染Shadow Map&#xff0c;实现硬阴影的流程如下&#xff1a; 首先&#xff0c;以光源为视角&#xff0c;渲染场景的深度图&#xff0c;将light space中的深度图存储…

微服务是什么 SpringCloud是什么

微服务是什么 SpringCloud是什么 一、微服务概述二、微服务架构三、单体架构四、分布式架构五、SpringCloud概述六、SpringBoot和 SpringCloud的区别与联系七、SpringCloud版本选择 一、微服务概述 微服务&#xff08;MicroServices&#xff09;最初是由 Martin Fowler 于 2014…

K8S node节点没有相应的pod镜像运行故障处理办法

查看从节点状态 kubectl describe node k8s-node1以下是报错提示 解决办法 需要处理node1节点上的磁盘空间&#xff0c;磁盘空间需要在85%内 处理后的状态 处理正常

CSS教程(四)- 字体

1、尺寸单位 px 像素单位% 百分比&#xff0c;参照父元素对应属性的值进行计算em 字体尺寸单位&#xff0c;参照父元素的字体大小计算&#xff0c;1em16pxrem字体尺寸单位,参照根元素的字体大小计算&#xff0c;1rem16px 2、字体属性 介绍 CSS Fonts (字体)属性用于定义字体…

使用storcli工具配置RAID,收藏这一篇就够了

正文共&#xff1a;1888 字 28 图&#xff0c;预估阅读时间&#xff1a;2 分钟 前文&#xff08;怎么把银河麒麟系统装进U盘&#xff1f;&#xff09;提到&#xff0c;因为国产服务器固件暂不支持直接配置RAID&#xff0c;所以需要使用storcli这个工具来操作。今天就从RAID配置…

Three.js 搭建3D隧道监测

Three.js 搭建3D隧道监测 Three.js 基础元素场景scene相机carema网络模型Mesh光源light渲染器renderer控制器controls 实现3d隧道监测基础实现道路实现隧道实现多个摄像头点击模型进行属性操作实现点击模型发光效果 性能监视器stats引入使用 总结完整代码 我们将通过three.js技…

漫谈分布式唯一ID

文章目录 本系列前言UUIDDB自增主键Redis incr命令号段模式雪花算法 本系列 漫谈分布式唯一ID&#xff08;本文&#xff09;分布式唯一ID生成&#xff08;二&#xff09;&#xff1a;leaf分布式唯一ID生成&#xff08;三&#xff09;&#xff1a;uid-generator分布式唯一ID生成…

CSS教程(七)- 背景

介绍 背景属性可以设置背景颜色、背景图片、背景平铺、背景图片位置、背景图像固定等。 1 背景颜色 属性名&#xff1a;background-color 作用&#xff1a;指定HTML元素的背景色。 取值&#xff1a;英文颜色、16进制、rgb、rgba、transparent&#xff08;一般为透明&#…

网络安全SQL初步注入2

六.报错注入 mysql函数 updatexml(1,xpath语法,0) xpath语法常用concat拼接 例如: concat(07e,(查询语句),07e) select table_name from information_schema.tables limit 0,1 七.宽字节注入(如果后台数据库的编码为GBK) url编码:为了防止提交的数据和url中的一些有特殊意…

three.js 杂记

在Three.js中&#xff0c;Object3D是所有3D对象的基类&#xff0c;而Group是Object3D的一个子类。Group的目的是为了简化处理多个对象的集合。当你将对象添加到Group中时&#xff0c;它们会以一个单元格的形式被处理&#xff0c;参与Group的某些操作&#xff0c;例如位置更新、…

一文熟悉新版llama.cpp使用并本地部署LLAMA

0. 简介 最近是快到双十一了再给大家上点干货。去年我们写了一个大模型的系列&#xff0c;经过一年&#xff0c;大模型的发展已经日新月异。这一次我们来看一下使用llama.cpp这个项目&#xff0c;其主要解决的是推理过程中的性能问题。主要有两点优化&#xff1a; llama.cpp …

基于 Python flask 的微博舆论情感分析,微博大数据可视化系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

【编码】【特征选择】【降维】

简要介绍 编码&#xff08;Encoding&#xff09; 编码是将原始数据转换为模型能够理解和处理的格式的过程。常见的编码方法包括&#xff1a; 标签编码&#xff08;Label Encoding&#xff09;&#xff1a; 适用于类别较少的分类数据。将每个类别映射到一个唯一的整数。独热编…

大数据之多级缓存方案

多级缓存介绍&#xff1f;多级缓存优缺点&#xff0c;应用场景&#xff1f;多级缓存架构&#xff1f; 多级缓存介绍 多级缓存方案是一种优化手段&#xff0c;通过在多个级别上存储数据来提高应用程序的性能和响应速度。以下是对多级缓存方案的详细解析&#xff1a; 一、多级缓…

HBuilderX运行微信小程序,编译的文件在哪,怎么运行

1. 点击HBuilderX顶部的运行-运行到小程序模拟器-微信开发者工具&#xff0c;就会开始编译 2. 编译完成后的文件在根目录找到 unpackage -- dist -- dev -- mp-weixin, 这里面就是编译后的文件&#xff0c;如果未跳转到开发者工具&#xff0c;那可能是没设置启动路径&#xff0…

Git超详细笔记包含IDEA整合操作

git超详细笔记 文章目录 git超详细笔记第1章Git概述1.1、何为版本控制1.2、为什么需要版本控制1.3、版本控制工具1.4 、Git简史1.5、Git工作机制1.6 、Git和代码托管中心 第2章Git安装第3章Git常用命令3.1、设置用户签名3.2、初始化本地库本地库&#xff08;Local Repository&a…

人工智能理论之opencv图像预处理、数据库、GUI布局的综合应用(图像预处理版块)

文章目录 前言图像预处理卷积核概念图像平滑处理高斯滤波 双边滤波中值滤波Canny边缘检测图像形态学操作形态学梯度顶帽小结 图片预处理1.引入库 图像预处理错误尝试成功运行 总结 前言 对前面学习综合应用的总结&#xff0c;不单是一个版块&#xff0c;而是三个版块综合到一起…

Nginx(编译)+Lua脚本+Redis 实现自动封禁访问频率过高IP

1.安装lua 1.1安装LuaJIT yum install readline-devel mkdir -p lua-file cd lua-file/ wget https://github.com/LuaJIT/LuaJIT/archive/refs/tags/v2.0.5.tar.gz tar -zxvf LuaJIT-2.0.5.tar.gz cd LuaJIT-2.0.5 make && make install PREFIX/usr/local/luajit 1.2…

【python程序】恢复曾经删除的QQ说说

是否还能想起曾经的QQ说说&#xff0c;是否还想知道自己以前删除了什么 今天就给大家介绍下这个可以恢复以前删除的QQ说说的 小工具 这个工具是由python编写的&#xff0c;也已经打包好了小程序&#xff0c;一键运行 具体下载地址&#xff1a;https://pan.quark.cn/s/b3f41e3…

【统计子矩阵——部分前缀和+双指针】

题目 代码 #include <bits/stdc.h> using namespace std; typedef long long ll; const int N 510; int s[N][N]; int main() {ios::sync_with_stdio(0);cin.tie(0);int n, m, k;cin >> n >> m >> k;for(int i 1; i < n; i)for(int j 1; j <…