【Vue】word / excel / ppt / pdf / 视频(mp4,mov) 预览

文件预览

    • Vue3
    • 一. word
    • 二. excel
    • 三. ppt
    • 四. pdf
      • 4.1 vue-pdf-embed
      • 4.2 iframe
    • 五. 视频
    • 六:扩展——kkFileView

Vue3

一. word

  1. 安装:npm install docx-preview
  2. 父页面
<template>
	<div>
		<DocPreview
          v-if="filePath.includes('docx')"
          :doc-url="filePath"
        />
	</div>
</template>
<script setup>
import DocPreview from '@/components/DocPreview'
const filePath = ref('https://xxxxxxxxxxxx.docx') 
</script>
  1. 组件
    路径:@/components/DocPreview
<!-- word 文档阅读 -->
<template>
  <div>
    <div v-if="message" class="doc-empty">{{ message }}</div>
    <div v-else class="doc-render-wraper">
      <div ref="fileRef">
        <div ref="fileStyleRef"></div>
      </div>
    </div>
  </div>
</template>

<script setup>
import axios from 'axios'
// const docx = require('docx-preview')
import { renderAsync } from 'docx-preview'

const props = defineProps({
  // 文档地址
  docUrl: {
    type: String,
    default: ''
  }
})

const service = axios.create({
  baseURL: props.docUrl,
  timeout: 600000
})
const fileRef = ref(null)
const fileStyleRef = ref(null)
const message = ref('')
// 预览
const init = async () => {
  const { data } = await service({
    method: 'get',
    responseType: 'blob'
  })
  // console.log(data)
  if (data.size === 0) {
    message.value = '当前文档内容为空,无可阅读内容'
  } else {
    message.value = ''
    renderAsync(data, fileRef.value, fileStyleRef.value)
  }
}

watch(
  () => props.docUrl,
  newVal => {
    if (newVal !== null && newVal !== '') {
      init()
    }
  }
)

init()
</script>
<style lang="scss" scoped>
.doc-render-wraper {
  width: 840px;
  padding-top: 10px;
  margin: 0 auto;
  overflow-x: auto;

  // fileStyleRef css
  > div {
    border: 1px solid #e6edf5;
  }
}
.doc-empty {
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 14px;
  color: #0f5c9f;
  background-color: #e6edf5;
  width: 100%;
  height: 50px;
}
</style>

二. excel

在这里插入图片描述

  1. 安装:npm install @vue-office/excel
  2. 父页面
<template>
	<div>
		<XlsxPreview :xlsx-url="filePath" />
	</div>
</template>
<script setup>
import XlsxPreview from '@/components/XlsxPreview'
</script>
  1. 组件
<!-- excel 文档阅读 -->
<template>
  <div class="xlsx-preview">
    <vue-office-excel :src="source" class="vue-office-excel" />
  </div>
</template>
<script setup>
// 引入VueOfficeExcel组件
import VueOfficeExcel from '@vue-office/excel'
// 引入相关样式
import '@vue-office/excel/lib/index.css'
const props = defineProps({
  // 文档地址
  xlsxUrl: {
    type: String,
    default: ''
  }
})
const source = ref(props.xlsxUrl)
</script>
<style lang="scss" scoped>
.xlsx-preview {
  width: 840px;
  height: 100%;
  padding: 20px 0;
  margin: 0 auto;
  box-sizing: border-box;
}
.vue-office-excel {

  width: 100%;
  height: 100%;
  border: 1px solid #e5e5e5;
  margin: 0 auto;
  box-sizing: border-box;
}
</style>

三. ppt

  1. 官网:https://github.com/meshesha/PPTXjs
    demo:https://pptx.js.org/pages/demos.html
  2. 注意:先引入pptjs
    在这里插入图片描述
    在这里插入图片描述
  3. 父文件
<template>
	<div>
		<PptxPreview :pptx-url="filePath" />
	</div>
</template>
<script setup>
import PptxPreview from '@/components/PptxPreview/index.vue'
const filePath = ref("")

