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

vue中附件下载及打印功能

1.附件dom
注:fileList是由后台返回的附件数组,数组中包含附件名称fileName,附件地址url,附件id等信息

<el-form-item label="附件" style="width: 100% !important;" v-if="modelType=='borrowDetail'">
          <div v-for="item in fileList" :key="item.fileName">
            <span style="color:#6392E7; display:inline-block; margin-right:30px;" >{{item.fileName}}</span>
            <el-button type="text" size="small"  :disabled="isAllowDownload=='0'" @click="downloadFile(item)"> 下载 </el-button>
            <el-button type="text" size="small" :disabled="isAllowPrint=='0'"  @click="printDocument(item)"> 打印 </el-button>
           </div>
        </el-form-item>

2.安装打印pdf文件的 pdfjs-dist 依赖

npm install pdfjs-dist

3.如果您使用 Webpack,可能需要配置 worker-loader 来处理 pdfjs-dist 的 Worker 文件,安装 worker-loader

npm install --save-dev worker-loader

4.在代码中导入pdfjsLib及设置 Worker

import * as pdfjsLib from 'pdfjs-dist';
// 设置 Worker 路径
pdfjsLib.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjsLib.version}/pdf.worker.min.js`;

5.安装打印doc/docx文件的依赖,安装 mammoth.js,这是一个可以解析 DOCX 文件的库

npm install mammoth

6.导入mammoth

import mammoth from 'mammoth';

7.下载downloadFile方法

 /*附件下载事件*/
    downloadFile(file){
      this.download('system/attachment/download', {
        attachmentId:file.attachmentId
      }, `${file.fileName}`)
    },

8.打印printDocument方法

   /*附件点击打印事件*/
   注:item是由后台返回的附件数组,数组中包含附件名称fileName,附件地址url,附件id等信息
    printDocument(item) {
      // 获取文件的扩展名
      const fileExtension = item.fileName.split('.').pop().toLowerCase();

      // 根据扩展名判断文件类型并调用相应方法
      if (fileExtension === 'pdf') {
        this.printPDF(item);
      } else if (fileExtension === 'doc' || fileExtension === 'docx') {
        this.printDocx(item);
      } else {
        console.log('不支持的文件格式');
      }
    },
    /*打印doc文件方法*/
    async printDocx(item) {
      // 获取文件的 URL
      const fileUrl = item.url;

      try {
        // 使用 fetch 获取文件内容并转换为 Blob
        const response = await fetch(fileUrl);
        const fileBlob = await response.blob();

        // 创建 FileReader 读取 Blob 内容
        const reader = new FileReader();
        reader.onload = async () => {
          const result = await mammoth.convertToHtml({ arrayBuffer: reader.result });
          const html = result.value;

          // 打印文件内容
          const printWindow = window.open('', '', 'height=600,width=800');
          printWindow.document.write('<html><body>');
          printWindow.document.write(html);
          printWindow.document.write('</body></html>');
          printWindow.document.close();
          printWindow.print();
        };
        reader.readAsArrayBuffer(fileBlob); // 读取文件内容
      } catch (error) {
        console.error('Failed to fetch or read file:', error);
      }
    },
    /*打印Pdf方法*/
    async printPDF(file) {
      const loadingTask = pdfjsLib.getDocument(file.url);
      const pdf = await loadingTask.promise;
      const page = await pdf.getPage(1); // 打印第一页

      const viewport = page.getViewport({ scale: 1 });
      const canvas = document.createElement('canvas');
      const context = canvas.getContext('2d');

      canvas.height = viewport.height;
      canvas.width = viewport.width;
      await page.render({ canvasContext: context, viewport }).promise;

      const dataUrl = canvas.toDataURL();
      const img = new Image();
      img.src = dataUrl;
      img.onload = () => {
        const printWindow = window.open('', '', 'height=600,width=800');
        printWindow.document.write('<html><body>');
        printWindow.document.write('<img src="' + dataUrl + '" />');
        printWindow.document.write('</body></html>');
        printWindow.document.close();
        printWindow.print();
      };
    }


http://www.kler.cn/a/543973.html

相关文章:

  • 网络编程 day3
  • Dockerfiles 的 Top 10 常见 DevOps/SRE 面试问题及答案
  • 背靠背协议
  • 利用HTML和css技术编写学校官网页面
  • 利用邮件合并将Excel的信息转为Word(单个测试用例转Word)
  • STM32-知识
  • 372_C++_当有多个通道,开启不同告警的同一种的开关时,限制该开关的打开数量(比如视频上传开关)
  • 云计算——ACA学习 阿里云云计算服务概述
  • 虚拟机基础知识
  • C#常用集合优缺点对比
  • 2.5 使用注解进行单元测试详解
  • 【Prometheus】如何通过prometheus监控redis实时运行状态,并实现告警通知
  • 股指期货入门指南:股指期货的交割流程与机制
  • 域名解析错误—网络访问的“迷路”危机与应对指南
  • Redis 安装全攻略:在线、离线与交叉编译
  • Django开发入门 – 4.创建Django app
  • React(5)
  • lvs的DR模式
  • 企业级高并发全链路优化:流量分发、边缘防护与服务治理的整合之道
  • 【C++八股】静态局部变量/全局变量/局部变量的区别和使用场景
  • Redis混合持久化
  • 细说STM32F407单片机RTC的基本原理及闹钟和周期唤醒功能的使用方法
  • 在Windows 7操作系统,基于llama.cpp本地化部署 deepseek-r1模型的方法 2025-02-08
  • SQL-leetcode—1393. 股票的资本损益
  • 如何使用智能化RFID管控系统,对涉密物品进行安全有效的管理?
  • 计算机网络-MPLS基础概念