前端OFD文件预览(vue案例cafe-ofd)

前端OFD文件预览(vue案例cafe-ofd)

0、提示

下面只有vue的使用示例demo ,官文档参考 cafe-ofd - npm

其他平台可以参考 ofd - npm

官方线上demo: ofd

1、安装包

npm install cafe-ofd --save

2、引入

import cafeOfd from 'cafe-ofd'
import 'cafe-ofd/package/index.css'
Vue.use(cafeOfd)

3、使用案例(借助了element的组件可以替换其他)

<template>

  <div style="padding: 20px 100px; font-size: 20px">
    <h1>ofd文件预览</h1>
    <h1>https://www.npmjs.***/package/cafe-ofd</h1>
    <h1>npm install cafe-ofd --save</h1>
    <h1>
      import cafeOfd from 'cafe-ofd' <br>
      import 'cafe-ofd/package/index.css'<br>
      Vue.use(cafeOfd)
    </h1>
    <el-upload
        class="upload-demo"
        ref="upload"
        action=""
        :on-preview="handlePreview"
        :file-list="fileList"
        :auto-upload="false">
      <el-button slot="trigger" size="small" type="primary">选取文件</el-button>
    </el-upload>
    <div style="width: 100%; height: 60vh; border: 1px solid red; background-color:#***c;" id="easyofd">
      <cafe-ofd ref="ofd" :filePath="file" @on-su***ess="load" @on-scroll="scroll">
        <div slot="header">
          <input type="file" ref="file" class="hidden" placeholder="选择文件" a***ept=".ofd" @change="fileChanged">
        </div>
        <div slot="footer" class="footer">
          <el-button @click="plus">放大</el-button>
          <el-button @click="minus">缩小</el-button>
          <el-button @click="pre" :disabled="currentNum <= 1">上一页</el-button>
          <el-input type="number" :min="1" :max="pageNum" v-model.number="currentNum" @change="pageChange(currentNum)"></el-input>
          <el-button @click="next" :disabled="currentNum >= pageNum">下一页</el-button>
          <el-button @click="print">打印</el-button>
        </div>
      </cafe-ofd>
    </div>
  </div>

</template>

<script>
export default {
  data(){
    return {
      fileList: [],
      currentNum: null,
      file: null,
      pageNum: null
    }
  },

  mounted() {
  },
  methods: {
    handlePreview(e){
      this.file = e.raw
    },
    load(val) {
      this.pageNum = val;
    },
    fileChanged() {
      this.file = this.$refs.file.files[0];
    },
    plus() {
      this.$refs.ofd.scale(1.1);
    },
    minus() {
      this.$refs.ofd.scale(-0.9);
    },
    next() {
      this.$refs.ofd.nextPage();
    },
    pre() {
      this.$refs.ofd.prePage();
    },
    pageChange(val) {
      this.$refs.ofd.goToPage(val);
    },
    print() {
      this.$refs.ofd.printFile();
    },
    scroll(val) {
      this.currentNum = val;
    }
  }
}
</script>

<style scoped>
.footer {
  padding: 0 20px;
  display: flex;
  justify-content: space-between;
  gap: 20px;
}
@media print {
  html,
  body,
  #app {
    height: auto;
    overflow: auto;
  }
}
</style>

4、案例-图示

5、封装的组件(我在项目中使用的、有使用el组件,只需传入File格式的OFD文件)

<template>
  <div class="previewOFDBox">
    <cafe-ofd
        v-show="file"
        ref="ofd"
        :width="500"
        :filePath="file"
        @on-su***ess="load"
        @on-scroll="scroll"
        :class="['previewOFD', fullScreen ? 'ofd_full_screen' : '']"
    >
      <div slot="footer" class="footer" style="position: absolute; right: 20px; bottom: 10px; z-index: 999">
        <el-button size="mini" circle icon="el-icon-plus" @click="plus"></el-button>
        <el-button size="mini" circle icon="el-icon-minus" @click="minus"></el-button>
        <el-tooltip v-if="fullScreen" effect="light" content="打印(如果打印预览异常,请将文件视图缩放至合适大小)" placement="top">
          <el-button size="mini" circle icon="el-icon-printer" @click="print"></el-button>
        </el-tooltip>
        <el-button size="mini" circle :icon="fullScreen ? 'el-icon-files' : 'el-icon-full-screen'" @click="full"></el-button>
      </div>
    </cafe-ofd>
    <div v-if="!file" style="position: absolute; top: 50%; left: 48%">
      暂无数据
    </div>
  </div>
</template>

<script>
export default {
  name: "previewOFD",
  props: {
    file: {
      type: File,
    }
  },
  data() {
    return {
      pageNum: 1,
      currentNum: null,
      fullScreen: false,
    }
  },
  methods: {
    // 加载成功
    load(val) {
      this.pageNum = val;
      this.$emit('su***ess')
    },
    fileChanged(file) {
      this.file = file
    },
    plus() {
      this.$refs.ofd.scale(1.1);
    },
    minus() {
      this.$refs.ofd.scale(-0.9);
    },
    next() {
      this.$refs.ofd.nextPage();
    },
    pre() {
      this.$refs.ofd.prePage();
    },
    pageChange(val) {
      this.$refs.ofd.goToPage(val);
    },
    print() {
      this.$refs.ofd.printFile();
    },
    scroll(val) {
      this.currentNum = val;
    },
    full(){
      this.fullScreen = !this.fullScreen
    }
  }
}
</script>

<style scoped>
.previewOFD {
  transition: all .5s;
}
.previewOFDBox {
  position: relative;
  width: 100%;
  height: 100%;
}
.ofd_full_screen {
  z-index: 9999;
  position: fixed;
  left: 0;
  top: 0;
  width: 100vw;
  height: 100vh;
  padding: 10px;
  box-shadow: 0 0 4px #000;
  background: rgba(0, 0, 0, 0.8);
}
</style>
转载请说明出处内容投诉
CSS教程_站长资源网 » 前端OFD文件预览(vue案例cafe-ofd)

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买