</script>
  1. 组件
<!-- pptx 文档阅读 -->
<template>
  <div class="xlsx-preview">
    <div class="page-tool">
      <div class="page-tool-item" @click="pageZoomOut">放大</div>
      <div class="page-tool-item" @click="pageZoomIn">缩小</div>
    </div>
    <!-- <div style="display: grid; place-content: center; color: darkgrey">pptx文件暂时无法预览~~~</div> -->
    <div style="height: 1200px; width: 90%; zoom: 0.5; overflow-y: auto; overflow-x: auto; margin: 0 30px">
      <div
        id="your_div_id_result"
        style="position: relative"
        :style="`transform:scale(${size});transform-origin:0% 0%`"
      ></div>
    </div>
  </div>
</template>
<script setup>
const props = defineProps({
  // 文档地址
  pptxUrl: {
    type: String,
    default: ''
  }
})
const size = ref(1)
function init(newVal) {
  $('#your_div_id_result').pptxToHtml({
    pptxFileUrl: newVal,
    slidesScale: '50%'
  })
}
onBeforeUnmount(() => {
  $('#your_div_id_result').empty()
})
const pageZoomOut = () => {
  if (size.value < 3) {
    size.value += 0.1
  }
}
const pageZoomIn = () => {
  if (size.value > 0.8) {
    size.value -= 0.1
  }
}
watch(
  () => props.pptxUrl,
  newVal => {
    if (newVal) {
      setTimeout(() => {
        init(newVal)
      }, 1000)
    }
  },
  { immediate: true }
)
</script>
<style lang="scss" scoped>
// import './css/pptxjs.css' import './css/nv.d3.min.css'
.xlsx-preview {
  width: 840px;
  height: 100%;
  // margin-left: 80px;
  padding: 20px 0;
  // margin: 0 auto;
  box-sizing: border-box;
}
.vue-office-excel {
  width: 100%;
  height: 100%;
  border: 1px solid #e5e5e5;
  margin: 0 auto;
  box-sizing: border-box;
}

.page-tool {
  display: flex;
  align-items: center;
  justify-content: center;
  margin-left: 50px;
  margin-bottom: 20px;
  padding: 8px 0;
  // width: 400px;
  width: 80%;
  text-align: center;
  background: #e6edf5;
  color: #0f5c9f;
  border-radius: 19px;
  cursor: pointer;
}

.page-tool-item {
  padding: 0 15px;
  padding-left: 10px;
  cursor: pointer;
}
</style>

  1. 缺陷
    (1)不支持上传jpg格式的图片:若ppt中含有jpg格式的图片,报错
    (2)支持仅pptx文件格式

四. pdf

4.1 vue-pdf-embed

功能:放大、缩小、跳转到某页
在这里插入图片描述

  1. 安装: npm install vue-pdf-embed
  2. 父页面
<template>
	<div>
		<PdfPreview :key="fileIndex" :pdf-url="filePath" />
	</div>
<template>
<script setup>
const fileIndex = ref(0)
const filePath = ref(https://xxxxxxxxxxxxxxx.pdf)

</script>
  1. 组件
<template>
  <div class="pdf-preview">
    <div v-if="props.pdfUrl.indexOf('undefined') == -1" v-loading="pdfLoading">
      <div class="page-tool">
        <div class="page-tool-item" @click="lastPage">上一页</div>
        <div class="page-tool-item" @click="nextPage">下一页</div>
        <div class="page-tool-item">{{ state.pageNum }}/{{ state.numPages }}</div>
        <div class="page-tool-item" @click="pageZoomOut">放大</div>
        <div class="page-tool-item" @click="pageZoomIn">缩小</div>
        <div class="page-tool-item">前往</div>
        <el-input v-model.number="currentPage" style="width: 100px" @input="goToPage(currentPage)" /></div>
      <div class="pdf-wrap">
        <vue-pdf-embed
          ref="pdfRef"
          :source="{
            cMapUrl: 'https://cdn.jsdelivr.net/npm/pdfjs-dist@2.6.347/cmaps/',
            url: state.source,
            cMapPacked: true
          }"
          class="vue-pdf-embed"
          :style="`transform:scale(${state.scale});transform-origin:0% 0%`"
          :page="state.pageNum"
          @loading-failed="pdfLoading = false"
          @rendered="handleDocumentRender"
        />
      </div>
    </div>
  </div>
