当前位置: 首页 > news >正文

二进制流进行预览pdf、excel、docx

安装

  • @vue-office/docx:Word文档预览组件
  • @vue-office/excel:Excel文档预览组件
  • @vue-office/pdf:PDF文档预览组件
  • #docx文档预览组件
    npm install @vue-office/docx vue-demi#excel文档预览组件
    npm install @vue-office/excel vue-demi#pdf文档预览组件
    npm install @vue-office/pdf vue-demi

    引入

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

    使用

        <el-dialogv-model="previewDialogVisible":title="previewFileName"width="80%"height="80%"top="5vh":before-close="handlePreviewClose"destroy-on-close><div class="preview-container"><div class="preview-info"><!-- 加载状态 --><div v-if="loadingPreview" class="loading-container"><el-skeleton animated><template #template><el-skeleton-item variant="p" style="height: 300px" /></template></el-skeleton><p style="text-align: center; margin-top: 20px;">文件加载中...</p></div><!-- 2. 错误状态(加载失败时显示) --><div v-else-if="previewError" class="error-container"><el-icon color="#f56c6c" size="48" style="margin-bottom: 16px;"><CircleCloseFilled /></el-icon><p style="color: #f56c6c;">{{ previewError }}</p></div></div><!-- PDF文件预览 --><VueOfficePdfv-if="currentPreviewData?.fileType === 'pdf'":src="previewFileUrl"class="pdf-preview"@rendered="renderedHandler"@error="errorHandler"style="height: 70vh;"/><!-- docx文件预览 --><vue-office-docxv-else-if="['docx', 'doc'].includes(currentPreviewData?.fileType)":src="previewFileUrl"style="height: 70vh;"@rendered="renderedHandler"@error="errorHandler"/><!-- excel文件预览 --><vue-office-excelv-else-if="['xlsx', 'xls'].includes(currentPreviewData?.fileType)":src="previewFileUrl":options="options"style="height: 70vh;"@rendered="renderedHandler"@error="errorHandler"/><!-- 4. 不支持的文件格式(无匹配时显示) --><div v-else class="unsupported-container"><el-icon color="#909399" size="48" style="margin-bottom: 16px;"><InfoFilled /></el-icon><p style="color: #909399;">不支持当前文件格式({{ currentPreviewData?.fileType || '未知' }}),请点击"下载文件"查看</p></div></div><template #footer><div class="dialog-footer"><el-button @click="handlePreviewClose">关闭</el-button>
    <!--          <el-button type="primary" @click="handleDownloadCurrentFile">下载文件</el-button>--></div></template></el-dialog>

    通过二进制流转换成本地Blob文件 url 进行预览


// 获取文件扩展名
const getFileExtension = (fileName) => {if (!fileName) return ''return fileName.slice(((fileName.lastIndexOf('.') - 1) >>> 0) + 2).toLowerCase()
}// 名称点击事件
const handlePrintArchiveName = async (rowData) => {console.log(rowData.fileType)// 检查是否有预览权限if (!permission.value.download) {ElMessage.warning('您没有预览权限')return}// 检查是否有所需的文件信息if (!rowData.importFullFilePath && !rowData.filePath) {ElMessage.warning('文件信息不完整,无法预览')return}try {// 重置状态loadingPreview.value = truepreviewError.value = ''currentPreviewData.value = rowDatapreviewFileName.value = rowData.archiveName || '文件预览'let quryDomainUrl = changeUrl('xzspknowledgearchive', 'common/xzspknowledgearchive/downloadfile')const response = await commonPosts(quryDomainUrl, {businessFlg: 'download',moduleName: 'xzspknowledgearchive',uniqueId: rowData.uniqueId,fileName: rowData.filePath}, {repeatSubmit: false, // 按需传递防重复提交参数responseType: 'blob' // 关键:指定响应类型为 blob})// 5. 生成本地预览URL(核心步骤)const fileExt = getFileExtension(rowData.filePath)const mimeType = getMimeTypeByExt(fileExt)// 用正确的 MIME 类型重新包装 Blob(解决类型缺失问题)const fileBlob = new Blob([response], { type: mimeType })previewFileUrl.value = URL.createObjectURL(fileBlob)// 显示预览弹窗previewDialogVisible.value = true// 延迟关闭加载状态,给文件一些加载时间setTimeout(() => {loadingPreview.value = false}, 1000)} catch (error) {console.error('预览失败:', error)loadingPreview.value = falsepreviewError.value = '文件预览失败,请重试'ElMessage.error('文件预览失败,请重试')}
}// 新增:根据文件后缀获取 MIME 类型的工具函数
const getMimeTypeByExt = (ext) => {const mimeMap = {// Office 文档xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',xls: 'application/vnd.ms-excel',docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',doc: 'application/msword',// 其他常见类型pdf: 'application/pdf',txt: 'text/plain',zip: 'application/zip'}return mimeMap[ext.toLowerCase()] || 'application/octet-stream' // 默认二进制类型
}// PDF渲染完成回调
const renderedHandler = () => {console.log('PDF渲染完成')loadingPreview.value = false
}// PDF渲染错误回调
const errorHandler = (error) => {console.error('PDF渲染失败:', error)loadingPreview.value = falsepreviewError.value = 'PDF文件渲染失败,请尝试下载查看'
}// 关闭预览弹窗
const handlePreviewClose = () => {previewDialogVisible.value = falsepreviewFileUrl.value = ''previewFileName.value = ''currentPreviewData.value = nullloadingPreview.value = falsepreviewError.value = ''
}

http://www.dtcms.com/a/362478.html

相关文章:

  • 手把手教你学 Simulink (1.3):探索Simulink模块库的奇妙世界
  • QT6(QFileSystemModel和QTreeView)
  • 第三方软件测评:第三方组件(如 jQuery、Bootstrap)的 WEB安全测试方法
  • Element Plus 表格表单校验功能详解
  • 封装Element UI中el-table表格为可配置列公用组件
  • ubantu20.04 git clone 无法连接问题与解决方法
  • Hard Disk Sentinel:全面监控硬盘和SSD的健康与性能
  • SQLSERVER基本cmd操作命令
  • 2025含金量高的市场岗位证书有哪些?
  • 4种有效方法将联想手机数据传输到电脑
  • 设计软件启动失败?“找不到vcruntime140.dll,无法继续执行代码” 场景化解决方案来了
  • 【Stream API】高效简化集合处理
  • 智能数据采集实战:从爬取到分析一步到位
  • 【音视频】VP8 与 VP9 技术详解及与 H.264 H.265 的对比
  • FFmpeg命令行音视频工具:高效实现格式转换与批量处理,支持音频提取与精准视频剪辑
  • 【LeetCode牛客数据结构】单链表的应用——环形链表及链表分割问题详解
  • 【音视频】WebRTC-NACK
  • 苹果手机文本转音频,自行制作背诵素材
  • CentOS 创建站点
  • 从零开始学习C#上位机开发学习进阶路线,窥探工业自动化和物联网应用
  • Windows---DWORD与IPVOID
  • milvus-standalone启动失败unhealthy,错误日志context deadline exceeded
  • 2023知识图谱与大模型融合实践研究报告
  • Centos10虚拟机安装Zabbix
  • ELK 统一日志分析系统部署与实践指南(下)
  • cv610单独烧录 ddr失败
  • 一、Scala 基础语法、变量与数据类型
  • CentOS交换区处理
  • 第5节:分布式文件存储
  • Nginx 全攻略:从部署到精通的实战指南(CentOS 环境)