ofd文件预览

文件列表

<template>
  <div>
    <div class='file' v-if='$myUtils.coll.isNotEmpty(filesList)'>
      <div class='file-view'>
        <div class='file-view-item' :style='{justifyContent: align }' v-for='(item, index) in filesList' :key='index'>
          <img class='file-view-item-icon' alt=''
               :src='require(`@/assets/file/${getFileSuffix(item.fileSuffix)}.png`)' />
          <template v-if='isShowQuery(item)'>
            <div class='file-view-item-info file-view-item-infoHover' @click='previewFile(item)'>
              <a-tooltip placement='topLeft' :title='item.fileName + item.fileSuffix'>
                {{ item.fileName }}.{{ item.fileSuffix }}
              </a-tooltip>
            </div>
          </template>

          <template v-else>
            <div class='file-view-item-info'>
              <a-tooltip placement='top' :title='item.fileName + item.fileSuffix'>
                {{ item.fileName }}.{{ item.fileSuffix }}
              </a-tooltip>
            </div>
          </template>

          <img class='file-view-item-icon mr-5' alt='' @click="downloadFile(item)"
               :src='require(`@/assets/file/down.png`)' />
        </div>
      </div>
    </div>

    <div v-else class='not-file'>
      暂无文件
    </div>

    <my-a ref='myA'></my-a>

  </div>
</template>

<script>
import { filesApiGetListByIds, getPreviewFileUrl, getDownLoadFileUrl } from '@/api/system/files'
import MyA from '@/components/My/MyA'

let fileMap = {
  image: ['png', 'jpeg', 'jpg'],
  word: ['doc', 'docx', 'wps'],
  pdf: ['pdf'],
  ofd: ['ofd'],
  excel: ['xls', 'xlsx'],
  zip: ['zip', 'rar'],
  pptx: ['ppt', 'pptx'],
  bin: ['bin'],
  txt: ['txt'],
  deb: ['deb']
}

export default {
  name: 'MyFileListMinor',
  components: {
    MyA
  },
  props: {
    filesIds: [String, Array],
    emptyText: {
      type: String,
      default: '暂无文件'
    },
    align: {
      type: String,
      default: 'left'
    }
  },
  filters: {
    toKB(val) {
      return (Number(val) / 1024).toFixed(0)
    }
  },
  watch: {
    filesIds: {
      handler: function(filesIds) {
        if (filesIds != null
          && (this.$myUtils.str.isNotEmpty(filesIds)
            || this.$myUtils.coll.isNotEmpty(filesIds))) {
          this.getFilesList(filesIds)
        } else {
          this.filesList = []
        }
      },
      immediate: true
    }
  },
  data() {
    return {
      filesList: []
    }
  },
  methods: {
    getFileSuffix(suffix) {
      let result = ''
      if (fileMap.word.indexOf(suffix) !== -1) {
        result = 'word'
      } else if (fileMap.pdf.indexOf(suffix) !== -1) {
        result = 'pdf'
      } else if (fileMap.ofd.indexOf(suffix) !== -1) {
        result = 'ofd'
      } else if (fileMap.excel.indexOf(suffix) !== -1) {
        result = 'xlsx'
      } else if (fileMap.image.indexOf(suffix) !== -1) {
        result = 'image'
      } else if (fileMap.zip.indexOf(suffix) !== -1) {
        result = 'zip'
      } else if (fileMap.pptx.indexOf(suffix) !== -1) {
        result = 'ppt'
      } else if (fileMap.bin.indexOf(suffix) !== -1) {
        result = 'bin'
      } else if (fileMap.txt.indexOf(suffix) !== -1) {
        result = 'txt'
      } else {
        result = 'other'
      }
      return result
    },
    /**
     * 是否显示查看按钮
     * @param item
     * @returns {boolean}
     */
    isShowQuery(item) {
      let show = false
      if (item) {
        switch (item.fileSuffix) {
          case 'pdf':
          case 'doc':
          case 'docx':
          case 'ofd':
          case 'jpg':
          case 'png':
          case 'jpeg':
            show = true
        }
      }
      return show
    },
    /**
     * 文件预览
     * @param {*} files
     */
    previewFile(files) {
      if ('ofd' === files.fileSuffix) {
        const routeData = this.$router.resolve({
          path: '/ofd/preview',
          query: {
            id: files.fileId
          }
        });
        window.open(routeData.href, "_blank");
      } else {
        const url = getPreviewFileUrl(files.fileId)
        this.$refs.myA.target(url)
      }
    },
    /**
     * 文件下载
     * @param {*} files
     */
    downloadFile(files) {
      const url = getDownLoadFileUrl(files.fileId)
      this.$refs.myA.target(url)
    },
    getFilesList(filesIds) {
      let ids = ''
      if (filesIds.constructor == String) {
        ids = filesIds
      } else {
        ids = filesIds.join()
      }
      filesApiGetListByIds(ids).then(res => {
        this.filesList = res.data
      })
    }
  }
}
</script>

