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('');
          printWindow.document.write(html);
          printWindow.document.write('');
          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('');
        printWindow.document.write('+ dataUrl + '" />');
        printWindow.document.write('');
        printWindow.document.close();
        printWindow.print();
      };
    }

你可能感兴趣的:(前端,vue,vue.js,javascript)