在vue中使用pdfjs

查看稳定的版本, 3.x 在vue2.6报错

https://www.jsdelivr.com/package/npm/pdfjs-dist?version=2.16.105


在package.js中加入

"pdfjs-dist": "2.16.105",


注意引入js的方式,使用 import 报错

const pdfjsLib = require("pdfjs-dist/legacy/build/pdf.js");


// 父页面的调用

handleShow(row) {

// window.open(process.env.VUE_APP_FILE + row.url);


// 使用组件页来预览

// this.$router.push({path:'/vpdf', params: {url: process.env.VUE_APP_FILE + row.url}})


// 在新标签页打开

let text = this.$router.resolve({

path: "/vpdf",

query: { url: process.env.VUE_APP_FILE + row.url },

});


window.open(text.href, "_blank");

}


/** vpdf.vue **/

<template>
  <div class="home_wrap">
    <div class="pdf_down">
      <!-- <div class="pdf_set_left" @click="scaleD">放大</div>
      <div class="pdf_set_middle" @click="scaleX">缩小</div> -->
    </div>
    <div
      :style="{ width: pdf_div_width, margin: '0 auto' }"
      @touchstart="touchstart"
      @touchmove="touchmove"
      @touchend="touchend"
    >
      <canvas
        v-for="page in pdf_pages"
        :id="'the_canvas' + page"
        :key="page"
      ></canvas>
    </div>
  </div>