<style lang='less' scoped>
@themeColor: #409eff;

.file {
  width: 100%;
  height: 100%;

  &-view {
    width: 100%;

    &-item {
      width: 100%;
      height: 100%;
      display: flex;
      align-items: center;
      box-sizing: border-box;

      &:not(:last-child) {
        margin-bottom: 3px;
      }

      &-icon {
        width: 20px;
        height: 20px;
        object-fit: cover;
        cursor: pointer;
      }

      &-info {
        font-family: "Arial Negreta", "Arial Normal", "Arial", sans-serif;
        font-size: 14px;
        text-align: left;
        margin-left: 5px;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
        cursor: pointer;
      }

      &-infoHover {
        color: @themeColor;
        &:hover {
          text-decoration: underline;
        }
      }
    }
  }
}

.mr-5 {
  margin-left: 5px;
}

.not-file {
  font-family: "Arial Negreta", "Arial Normal", "Arial", sans-serif;
  font-size: 14px;
}
</style>

文件预览为ofd时走ofd预览,否则走正常的预览文件接口

previewFile(files) {
      if ('ofd' === files.fileSuffix) {
        const routeData = this.$router.resolve({
          path: '/ofd/preview',
          query: {
            id: files.fileId
          }
        });
        window.open(routeData.href, "_blank");
      } else {
        const url = getPreviewFileUrl(files.fileId)
        this.$refs.myA.target(url)
      }
    },

ofd文件预览组件

<template>
  <div class="main-section" id="content" ref="contentDiv" @mousewheel="scrool"></div>
</template>

<script>
import {parseOfdDocument, renderOfd, digestCheck, getPageScale} from '@/utils/ofd/ofd';
import {getPreviewFileUrl} from "@/api/system/files";
import axios from 'axios';