</template>
<script setup>
import { defineAsyncComponent } from 'vue'
const { proxy } = getCurrentInstance()
const VuePdfEmbed = defineAsyncComponent(() => import('vue-pdf-embed'))
const props = defineProps({
  pdfUrl: {
    type: String,
    required: true,
    default: ''
  }
})
const pdfLoading = ref(true)
const currentPage = ref(1)
const state = reactive({
  source: props.pdfUrl, // 预览pdf文件地址
  pageNum: 1, // 当前页面
  scale: 1, // 缩放比例
  numPages: 0 // 总页数
})

// 加载完成
const handleDocumentRender = () => {
  pdfLoading.value = false
  state.numPages = proxy.$refs.pdfRef.pageCount
}
const lastPage = () => {
  if (state.pageNum > 1) {
    state.pageNum -= 1
    currentPage.value = state.pageNum
  }
}

const nextPage = () => {
  if (state.pageNum < state.numPages) {
    state.pageNum += 1
    currentPage.value = state.pageNum
  }
}
const pageZoomOut = () => {
  if (state.scale < 3) {
    state.scale += 0.1
  }
}
const pageZoomIn = () => {
  if (state.scale > 0.8) {
    state.scale -= 0.1
  }
}

const goToPage = page => {
  if (page >= 1 && page <= state.numPages) {
    currentPage.value = page
    state.pageNum = page
  }
}
</script>
<style lang="scss" scoped>
.pdf-preview {
  //   position: relative;
  width: 840px;
  // height: 1250px;
  padding: 10px 0;
  margin: 0 auto;
  box-sizing: border-box;
}
.pdf-wrap {
  overflow-y: auto;
}
.vue-pdf-embed {
  text-align: center;
  width: 100%;
  border: 1px solid #e5e5e5;
  margin: 0 auto;
  box-sizing: border-box;
}

.page-tool {
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 10px auto;
  // width: 400px;
  width: 80%;
  text-align: center;
  background: #e6edf5;
  color: #0f5c9f;
  border-radius: 19px;
  cursor: pointer;
}

.page-tool-item {
  padding: 0 15px;
  padding-left: 10px;
  cursor: pointer;
}
</style>

4.2 iframe

<template>
	<div>
		<iframe type="application/pdf" :src="filePath"width="800" height="1000">
    	</iframe>
	</div>
<template>
<script setup>
const filePath = ref("")
<script>

五. 视频

在这里插入图片描述

  1. 支持格式:.mov,.mp4
  2. 父文件
<template>
	<div>
		<VideoPreview
          v-if="subfix == 'mp4' || 'mov')"
          :url="videoUrl"
          :isExport="isExport"
        />
	</div>
</template setup>
<script>
import VideoPreview from '@/components/VideoPreview'
const subfix = ref('mp4') // 视频文件后缀
const videoUrl = ref('')
const isExport = ref(true)
</script>
  1. 组件
<template>
  <div v-if="filePath" style="overflow-x: auto">
    <video
      oncontextmenu="return false;"
      :src="filePath"
      :style="`width: ${widths}% `"
      class="w-[218px] h-[140px] rounded-[4px] bg-second video"
      controls
      autoplay
      disablePictureInPicture
      :controlsList="isDownload ? 'noremoteplayback noplaybackrate' : 'noremoteplayback noplaybackrate nodownload'"
    >
      <source />
    </video>
  </div>
