vue项目实现本地PDF翻页预览功能(使用vue-pdf)

2 篇文章 0 订阅

1.需求

在页面中预览本地在工程文件public/pdfs目录下多页码可翻页的PDF文件
在这里插入图片描述

2.实现

(主要功能代码,精简版)

  1. 安装vue-pdf npm install vue-pdf
  2. 引入pdf import pdf from 'vue-pdf';和注册 components: {pdf},
  3. js部分
 data() {
    return {
      pageTotalNum: 1, // 总页数
      pdfUrl: '', // 文件路径
      pageNum: 1, // 当前页数
    };
  },
  props: {
    url: {
   	// 文件地址,格式为 文件名+'.pdf'
      type: String,
      required: true,
    },
  },

监听选中文件的变动,拼接路径,即前面pdfUrl的值,路径这一步很重要!!!

简单来说就是:

  • 开发环境路径:/pdfs/ + 文件名 +.pdf
  • 生产环境路径:线上地址+ pdfs/ + 文件名 +.pdf
  watch: {
    url: {
    // 监听文件地址变化
      handler(val) {
        if (val) {
        // 生产环境下需要加线上地址VUE_APP_PUBLIC_PATH,开发环境不用加
          this.pdfUrl =
            process.env.NODE_ENV === 'production' ?
              `${process.env.VUE_APP_PUBLIC_PATH}pdfs/${this.url}` :
              '/pdfs/' + this.url;
        }
      },
      immediate: true,
    },
  },
  methods: {
    // 上一页
    prePage() {
      let page = this.pageNum;
      page = page > 1 ? page - 1 : this.pageTotalNum;
      this.pageNum = page;
    },
    // 下一页
    nextPage() {
      let page = this.pageNum;
      page = page < this.pageTotalNum ? page + 1 : 1;
      this.pageNum = page;
    },
  },
  1. HTML展示使用

PDF部分

		<pdf
          class="pdf-show"
          :src="pdfUrl"
          :page="pageNum"
          @num-pages="pageTotalNum = $event"
        />

ps: 关于参数解释:
①其中pdfUrl为要预览的文件路径
②pageNum为当前显示第pageNum页
@num-pages="pageTotalNum = $event"方法用于计算改pdf页码总数,pageTotalNum 表示总页码数

按钮部分

<div class="tools">
  <button
    @click="prePage"
    class="pdf-button"
  >
    上一页
  </button>
  <div class="page">{{ pageNum }}/{{ pageTotalNum }}</div>
  <button
    @click="nextPage"
    class="pdf-button"
  >
    下一页
  </button>
</div>

3.完整代码

(包含没用上的代码,自己筛选)

<template>
  <div class="pdf-wrapper">
    <!-- PDF展示部分 -->
    <div class="pdf-content">
      <div class="pdf-contain">
        <pdf
          class="pdf-show"
          :src="pdfUrl"
          :page="pageNum"
          @progress="loadedRatio = $event"
          @page-loaded="pageLoaded($event)"
          @num-pages="pageTotalNum = $event"
          @error="pdfError($event)"
          @link-clicked="page = $event"
        />
      </div>
    </div>
    <!-- 按钮部分 -->
    <div class="tools">
      <button
        @click="prePage"
        class="pdf-button"
      >
        上一页
      </button>
      <!-- 页码 -->
      <div class="page">{{ pageNum }}/{{ pageTotalNum }}</div>
      <button
        @click="nextPage"
        class="pdf-button"
      >
        下一页
      </button>
    </div>
  </div>
