• vue-pdf实现pdf文件预览和分页


    我采用的是dialog封装的弹窗组件

    npm install --save vue-pdf
    
    • 1

    组件

    <template>
      <div>
        <el-dialog
          title=""
          :visible.sync="dialogShow"
          width="655px"
          :append-to-body="true"
          :before-close="handleClose"
          top="0px"
        >
          <VuePdf 
            v-if="fileUrl" 
            class="file_view" 
            :src="fileUrl" 
            :page="currentPage" 
            @num-pages="pageCount=$event" 
            @page-loaded="currentPage=$event"  
            @loaded="loadPdf"
          />
          <div class="pageButton">
              <el-button size="mini" @click="changePage(0)" round>上一页</el-button>
              <el-button size="mini" @click="changePage(1)" round>下一页</el-button>
          </div>
        </el-dialog>
      </div>
    </template>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    import VuePdf from "vue-pdf";
    export default {
      name: "PdfView",
      components: {
        VuePdf,
      },
      props: {
      	//pdf地址
        fileUrl: {
          type: String,
          default: "",
        },
        //控制弹窗显示
        show: {
          type: Boolean,
          require: false
        },
      },
      watch: {
      	//监听到弹窗显示时,页数初始化到第一页
        show: {
          handler(newVal) {
            this.dialogShow = newVal
            this.currentPage = 1
          },
          immediate: true,
        },
      },
      data() {
        return {
          dialogShow:false,
          currentPage: 0, // 页码
          pageCount: 0, // 总页数
        };
      },
      methods: {
        changePage (val) { 
            if (val === 0 && this.currentPage > 1) { 
              this.currentPage --;
            }
            if (val === 1 && this.currentPage < this.pageCount) { 
              this.currentPage ++;
            }
        },
        // 加载的时候先加载第一页
        loadPdf () { 
            this.currentPage = 1 
        },
        //子传父 事件发射,关闭弹窗
        handleClose(){
          this.$emit('closeShow')
        }
      }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    .pageButton{
      display: flex;
      justify-content: center;
      margin-top: 10px;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    父组件组件引入

    <PdfView
      :fileUrl="pdfUrl"
      :show="pdfShow"
      @closeShow="closeShow"
    ></PdfView>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    import PdfView from "./PdfView.vue";
    
    components: { PdfView },
    
    data() {
        return {
    		pdfUrl: "", //点击的pdf地址
    		pdfShow: false,//控制组件显示
        }
     }
    
    mounted() {
    	 this.pdfUrl = 'XXXXXX.pdf';
         this.pdfShow = true;
    },
    
    //接收子组件的关闭
    closeShow() {
      this.pdfShow = false;
    },
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    mysql的安装和连接
    ElasticSearch 之 数据类型
    大一学生《Web编程基础》期末网页制作 基于HTML+CSS+JavaScript响应式个人主页相册介绍模板
    【面试普通人VS高手系列】请说一下你对分布式锁的理解,以及分布式锁的实现
    【安卓】UI开发入门
    大型语言模型的推理演算
    推荐两款超高质量的壁纸软件
    Android开发基础——3种基本布局
    运用程序化交易系统的能力表现在哪些方面?
    如何在确保身份安全的同时改善员工体验
  • 原文地址:https://blog.csdn.net/qq_44063746/article/details/132897806