</template>
<script setup>
import dragWidthStore from '@/views/satisfiedEngineering/evaluationProcedure/store/dragWidth'
const widths = computed(() => dragWidthStore().width)
const filePath = ref('')
const isDownload = ref(false) // 是否给控件赋予下载权限
const props = defineProps({
  url: {
    type: String,
    default: ''
  },
  isExport: {
    type: Boolean,
    default: true,
    require: false
  }
})

watch(
  () => props.url,
  newValue => {
    filePath.value = newValue
  },
  { deep: true, immediate: true }
)

watch(
  () => props.isExport,
  newValue => {
    isDownload.value = newValue
  },
  { deep: true, immediate: true }
)
</script>

六:扩展——kkFileView

项目中没涉及到,大致记录一下

  1. 官网:https://kkfileview.keking.cn/kkFileView-4.1.0-docker.tar

  2. 支持格式
    在这里插入图片描述

  3. 组件

<!-- 文件预览
  支持 doc, docx, xls, xlsx, xlsm, ppt, pptx, csv, tsv, dotm, xlt, xltm, dot, dotx, xlam, xla, pages 等 Office 办公文档
  支持 wps, dps, et, ett, wpt 等国产 WPS Office 办公文档
  支持 odt, ods, ots, odp, otp, six, ott, fodt, fods 等OpenOffice、LibreOffice 办公文档
  支持 vsd, vsdx 等 Visio 流程图文件
  支持 wmf, emf 等 Windows 系统图像文件
  支持 psd, eps 等 Photoshop 软件模型文件
  支持 pdf ,ofd, rtf 等文档
  支持 xmind 软件模型文件
  支持 bpmn 工作流文件
  支持 eml 邮件文件
  支持 epub 图书文档
  支持 obj, 3ds, stl, ply, gltf, glb, off, 3dm, fbx, dae, wrl, 3mf, ifc, brep, step, iges, fcstd, bim 等 3D 模型文件
  支持 dwg, dxf, dwf, iges , igs, dwt, dng, ifc, dwfx, stl, cf2, plt 等 CAD 模型文件
  支持 txt, xml(渲染), md(渲染), java, php, py, js, css 等所有纯文本
  支持 zip, rar, jar, tar, gzip, 7z 等压缩包
  支持 jpg, jpeg, png, gif, bmp, ico, jfif, webp 等图片预览(翻转,缩放,镜像)
  支持 tif, tiff 图信息模型文件
  支持 tga 图像格式文件
  支持 svg 矢量图像格式文件
  支持 mp3,wav,mp4,flv 等音视频格式文件
  支持 avi,mov,rm,webm,ts,rm,mkv,mpeg,ogg,mpg,rmvb,wmv,3gp,ts,swf 等视频格式转码预览
  支持 dcm 等医疗数位影像预览
  支持 drawio 绘图预览

  Docker环境部署:
  网络环境方便访问docker中央仓库
  docker pull keking/kkfileview:4.1.0

  网络环境不方便访问docker中央仓库
  wget https://kkfileview.keking.cn/kkFileView-4.1.0-docker.tar
  docker load -i kkFileView-4.1.0-docker.tar -->
<template>
  <div>
    <iframe
      :src="`${containerUrl}/onlinePreview?url=` + encodeURIComponent(Base64.encode(fileUrl))"
      frameborder="0"
      class="fileView"
    >
    </iframe>
  </div>
</template>

<script setup>
import { Base64 } from 'js-base64'

const props = defineProps({
  // 浏览器访问容器地址
  containerUrl: {
    type: String,
    default: ''
  },
  // 文档地址
  fileUrl: {
    type: String,
    default: ''
  }
})
</script>
<style lang="scss" scoped>
.fileView {
  width: 800px;
  height: 1020px;
  border-width: 1px;
}
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Go-Taskflow:一个类似任务流的有向无环图(DAG)任务执行框架,集成了可视化和性能分析工具,旨在简化并行任务的复杂依赖管理】

