vue前端预览并下载doc、xls、pdf、txt及图片

doc、slx、pdf需要使用插件

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

下载后在文件内引入

import VueOfficeDocx from '@vue-office/docx'
  import '@vue-office/docx/lib/index.css'
  import VueOfficeExcel from '@vue-office/excel'
  import '@vue-office/excel/lib/index.css'
  import VueOfficePdf from '@vue-office/pdf'

在页面使用

<template>
  <vue-office-docx :src="url" />
  <vue-office-excel :src="url" />
  <vue-office-pdf :src="url" />
</template>

//url 是后端返回来的文件url路径

下3图展示 doc xls pdf 展示效果

如果嫌弃文件太多,也可以使用vue动态组件

<component :is="currentComponent" :src="previewUrl" ></component>

//currentComponent 是动态文件名,可以是vue-office-docx、vue-office-excel、vue-office-pdf
//previewUrl 是后端返回来的文件url路径

txt文本显示我使用<iframe>标签

<iframe :src="previewTxtUrl" frameborder="0" width="100%" height="600"></iframe>

//previewTxtUrl txt文件后端url路径

下图为展示效果(出现乱码是因为编码格式,如果使用谷歌浏览器预览utf-8会出现乱码,ansi正常显示)

下面的写法谷歌浏览器可以正常显示utf-8,但是ansi编码格式的会变成乱码

<iframe frameborder="0" id="myframe" width="100%" height="500"></iframe>

//下面为js代码
fetch('url地址')
.then(response => response.text())
.then(text => {
    var iframeDocument = document.getElementById('myframe').contentDocument || document.getElementById('myframe').contentWindow.document;
	iframeDocument.open();
	iframeDocument.write(text);
	iframeDocument.close();
});

图片的预览我直接用的<img>标签

<img :src="previewUrl" alt="" style="width: 100%;">

//previewUrl 图片路径地址

接下来是下载

doc、xls是可以直接使用window.open('url地址')

window.open('url地址');

下载txt代码

//如果axios没挂载到vue原型上需要引入一下
import axios from 'axios'
downloadTxt(){
			//如果axios没挂载到vue原型上需要引入一下,挂在了就用this.$axios
			axios.get('url文件路径', {
			responseType: 'blob' // 得到文件流
			}).then((response) => {
				// console.log(response)
				// 创建一个Blob对象,包含文本内容
				const blob = new Blob([response.data], { type: 'application/;charset=utf-8' })
				// 创建一个临时的a标签用于下载
				const a = document.createElement('a')
				a.href = URL.createObjectURL(blob)
				a.download = '下载后的文件名'
				document.body.appendChild(a)
				a.click()
				document.body.removeChild(a)
			})
		},

下载pdf代码

downloadPdf(){
            fetch('下载文件url地址')
              .then((response) => response.blob())
              .then((blob) => {
                // 创建一个临时的URL对象
                const url = URL.createObjectURL(blob);
                // 创建一个隐藏的<a>标签,并设置其href属性为临时URL
                const a = document.createElement('a');
                a.href = url;
                a.download = '下载后的文件名'; // 设置下载的文件名
                a.style.display = 'none';
                // 将<a>标签添加到文档中,并模拟点击下载
                document.body.appendChild(a);
                a.click();
                // 下载完成后,移除<a>标签和临时URL对象
                document.body.removeChild(a);
                URL.revokeObjectURL(url);
              })
              .catch((error) => {
                console.error('下载文件时出错:', error);
              });
		},

下载图片

//调用下载
this.downloadByBlob('文件下载地址','文件名')    

 // 下载图片
      	downloadByBlob(url, name) {
			let image = new Image()
			image.setAttribute('crossOrigin', 'anonymous')
			image.src = url
			image.onload = () => {
			let canvas = document.createElement('canvas')
			canvas.width = image.width
			canvas.height = image.height
			let ctx = canvas.getContext('2d')
			ctx.drawImage(image, 0, 0, image.width, image.height)
			canvas.toBlob((blob) => {
				let url = URL.createObjectURL(blob)
				this.download(url, name)
				// 用完释放URL对象
				URL.revokeObjectURL(url)
			})
			}
		},
		download(href, name) {
			let eleLink = document.createElement('a')
			eleLink.download = name
			eleLink.href = href
			eleLink.click()
			eleLink.remove()
		},

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue预览docx、docpdfxlsxlsx文件,可以使用第三方库来实现。 对于docx、docxlsxlsx文件,可以使用`js-xlsx`库来进行解析和预览。该库可以将Excel文件转换为JSON格式,而对于Word文件,可以使用`docx.js`库来进行解析和预览。 对于pdf文件,可以使用`pdf.js`库来进行预览。该库可以通过Canvas将PDF文件渲染成图片,然后在Vue显示。 下面是一个示例代码,演示如何使用上述库来预览不同类型的文件: ```html <template> <div> <div v-if="fileType === 'docx' || fileType === 'doc'"> <div v-html="docContent"></div> </div> <div v-else-if="fileType === 'xls' || fileType === 'xlsx'"> <table> <tr v-for="row in excelData"> <td v-for="cell in row">{{ cell }}</td> </tr> </table> </div> <div v-else-if="fileType === 'pdf'"> <canvas ref="pdfCanvas"></canvas> </div> </div> </template> <script> import XLSX from 'xlsx'; import Docx from 'docx'; import pdfjsLib from 'pdfjs-dist'; export default { data() { return { fileType: '', docContent: '', excelData: [], }; }, mounted() { // 根据文件类型进行解析和预览 if (this.fileType === 'docx' || this.fileType === 'doc') { const reader = new FileReader(); reader.onload = (event) => { const content = event.target.result; const doc = new Docx(); doc.load(content); this.docContent = doc.getHtml(); }; reader.readAsArrayBuffer(this.file); } else if (this.fileType === 'xls' || this.fileType === 'xlsx') { const reader = new FileReader(); reader.onload = (event) => { const content = event.target.result; const workbook = XLSX.read(content, { type: 'array' }); const sheetName = workbook.SheetNames[0]; const worksheet = workbook.Sheets[sheetName]; this.excelData = XLSX.utils.sheet_to_json(worksheet, { header: 1 }); }; reader.readAsArrayBuffer(this.file); } else if (this.fileType === 'pdf') { const canvas = this.$refs.pdfCanvas; const ctx = canvas.getContext('2d'); pdfjsLib.getDocument(this.file).promise.then((pdf) => { pdf.getPage(1).then((page) => { const viewport = page.getViewport({ scale: 1.5 }); canvas.height = viewport.height; canvas.width = viewport.width; page.render({ canvasContext: ctx, viewport, }); }); }); } }, props: { file: { type: File, required: true, }, }, created() { // 根据文件后缀名判断文件类型 const fileExtension = this.file.name.split('.').pop(); if (fileExtension === 'docx' || fileExtension === 'doc') { this.fileType = 'docx'; } else if (fileExtension === 'xls' || fileExtension === 'xlsx') { this.fileType = 'xls'; } else if (fileExtension === 'pdf') { this.fileType = 'pdf'; } }, }; </script> ``` 在上述代码,根据文件后缀名判断文件类型,然后使用不同的库进行解析和预览。对于Word文件,使用`docx.js`库将文件解析为HTML格式,然后在Vue显示;对于Excel文件,使用`js-xlsx`库将文件解析为JSON格式,然后在Vue生成表格;对于PDF文件,使用`pdf.js`库将文件渲染成图片,然后在Vue显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值