</template>
<script>
import pdf from 'vue-pdf';
export default {
  name: 'PDF',
  components: {pdf},
  props: {
    url: {
      type: String,
      required: true,
    },
  },
  watch: {
    url: {
      handler(val) {
        if (val) {
          console.log(val, 89898);
          this.pdfUrl =
            process.env.NODE_ENV === 'production' ?
              `${process.env.VUE_APP_PUBLIC_PATH}pdfs/${this.url}` :
              '/pdfs/' + this.url;
        }
      },
      immediate: true,
    },
  },
  created() {
    console.log(this.pdfUrl, 8989);
  },
  data() {
    return {
      pageTotalNum: 1,
      pdfUrl: '',
      pageNum: 1,
      // 加载进度
      loadedRatio: 0,
      curPageNum: 0,
      numPages: 0,
    };
  },
  mounted() {
    // this.getNumPages()
  },
  methods: {
    getpdf() {
      this.$http
          .get('/pdfs/文件名.pdf', {baseURL: ''})
          .then((res) => {
            console.log(res, 'reeeeee');
            this.pdfUrl = res.data;
          });
    },
    // 计算pdf页码总数
    getNumPages(url) {
      const loadingTask = pdf.createLoadingTask(url);
      loadingTask
          .then((pdf) => {
            this.pdfUrl = loadingTask;
            this.pageTotalNum = pdf.numPages;
            console.log(this.pageTotalNum, 'pageTotalNum');
          });
    },
    // 上一页函数,
    prePage() {
      let page = this.pageNum;
      page = page > 1 ? page - 1 : this.pageTotalNum;
      this.pageNum = page;
    },
    // 下一页函数
    nextPage() {
      let page = this.pageNum;
      page = page < this.pageTotalNum ? page + 1 : 1;
      this.pageNum = page;
    },
    // 页面加载回调函数,其中e为当前页数
    pageLoaded(e) {
      this.curPageNum = e;
    },
    // 其他的一些回调函数。
    pdfError(error) {
      console.error(error);
    },
  },
};
</script>
<style lang="scss" scoped>
.pdf-wrapper {
  width: 100%;
  height: 100%;
  display: flex;
  justify-content: center;
  flex-direction: column;
}
.pdf-wrapper span {
  width: 100%;
}
.tools {
  width: 100%;
  height: 70px;
  display: flex;
  align-items: center;
  justify-content: space-around;
  z-index: 999;
  margin-bottom: -3%;
  padding-top: 2%;
}
.pdf-content {
  display: flex;
  justify-content: center;
  width: 100%;
  height: 98%;
  border-radius: 50px;
  overflow-x: hidden;
  .pdf-contain {
    width: 100%;
    overflow-x: hidden;
    .pdf-show {
      width: 100%;
  }
  }
}
.pdf-button {
  width: 240px;
  height: 60px;
  font-size: 30px;
  border-radius: 20px;
}
.pdf-button:hover{
  cursor: pointer;
  transform: scale(1.2);
}
.page {
  font-size: 48px;
  color: #fff;
}
</style>
  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用提供的信息,可以使用vue-pdf组件来实现PDF翻页效果。在Vue组件中,可以通过引入vue-pdf组件并在模板中使用该组件来展示PDF文件,然后可以通过控制页码的变化来实现翻页效果。 首先,需要在Vue项目中引入vue-pdf组件。可以使用npm或yarn安装vue-pdf,然后在需要使用的组件中引入vue-pdf组件。 ```javascript import pdf from 'vue-pdf'; ``` 然后,在模板中使用vue-pdf组件来展示PDF文件,并通过绑定页码的变量来实现翻页效果。 ```html <template> <div> <pdf ref="pdfRef" :src="pdfSrc" :page="currentPage" @num-pages="totalPages = $event"></pdf> <button @click="prevPage">上一页</button> <button @click="nextPage">下一页</button> </div> </template> ``` 在Vue的data中定义页码变量和PDF文件路径: ```javascript data() { return { currentPage: 1, // 当前页码 totalPages: 0, // 总页数 pdfSrc: 'path/to/pdf/file.pdf' // PDF文件路径 } } ``` 接下来,实现翻页的方法。可以通过调用vue-pdf组件提供的prevPage和nextPage方法来实现上一页和下一页的功能。 ```javascript methods: { prevPage() { if (this.currentPage > 1) { this.currentPage--; } }, nextPage() { if (this.currentPage < this.totalPages) { this.currentPage++; } } } ``` 这样,当点击上一页按钮时,会调用prevPage方法,将当前页码减一;当点击下一页按钮时,会调用nextPage方法,将当前页码加一。页面会根据当前页码的变化而展示相应的PDF页。 综上所述,可以通过使用vue-pdf组件和控制页码变量来实现PDF翻页效果。<span class="em">1</span> #### 引用[.reference_title] - *1* [使用Vue-PDF实现预览翻页、放大缩小、侧边栏预览](https://blog.csdn.net/qq_44775782/article/details/130134423)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值