Go-Taskflow是一个静态有向无环图&#xff08;DAG&#xff09;任务计算框架&#xff0c;它受到taskflow-cpp的启发&#xff0c;结合了Go语言的原生能力和简洁性&#xff0c;特别适合于并发任务中复杂的依赖管理。 Go-Taskflow的主要特点包括&#xff1a; 高可扩展性&#xff1…

两套环境同一个接口返回不一致的排查

最近遇到个文件下载的问题&#xff0c;在开发环境好好的&#xff0c;测试环境就不行404。查了接近两天才解决。整个思路做个记载。 问题描述&#xff1a;通过视图解析器下载项目中的静态资源文件模板。也就是sringboot的resource目录下的文件。开发环境下载正常&#xff0c;测…

PHP员工管理系统小程序

&#x1f4bc;高效管理&#xff0c;从“员工管理系统”开始&#x1f4bc; &#x1f4cb;【一键录入&#xff0c;信息整合】&#x1f4cb; 你是否还在为整理员工信息而手忙脚乱&#xff1f;纸质档案易丢失、电子表格易混乱&#xff0c;这些问题在“员工管理系统”面前都将迎刃…

MemoRAG:重新定义长期记忆的AI问答模型

MemoRAG模型是如何实现长记忆的&#xff1f; ©作者|Blaze 来源|神州问学 引言 随着人工智能的发展&#xff0c;AI问答模型在各种应用场景中表现出色&#xff0c;尤其是在信息检索和知识问答领域。传统的RAG模型通过结合外部知识库的实时检索与生成模型&#xff0c;极大地…

再次被约谈了

大家好&#xff0c;我又来了&#xff0c;从上周一开始&#xff0c;一直听到不好的传言&#xff0c;下午听说有些人被约谈了&#xff0c;看来裁员工作已经开始了 就在我坐立不安时&#xff0c;看到领导飞书发来信息&#xff1a; 看来终于轮到我了&#xff0c;虽然做好了心里准…

ELK的ElasticStack概念

目录 传送门前言一、ElasticStack是什么二、ElasticStack数据格式1、Elasticsearch的概述2、Elasticsearch核心概念&#xff08;1&#xff09;接近实时&#xff08;NRT&#xff09;&#xff08;2&#xff09;集群&#xff08;cluster&#xff09;&#xff08;3&#xff09;节点…

从零开始docker-compose入门教程,快速上手多容器管理!

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 docker-compose 📒📝 Docker Compose的作用📝 Docker Compose的安装1. 在Linux或macOS上安装2. 在Windows上安装3. 在Linux或macOS上卸载4. 在Windows上卸载📝 Docker Compose基本语法📝 示例:使用Docker Compose部署…

聚水潭到畅捷通T+的数据高效集成方案解析

聚水潭到畅捷通T的数据高效集成方案解析 聚水潭销售出库单到畅捷通销货单的高效数据集成方案 在企业日常运营中&#xff0c;数据的高效流转和准确对接是提升业务效率的关键。本文将分享一个实际案例&#xff0c;展示如何通过轻易云数据集成平台&#xff0c;将聚水潭奇门系统中…

Flink(一)

目录 架构处理有界与无界数据部署应用到任意地方运行任意规模应用利用内存性能 流应用流处理应用的基本组件流状态时间 应用场景事件驱动应用事件驱动应用的优势Flink如何支持事件驱动应用&#xff1f; 典型的事件驱动示例 数据分析应用流式分析应用的优势&#xff1f;Flink 如…

word怎么压缩文件大小?这几种压缩word文件方法超级好用!

word怎么压缩文件大小&#xff1f;在当今快节奏的工作环境中&#xff0c;Word文档已成为我们日常工作的得力助手&#xff0c;然而&#xff0c;随着文档数量的不断增加&#xff0c;文档体积的膨胀成为了一个亟待解决的问题&#xff0c;这不仅导致了存储空间的紧张&#xff0c;也…

【grafana+Prometheus(普罗米修斯)实现监控功能】