</template>
<script>
let PDFJS = require("pdfjs-dist/legacy/build/pdf.js");
PDFJS.GlobalWorkerOptions.workerSrc = require("pdfjs-dist/legacy/build/pdf.worker.entry.js");
export default {
  props: {
    defaultSacleDelta: {
      type: Number,
      default: 1.1,
    },
    maxScale: {
      type: Number,
      default: 2,
    },
    minScale: {
      type: Number,
      default: 0.5,
    },
    defaultScale: {
      type: Number,
      default: 1.0,
    },
    // pdfSrc: {
    //   type: String,
    //   default: 'http://storage.xuetangx.com/public_assets/xuetangx/PDF/PlayerAPI_v1.0.6.pdf'
    // }
  },
  data() {
    return {
      currentScale: 0.5, //pdf放大系数
      pdf_pages: [],
      pdf_div_width: "",
      startX: 0,
      startY: 0,
      moveX: 0,
      moveY: 0,
      eLen: 0,
      touchDistance: null,
      startTime: null,
      previousPinchScale: 1,
      renderMode: false,
      pdfSrc: "",
    };
  },
  created() {
    this.currentScale = this.defaultScale;
  },
  mounted() {
    this.get_pdfurl();
  },
  methods: {
    scaleD() {
      //放大
      if (this.currentScale >= this.maxScale) {
        return;
      }
      this.currentScale = this.currentScale + 0.1;
      this._loadFile(this.pdfSrc);
    },
    scaleX() {
      //缩小
      if (this.currentScale <= this.minScale) {
        return;
      }
      this.currentScale = this.currentScale - 0.1;
      this._loadFile(this.pdfSrc);
    },
    get_pdfurl() {
      //获得pdf教案
      const url = this.$route.query.url;
      console.log(url);
      this.pdfSrc = url;
      //加载本地
      this._loadFile(this.pdfSrc);
      //线上请求
      //  this.$axios.get('')
      //  .then((res)=>{
      //  this.pdfSrc = res.url
      //  this._loadFile(this.pdfSrc)
      //  })
    },
    _loadFile(url) {
      console.log("_loadFile", this.currentScale);
      this.renderMode = false;
      let loadingTask = PDFJS.getDocument(url);
      loadingTask.promise.then((pdf) => {
        this.pdfDoc = pdf;
        this.pdf_pages = this.pdfDoc.numPages;
        this.$nextTick(() => {
          this._renderPage(1);
        });
      });
    },
    _renderPage(num) {
      const that = this;
      this.pdfDoc.getPage(num).then((page) => {
        let canvas = document.getElementById("the_canvas" + num);
        let ctx = canvas.getContext("2d");
        let dpr = window.devicePixelRatio || 1;
        let bsr =
          ctx.webkitBackingStorePixelRatio ||
          ctx.mozBackingStorePixelRatio ||
          ctx.msBackingStorePixelRatio ||
          ctx.oBackingStorePixelRatio ||
          ctx.backingStorePixelRatio ||
          1;
        let ratio = dpr / bsr;
        let viewport = page.getViewport({ scale: this.currentScale });
        canvas.width = viewport.width * ratio;
        canvas.height = viewport.height * ratio;
        canvas.style.width = viewport.width + "px";
        that.pdf_div_width = viewport.width + "px";
        canvas.style.height = viewport.height + "px";
        ctx.setTransform(ratio, 0, 0, ratio, 0, 0);
        let renderContext = {
          canvasContext: ctx,
          viewport: viewport,
        };
        page.render(renderContext);
        if (this.pdf_pages > num) {
          this._renderPage(num + 1);
        } else {
          this.renderMode = true;
        }
      });
    },
    touchstart(e) {
      console.log("touchstart");
      this.startTime = this._getTime();
      this.startX = e.touches[0].pageX;
      this.startY = e.touches[0].pageY;
      if (e.touches.length > 1) {
        let point1 = e.touches[0];
        let ponit2 = e.touches[1];
        let xLen = Math.abs(ponit2.pageX - point1.pageX);
        let yLen = Math.abs(ponit2.pageY - point1.pageY);
        this.touchDistance = this._getDistance(xLen, yLen);
        console.log("touchDistance", this.touchDistance);
      }
    },
    touchmove(e) {
      console.log("touchmove");
      this.moveX = e.touches[0].pageX;
      this.moveY = e.touches[0].pageY;
      this.eLen = e.touches.length;
      if (this.eLen > 1) {
        let point1 = e.touches[0];
        let ponit2 = e.touches[1];
        let xLen = Math.abs(ponit2.pageX - point1.pageX);
        let yLen = Math.abs(ponit2.pageY - point1.pageY);
        let distance = this._getDistance(xLen, yLen);
        if (this.touchDistance) {
          let pinchScale = distance / this.touchDistance;
          this.previousPinchScale = pinchScale > 1 ? pinchScale : 1;
          console.log("previousPinchScale", this.previousPinchScale);
        }
      }
    },
    touchend() {
      console.log("touchend");
      let timestamp = this._getTime();
      if (
        (this.moveX !== null && Math.abs(this.moveX - this.startX > 0)) ||
        (this.moveY !== null && Math.abs(this.moveY - this.startY) > 0)
      ) {
        console.log("timeDis", timestamp - this.startTime);
        if (timestamp - this.startTime < 1000 && this.eLen > 1) {
          console.log("zoom-start");
          if (this.previousPinchScale > 1) {
            this.zoomIn();
          } else {
            this.zoomOut();
          }
        }
        this.eLen = 0;
      }
    },
    zoomIn() {
      console.log("zoomIn");
      console.log("renderMode", this.renderMode);
      if (!this.renderMode) return;
      let newScale = this.currentScale;
      if (newScale < this.maxScale) {
        newScale = newScale * this.defaultSacleDelta;
        newScale = Math.ceil(newScale * 10) / 10;
        if (this.currentScale === newScale) {
          newScale += 0.1;
        }
        newScale = Math.min(this.maxScale, newScale);
        this.currentScale = newScale;
        console.log(this.currentScale);
        this._loadFile(this.pdfSrc);
      }
    },
    zoomOut() {
      console.log("zoomOut");
      console.log("renderMode", this.renderMode);
      if (!this.renderMode) return;
      let newScale = this.currentScale;
      if (newScale > this.minScale) {
        newScale = newScale / this.defaultSacleDelta;
        newScale = Math.ceil(newScale * 10) / 10;
        if (this.currentScale === newScale) {
          newScale -= 0.1;
        }
        newScale = Math.max(this.minScale, newScale);
        this.currentScale = newScale;
        console.log(this.currentScale);
        this._loadFile(this.pdfSrc);
      }
    },
    _getDistance(xLen, yLen) {
      return Math.sqrt(xLen * xLen + yLen * yLen);
    },
    _getTime() {
      return new Date().getTime();
    },
  },
};
</script>
<style scoped>
.home_wrap {
  width: 100%;
  height: 100%;
}
.pdf_down {
  position: fixed;
  display: flex;
  z-index: 20;
  right: 26px;
  bottom: 7%;
}
.pdf_set_left {
  width: 30px;
  height: 40px;
  color: #408fff;
  font-size: 11px;
  padding-top: 25px;
  text-align: center;
  margin-right: 5px;
  cursor: pointer;
}
.pdf_set_middle {
  width: 30px;
  height: 40px;
  color: #408fff;
  font-size: 11px;
  padding-top: 25px;
  text-align: center;
  margin-right: 5px;
  cursor: pointer;
}
</style>