export default {
  name: 'preview',
  data() {
    return {
      docleft: 0,//公章距离左侧文档边缘的距离
      leftMenu_width: 0,//左侧菜单宽度
      ofdBase64: null,
      loading: false,
      pageIndex: 1,
      pageCount: 0,
      scale: 0,
      ofdObj: null,
      screenWidth: document.body.clientWidth,
    }
  },
  mounted() {
    this.screenWidth = document.body.clientWidth - this.leftMenu_width;
    this.$refs.contentDiv.addEventListener('scroll', this.scrool);
    this.getOfd(this.$route.query.id)
  },
  methods: {
    getOfd(id) {
      axios({
        url: getPreviewFileUrl(id),
        responseType: 'blob'
      }).then(res => {
        const files = new window.File([res.data], "ofd", {type: 'application/ofd'});
        this.getOfdDocumentObj(files, this.screenWidth);
      })
    },
    scrool() {
      let scrolled = this.$refs.contentDiv.firstElementChild?.getBoundingClientRect()?.top - 60;
      let top = 0
      let index = 0;
      for (let i = 0; i < this.$refs.contentDiv.childElementCount; i++) {
        top += (Math.abs(this.$refs.contentDiv.children.item(i)?.style.height.replace('px', '')) + Math.abs(this.$refs.contentDiv.children.item(i)?.style.marginBottom.replace('px', '')));
        if (Math.abs(scrolled) < top) {
          index = i;
          break;
        }
      }
      this.pageIndex = index + 1;
    },
    getOfdDocumentObj(file, screenWidth) {
      let that = this;
      this.loading = true;
      parseOfdDocument({
        ofd: file,
        success(res) {
          that.ofdObj = res[0];
          that.pageCount = res[0].pages.length;
          const divs = renderOfd(screenWidth, res[0]);
          that.displayOfdDiv(divs);
          that.loading = false;
        },
        fail(error) {
          that.loading = false;
          that.$alert('OFD打开失败', error, {
            confirmButtonText: '确定',
            callback: action => {
              this.$message({
                type: 'info',
                message: `action: ${action}`
              });
            }
          });
        }
      });
    },
    displayOfdDiv(divs) {
      this.scale = getPageScale();
      let contentDiv = document.getElementById('content');
      contentDiv.innerHTML = '';
      for (const div of divs) {
        contentDiv.appendChild(div)
      }
      for (let ele of document.getElementsByName('seal_img_div')) {
        this.addEventOnSealDiv(ele, JSON.parse(ele.dataset.sesSignature), JSON.parse(ele.dataset.signedInfo));
      }
    },
    addEventOnSealDiv(div, SES_Signature, signedInfo) {
      try {
        global.HashRet = null;
        global.VerifyRet = signedInfo.VerifyRet;
        div.addEventListener("click", function () {
          document.getElementById('sealInfoDiv').hidden = false;
          document.getElementById('sealInfoDiv').setAttribute('style', 'display:flex;align-items: center;justify-content: center;');
          if (SES_Signature.realVersion < 4) {
            document.getElementById('spSigner').innerText = SES_Signature.toSign.cert['commonName'];
            document.getElementById('spProvider').innerText = signedInfo.Provider['@_ProviderName'];
            document.getElementById('spHashedValue').innerText = SES_Signature.toSign.dataHash.replace(/\n/g, '');
            document.getElementById('spSignedValue').innerText = SES_Signature.signature.replace(/\n/g, '');
            document.getElementById('spSignMethod').innerText = SES_Signature.toSign.signatureAlgorithm.replace(/\n/g, '');
            document.getElementById('spSealID').innerText = SES_Signature.toSign.eseal.esealInfo.esID;
            document.getElementById('spSealName').innerText = SES_Signature.toSign.eseal.esealInfo.property.name;
            document.getElementById('spSealType').innerText = SES_Signature.toSign.eseal.esealInfo.property.type;
            document.getElementById('spSealAuthTime').innerText = "从 " + SES_Signature.toSign.eseal.esealInfo.property.validStart + " 到 " + SES_Signature.toSign.eseal.esealInfo.property.validEnd;
            document.getElementById('spSealMakeTime').innerText = SES_Signature.toSign.eseal.esealInfo.property.createDate;
            document.getElementById('spSealVersion').innerText = SES_Signature.toSign.eseal.esealInfo.header.version;
          } else {
            document.getElementById('spSigner').innerText = SES_Signature.cert['commonName'];
            document.getElementById('spProvider').innerText = signedInfo.Provider['@_ProviderName'];
            document.getElementById('spHashedValue').innerText = SES_Signature.toSign.dataHash.replace(/\n/g, '');
            document.getElementById('spSignedValue').innerText = SES_Signature.signature.replace(/\n/g, '');
            document.getElementById('spSignMethod').innerText = SES_Signature.signatureAlgID.replace(/\n/g, '');
            document.getElementById('spSealID').innerText = SES_Signature.toSign.eseal.esealInfo.esID;
            document.getElementById('spSealName').innerText = SES_Signature.toSign.eseal.esealInfo.property.name;
            document.getElementById('spSealType').innerText = SES_Signature.toSign.eseal.esealInfo.property.type;
            document.getElementById('spSealAuthTime').innerText = "从 " + SES_Signature.toSign.eseal.esealInfo.property.validStart + " 到 " + SES_Signature.toSign.eseal.esealInfo.property.validEnd;
            document.getElementById('spSealMakeTime').innerText = SES_Signature.toSign.eseal.esealInfo.property.createDate;
            document.getElementById('spSealVersion').innerText = SES_Signature.toSign.eseal.esealInfo.header.version;
          }
          document.getElementById('spVersion').innerText = SES_Signature.toSign.version;
          document.getElementById('VerifyRet').innerText = "文件摘要值后台验证中,请稍等... " + (global.VerifyRet ? "签名值验证成功" : "签名值验证失败");
          if (global.HashRet == null || global.HashRet == undefined || Object.keys(global.HashRet).length <= 0) {
            setTimeout(function () {
              const signRetStr = global.VerifyRet ? "签名值验证成功" : "签名值验证失败";
              global.HashRet = digestCheck(global.toBeChecked.get(signedInfo.signatureID));
              const hashRetStr = global.HashRet ? "文件摘要值验证成功" : "文件摘要值验证失败";
              document.getElementById('VerifyRet').innerText = hashRetStr + " " + signRetStr;
            }, 1000);
          }
        });
      } catch (e) {
        console.log(e);
      }
      if (!global.VerifyRet) {
        div.setAttribute('class', 'gray');
      }
    }

  }
}
</script>