一、背景&#xff1a; 在性能测试的时候经常需要观察对应服务器的cpu、内存等指标,或者有些性能测试需要监控数据库的一些信息 二、监控服务器工具&#xff1a; 1、使用jmeter时可以自带监控服务的功能 缺点&#xff1a;只能在运行jmeter的时候才能实现监控功能 2、使用li…

WPF+MVVM案例实战(八)- 自定义开关控件封装实现

文章目录 1、案例运行效果2、项目准备2、功能实现1、控件模板实现2、控件封装1、目录与文件创建2、各文件功能实现 3、开关界面与主窗体菜单实现1、开关界面实现2、主窗体菜单实现 4、源代码获取 1、案例运行效果 2、项目准备 打开项目 Wpf_Examples&#xff0c;新建ToggleBut…

无法启动此程序win10玩游戏找不到d3dx9_43.dll缺失的五种常用有效解决方法

d3dx9_43.dll 是 DirectX 9 的一个关键组件&#xff0c;属于动态链接库&#xff08;DLL&#xff09;文件&#xff0c;由微软公司开发。DirectX 是一组用于多媒体应用的 API&#xff0c;包括 d3dx9_43.dll 在内的组件对游戏和图形应用程序至关重要。该文件主要负责提供3D图形渲染…

手机折叠屏贴膜应用

折叠手机贴膜的主要难点在于其独特的可折叠设计。折叠屏的弯曲部分对贴膜材料提出了更高要求&#xff0c;需要材料具备足够的柔韧性和耐折痕性&#xff0c;以避免在折叠过程中产生裂痕或脱落。此外&#xff0c;贴膜过程中需要确保无气泡、无褶皱&#xff0c;且能完美贴合屏幕的…

GPU 与 GPU 服务器:科技璀璨之星,开启无限未来

今天咱们要来聊聊在科技领域中闪闪发光的 GPU 和 GPU 服务器。这可真是一对厉害的 “科技搭档”&#xff0c;正以其卓越的性能成为众多行业发展的强大动力源。 先来说说 GPU 吧。它呀&#xff0c;一开始是为了满足图形处理的高要求而诞生的。但随着科技不断进步&#xff0c;人…

从零到一:打造你的专属待办事项应用,探索 Windows 11 开发新境界

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

7、基于爬虫+Flask+Echarts+MySQL的网易云评论可视化大屏

基于爬虫FlaskEchartsMySQL的网易云评论可视化大屏 1、前言2、实现2.1 挑选想要采集的歌曲评论2.2 构建爬虫2.2.1 采集歌曲评论2.2.2 清洗数据入库 2.3 搭建flask框架2.4 数据传值2.5 完整代码&数据集获取 1、前言 本项目是基于requests爬虫flaskecharts搭建的网易云评论的…

WASM 使用说明23事(RUST实现)

文章目录 1. wasm是什么1.1 chatgpt定义如下:1.2 wasm关键特性&#xff1a; 2. wasm demo2.1 cargo 创建项目2.2 编写code2.3 安装wasm-pack2.4 编译 3.1 html页面引用wasm代码&#xff08;js引用&#xff09;3.2 访问页面4 导入js function4.1 编写lib.rs文件&#xff0c;内容…

应用案例 | Panorama SCADA助力巴黎奥运会:保障赛事协调与安全

谈到2024年最受关注的体育盛事&#xff0c;巴黎奥运会无疑是焦点之一。作为全球瞩目的顶级赛事&#xff0c;它不仅汇集了来自世界各地的精英运动员&#xff0c;还点燃了全球观众的热情。然而&#xff0c;组织如此大规模的活动绝非易事。从大量游客通过公共交通涌入&#xff0c;…

基于SSM的宠物猫狗商业系统设计与实现

前言 当今社会已经步入了科学技术进步和经济社会快速发展的新时期&#xff0c;国际信息和学术交流也不断加强&#xff0c;计算机技术对经济社会发展和人民生活改善的影响也日益突出&#xff0c;人类的生存和思考方式也产生了变化。传统宠物猫狗商业采取了人工的管理方法&#…