pdf预览

2023-03-30  本文已影响0人  AAA前端

通过接口拿到第三方的链接,然后判断不同环境,比如app, h5,小程序等等,用对应的方法打开一个新的webview打开链接展示,但是没想到里面又pdf。然后在ios上,h5无法展示。
换个思路,第三方链接,会返回一个type类型,如果是pdf。那给拼接上一个h5的地址,然后用webview打开。
h5的地址就是一个展示pdf的作用。比如我们的 https://medicaluat.mobile.taikang.com/active/pdfViewer/index.html#/pdfView?pdfUrl=后面跟pdf的链接
https://medicaluat.mobile.taikang.com/active/pdfView/index.html#/pdfViewer?pdfUrl=https%3A%2F%2Ftlifehealth.taikang.com%2Factive%2Fimg%2Fpdf%2F202303301413.pdf

实现 pdfViewer.vue
依赖

    "pdfjs-dist": "^2.5.207",
    "pdfvuer": "^1.6.1",
    "vconsole": "^3.3.0",
    "vue": "^2.6.6",
    "vue-pdf": "^4.2.0",
<template>
  <div id="pdfvuer" class="pdfvuer">
    <pdf
      ref="pdf"
      :src="pdfdata"
      v-for="i in numPages"
      :rotate="pageRotate"
      :key="i"
      :id="i"
      :page="i"
      :scale.sync="scale"
    ></pdf>
    <!--  当前页/总页数  -- 滑动的时候,当前页不变,直接给去掉了>
    <!-- <div class="pageNum">{{ page }}/{{ numPages }}</div> -->    <!--  下方tab栏  -->
    <div class="pdf-tab">
      <div
        v-for="(item, i) in tabItem"
        :key="i"
      >
        <div
          class="operate-item"
          @click.stop="item.func"
        >
          <img
            :class="{
              radioImg: item.imgSize == 'radio',
              flatImg: item.imgSize == 'flat',
            }"
            :src="img_base_url + item.icon"
            alt=""
          />
          <div class="txt">{{ item.txt }}</div>
        </div>
      </div>
    </div>
  </div>
</template>
   
  <script>
import pdfvuer from 'pdfvuer';

export default {
  components: {
    pdf: pdfvuer,
  },
  data() {
    return {
      page: 1,
      numPages: 0,
      pdfdata: undefined,
      errors: [],
      scale: 'page-width', //放大系数
      pageRotate: 0,
      pdfUrl: '',
      tabItem: [
        {
          //下方tab栏
          func: this.clock,
          icon: 'rotate_icon.png',
          txt: '翻转',
          imgSize: 'radio',
        },
        // {
        //   func: this.prePage,
        //   icon: 'pre_icon.png',
        //   txt: '上一页',
        //   imgSize: 'flat',
        // },
        // {
        //   func: this.nextPage,
        //   icon: 'next_icon.png',
        //   txt: '下一页',
        //   imgSize: 'flat',
        // },
        {
          func: this.scaleD,
          icon: 'magnify_icon.png',
          txt: '放大',
          imgSize: 'radio',
        },
        {
          func: this.scaleX,
          icon: 'reduce_icon.png',
          txt: '缩小',
          imgSize: 'radio',
        },
      ],
    };
  },
  mounted() {
    let queryData = this.$route.query;
    if(!!queryData.pdfUrl){
      this.pdfUrl = queryData.pdfUrl
      this.getPdf();
    }
  },
  watch: {
    show: function (s) {
      if (s) {
        this.getPdf();
      }
    },
    page: function (p) {
      if (
        window.pageYOffset <= this.findPos(document.getElementById(p)) ||
        (document.getElementById(p + 1) &&
          window.pageYOffset >= this.findPos(document.getElementById(p + 1)))
      ) {
        document.getElementById(p).scrollIntoView();
      }
    },
  },
  methods: {
    // 上一页
    prePage() {
      let p = this.page;
      p = p > 1 ? p - 1 : 1;
      this.page = p;
    },
    // 下一页
    nextPage() {
      let p = this.page;
      p = p < this.numPages ? p + 1 : 1;
      this.page = p;
    },
    // 左滑动翻页
    nextPageLeft() {
      if (this.scale == 100) {
        this.nextPage();
      } else {
        return;
      }
    },
    // 顺时针旋转
    clock() {
      this.pageRotate += 90;
    },
    // 逆时针旋转
    counterClock() {
      this.pageRotate -= 90;
    },
    //放大
    scaleD() {
      this.scale += 0.2;
    },

    //缩小
    scaleX() {
      if (this.scale <= 0.2) return false;
      this.scale += -0.2;
    },
    getPdf() {
      var self = this;
      self.pdfdata = pdfvuer.createLoadingTask(this.pdfUrl)
      self.pdfdata.then((pdf) => {
        self.numPages = pdf.numPages;
        window.onscroll = function () {
          changePage();
          stickyNav();
        };

        // Get the offset position of the navbar
        // var sticky = $('#buttons')[0].offsetTop;

        // Add the sticky class to the self.$refs.nav when you reach its scroll position. Remove "sticky" when you leave the scroll position
        function stickyNav() {
          //   if (window.pageYOffset >= sticky) {
          //     $('#buttons')[0].classList.remove('hidden');
          //   } else {
          //     $('#buttons')[0].classList.add('hidden');
          //   }
        }

        function changePage() {
          var i = 1,
            count = Number(pdf.numPages);
          do {
            if (
              window.pageYOffset >= self.findPos(document.getElementById(i)) &&
              window.pageYOffset <= self.findPos(document.getElementById(i + 1))
            ) {
              self.page = i;
            }
            i++;
          } while (i < count);
          if (window.pageYOffset >= self.findPos(document.getElementById(i))) {
            self.page = i;
          }
        }
      });
    },
    findPos(obj) {
      return obj.offsetTop;
    },
  },
};
</script>
   
  <style lang="less" scoped>
// #buttons {
//   margin-left: 0 !important;
//   margin-right: 0 !important;
// }
/* Page content */
.pdfvuer {
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
  max-width: 667px;
  width: 100%;
  margin: 0 auto;
  overflow: auto;
  height: 100%;
  -webkit-overflow-scrolling: touch;
  font-size: 0.28rem;
  padding-top: 5px;
  background-color: #f4f6fc;
}
.content {
  padding: 16px;
}
.pageNum {
  margin: 0 auto;
  display: flex;
  justify-content: center;
  align-items: center;
  height: 30px;
  width: 80px;
  background: #e6e9f4;
  border-radius: 3px;
  font-family: PingFang-SC-Regular;
  font-size: 16px;
  color: #9b9b9b;
  text-align: center;
  line-height: 16px;
  position: fixed;
  bottom: 60px;
  left: 142px;
}
.pdf-tab {
  position: fixed;
  background-color: #fff;
  width: 100%;
  bottom: 0px;
  left: 0;
  display: flex;
  justify-content: space-between;
  font-size: 14px;
  padding: 10px 40px;
  box-sizing: border-box;

  .operate-item {
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;

    .radioImg {
      width: 20px;
      height: 20px;
    }

    .flatImg {
      width: 12px;
      height: 20px;
    }

    .txt {
      margin-top: 5px;
      font-family: PingFang-SC-Regular;
      font-size: 11px;
      color: #9b9b9b;
      text-align: center;
      line-height: 12px;
    }
  }

  .paddingRight50 {
    padding-right: 50px;
  }

  .paddingLeft20 {
    padding-left: 20px;
  }
}
</style>
上一篇下一篇

猜你喜欢

热点阅读