<style scoped>
.main-section {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  position: relative;
  margin: 10px auto 0;
  border: 1px solid #f7f7f7;
  box-shadow: 0 3px 10px 0 rgba(76, 101, 123, 0.12);
}
</style>

将文件引入到src下在这里插入图片描述
资源在笔记里面找一下

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

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

相关文章

纵深发力 持续推进,富格林平台发展势头喜人

自2024年2月1日正式上线以来,富格林互联网投融资平台已迅速崛起,吸引了业内专家学者的高度认可以及广大投资者的青睐。平台规模持续扩大,目前累计注册用户已超过10万人,总投资额突破50亿美元。这一卓越表现不仅体现了平台的稳健运营和出色的投资项目,也展示了其在互联网投融资领…

产品应用 | 小盒子跑大模型!英码科技基于算能BM1684X平台实现大模型私有化部署

当前&#xff0c;在人工智能领域&#xff0c;大模型在丰富人工智能应用场景中扮演着重要的角色&#xff0c;经过不断的探索&#xff0c;大模型进入到落地的阶段。而大模型在落地过程中面临两大关键难题&#xff1a;对庞大计算资源的需求和对数据隐私与安全的考量。为应对这些挑…

typora+Picgo使用Lsky pro搭建本地服务图床

typoraPicgo使用Lsky pro搭建本地服务图床 Picgo下载lankong插件lankong插件安装Auth token获取 Picgo测试typora测试问题说明 Picgo下载 Picgo下载&#xff1a;https://github.com/Molunerfinn/PicGo/releases&#xff0c;注意&#xff1a;请直接使用尝鲜版&#xff0c;正式版…

一文让你清晰了解医疗行业采购堡垒机的必要性

医疗行业&#xff0c;一个与大家息息相关的行业。随着医疗行业的快速发展和信息化建设的深入推进&#xff0c;传统网络安全防护手段已经难以满足现代医疗信息系统的安全需求&#xff0c;特别是在处理敏感的患者信息和保障医院内部数据安全方面。因此采购堡垒机是非常必要的。 堡…

python310: pip install Could not install packages (HTTPSConnectionPool)问题

一、问题描述 在使用pip install安装包或者升级pip版本&#xff08;pip install --upgrade pip&#xff09;时遇到以下错误&#xff1a; WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connection broken by ReadTimeoutError(…

github ssh key的SHA256是什么

github ssh key的SHA256是什么 怎么知道github上自己的公钥指纹和本地的公钥是否一致&#xff1f; 计算方法如下&#xff1a; cat .ssh/id_rsa.pub |awk { print $2 } | # Only the actual key data without prefix or commentsbase64 -d | # decode as base64s…

面向对象编程重载

系列文章目录 文章目录 系列文章目录前言一、重载&#xff08;overload&#xff09; 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了…

现货白银实时交易平台的成长阶段 你出在哪个阶段?

很多人喜欢在现货白银平台上做模拟交易&#xff0c;因为他们认为现货白银实时交易平台上交易太痛苦了&#xff0c;不光随时会面临风险&#xff0c;而且还可能让自己出现大的亏损。如果投资者认为痛苦&#xff0c;那笔者觉得投资者不妨将在现货白银实时交易平台上做交易&#xf…

nodejs 某音douyin网页端搜索接口及x_bogus、a_bogus(包含完整源码)(2024-06-13)

前言 x_bogus或a_bogus算法大概是对数据、ua、时间戳、浏览器的几个指纹进行计算&#xff0c;拿到一个110位大数组&#xff0c;然后转字符&#xff0c;在头部再添加十二位随机字符&#xff0c;再进行魔改的base64加密。 问&#xff1a;抖音的x_bogus、a_bogus值有什么用&#x…

win10 双显卡,双显示器,VGA那个经常出现息屏(待机后无法唤醒),必须重启才能解决,(图文)手把手教你如何处理简单愉快的解决。

一、问题 双显示器&#xff08;双显卡&#xff0c;其中一个是HDMI&#xff0c;一个是VGA&#xff09;window系统&#xff08;本机win10&#xff09;&#xff0c;经常莫名出现&#xff0c;在待机或者主动息屏后&#xff0c;VGA显示器无法唤醒&#xff0c;依然黑屏&#xff0c;不…

蚂蚁集团:2023年科研投入211.9亿元

6月13日&#xff0c;蚂蚁集团发布2023年可持续发展报告。报告显示&#xff0c;2023年蚂蚁集团科研投入达到211.9亿元&#xff0c;再创历史新高&#xff0c;蚂蚁科技投入的重点是人工智能和数据要素技术。 蚂蚁集团董事长兼CEO井贤栋在报告致辞中说&#xff0c;面向未来&#x…

Java项目:110 springboot夕阳红公寓管理系统的设计与实现

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本系统有管理员&#xff0c;租客 管理员权限操作的功能包括对租客&#xff0c;访客&#xff0c;缴费&#xff0c;维修&#xff0c;留言&#xff0c;公…

如何使用CCS9.3打开CCS3.0工程

如何使用CCS9.3打开CCS3.0工程 点菜单栏上的project&#xff0c;选择Import Legacy CCSv3.3 Porjects…&#xff0c;弹出对话框&#xff0c;通过Browse…按钮导入一个3.3版本的工程项目&#xff1b; 选择.pjt文件&#xff0c;选择Copy projects into worlkspace 右击选择P…

2001-2023年上市公司数字化转型测算数据(含原始数据+处理代码+计算结果)

2001-2023年上市公司数字化转型测算数据&#xff08;含原始数据处理代码计算结果&#xff09;&#xff08;吴非&#xff09; 1、时间&#xff1a;2001-2023年 2、来源&#xff1a;上市公司年报 3、指标:行业代码、行业名称、证券简称、是否发生ST或ST或PT、是否发生暂停上市…

【ARM】MDK出现报错error: A\L3903U的解决方法

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决MDK出现报错error: A\L3903U这样类型的报错 2、 问题场景 电脑或者软件因为意外情况导致崩溃&#xff0c;无法正常关闭&#xff0c;强制电脑重启之后&#xff0c;打开工程去编译出现下面的报错信息&#xff08;…

Node-Red和IOT-Tree中的消息流对软件开发的一点思考

上一篇文章IOT-Tree 1.7.0实现了一个类似Node-Red的流程功能中&#xff0c;我提到了如下文字内容&#xff1a; 通过这样的图形化编程机制把软件开发直接分成了两个层次。 1. 一个是应用层面&#xff0c;给用户、项目实施技术人员或维护人员能够在不需要掌握深入技术的前提下&am…

颈肌筋膜炎怎么治疗

颈肌筋膜炎的症状主要包括&#xff1a; 1、疼痛&#xff1a;疼痛多局限于项部&#xff0c;两侧为重&#xff0c;晨起时明显&#xff0c;活动后减轻&#xff0c;阴雨天时可能加重。疼痛以持续性酸胀疼痛为特点&#xff0c;严重时可能伴有头痛、肩、背痛。 2、压痛&#xff1a;在…

从零开始写 Docker(十八)---容器网络实现(下):为容器插上”网线“

本文为从零开始写 Docker 系列第十八篇&#xff0c;利用 linux 下的 Veth、Bridge、iptables 等等相关技术&#xff0c;构建容器网络模型&#xff0c;为容器插上”网线“。 完整代码见&#xff1a;https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实…

【论文阅读】《Sketch and Refine: Towards Fast and Accurate Lane Detection》

Abstract 车道检测是指确定道路上车道的精确位置和形状。尽管目前的方法已经做出了努力&#xff0c;但由于现实世界场景的复杂性&#xff0c;这仍然是一项具有挑战性的任务。无论是基于建议的方法还是基于关键点的方法&#xff0c;现有方法都无法有效、高效地描绘车道。基于建…

JAVA动态表达式:Antlr4 表达式树解析

接上面 JAVA动态表达式&#xff1a;Antlr4 G4 模板 读取字符串表达式结构树-CSDN博客 目前已经实现了常量及分组常规表达式的解析。 String formula "啦啦啦1 and 11 and 23 and 1123 contains 1 and 23455 notcontains 5"; String formula "啦啦啦1 and (…