vue预览本地pdf文件方法之vue-pdf组件

照抄例子:https://www.cnblogs.com/steamed-twisted-roll/p/9648255.html

1、npm安装

npm install --save vue-pdf

2、页面引入

3、具体实现

<div class="pdf" v-show="fileType === 'pdf'">
<p class="arrow">
    <span @click="changePdfPage(0)" class="turn" 
             :class="{grey: currentPage==1}">Preview</span>
    {{currentPage}} / {{pageCount}}
    <span @click="changePdfPage(1)" class="turn" 
            :class="{grey: currentPage==pageCount}">Next</span>
</p>                              
<pdf  :src="pdfSrc" :page="currentPage" @num-pages="pageCount=$event" 
        @page-loaded="currentPage=$event"   @loaded="loadPdfHandler">
</pdf>
</div>

4、method方法

// 改变PDF页码,val传过来区分上一页下一页的值,0上一页,1下一页
      changePdfPage (val) {
        // console.log(val)
        if (val === 0 && this.currentPage > 1) {
          this.currentPage--
          // console.log(this.currentPage)
        }
        if (val === 1 && this.currentPage < this.pageCount) {
          this.currentPage++
          // console.log(this.currentPage)
        }
      },

      // pdf加载时
      loadPdfHandler (e) {
        this.currentPage = 1 // 加载的时候先加载第一页
      },

5、完整代码:

<template>
    <div>
        <div style="text-align: left;">
        <H2>行业资料</H2>
        <el-divider>
        </el-divider>
        <el-container>
            <el-aside width="300px" style="border: 1px solid #eee;height: 1000px; background-color: #D3DCE6;">
                <div class="myTree">
                <el-tree default-expand-all :props="defaultProps" :data="tableData"  @node-click="handleNodeClick"></el-tree>
                </div>
            </el-aside>
            <el-container  style="border: 1px solid #eee;margin-left: 10px;">
                <div class="pdf" v-show="fileType === 'pdf'">
                    <p class="arrow">
                        <span :class="{grey: currentPage==1}" @click="changePdfPage(0)" class="turn">Preview</span>
                        {{currentPage}} / {{pageCount}}
                        <span :class="{grey: currentPage==pageCount}" @click="changePdfPage(1)" class="turn">Next</span>
                    </p>
                    <pdf
                            :page="currentPage"
                            :src="pdfSrc"
                            @loaded="loadPdfHandler"
                            @num-pages="pageCount=$event"
                            @page-loaded="currentPage=$event">
                    </pdf>
                </div>
            </el-container>
        </el-container>
        </div>
    </div>
</template>

<script>
  import pdf from 'vue-pdf'

  export default {
    name: "IndustryInformation",
    components: {pdf},
    data(){
      return {
        currentPage: 0, // pdf文件页码
        pageCount: 0, // pdf文件总页数
        fileType: 'pdf', // 文件类型
        pdfSrc: '',  // pdf文件地址
        defaultProps: {
          children: 'children',
          label: 'name'
        },

        tableData: [{
          id: 1,
          name: '道路工程资料',
          children:[
            {
              id: 2,
              name: '公路工程资料编制概述',
              children:[
                {
                  id: 21,
                  name: '路面工程部分分项划分表',
                  src: '/1.pdf',
                },
                {
                  id: 13,
                  name: '一般建设项目单位工程划分表',
                  src: '/2.pdf',
                },
                {
                  id: 14,
                  name: '路基工程部分分项划分表',
                  src: '/3.pdf',
                },
                {
                  id: 33,
                  name: '桥梁工程部分分项划分表',
                  src: '/4.pdf',
                },
                {
                  id: 34,
                  name: '隧道工程部分分项划分表',
                  src: '/5.pdf',
                }
              ]
            },
            {
              id: 3,
              name: '公路工程竣工资料',
              children:[
                {
                  id: 7,
                  name: '公路工程竣工文件编排层次',
                  src: '/5.pdf',
                },
                {
                  id: 8,
                  name: '工程洽商记录表',
                  src: '/4.pdf',
                },
                {
                  id: 9,
                  name: '工程设计表更、洽商一览表',
                  src: '/3.pdf',
                }
              ]
            }
          ]}]
      }
    },
    methods:{
      // 改变PDF页码,val传过来区分上一页下一页的值,0上一页,1下一页
      changePdfPage(val) {
        // console.log(val)
        if (val === 0 && this.currentPage > 1) {
          this.currentPage--
          // console.log(this.currentPage)
        }
        if (val === 1 && this.currentPage < this.pageCount) {
          this.currentPage++
          // console.log(this.currentPage)
        }
      },

      // pdf加载时
      loadPdfHandler(e) {
        this.currentPage = 1 // 加载的时候先加载第一页
      },

      handleNodeClick(data) {
        this.pdfSrc = data.src;
      }

    }
  }
</script>

<style scoped>
    .myTree /deep/ .el-tree {
        position: relative;
        cursor: default;
        color: #606266;
        background-color: #D3DCE6;
    }
</style>

6、最终效果

后记:主要是priview和next翻页不是我想要的效果,因此只能另寻它法。

注意:pdf文件需要放在public路径下任意文件夹中,不支持相对路径

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
要在Vue预览本地PDF文件,你可以使用pdf.js库。 首先,通过npm安装pdf.js: ``` npm install pdfjs-dist ``` 然后在你的Vue组件中引入pdf.js: ```javascript import pdfjsLib from 'pdfjs-dist'; ``` 接下来,你需要定义一个data属性来存储PDF文件的URL和PDF文档对象: ```javascript data() { return { pdfUrl: 'path/to/your/local/pdf/file.pdf', pdfDoc: null } } ``` 在组件的mounted钩子函数中,使用pdf.js加载PDF文档: ```javascript mounted() { pdfjsLib.getDocument(this.pdfUrl).then((pdfDoc_) => { this.pdfDoc = pdfDoc_; }); } ``` 现在你可以在模板中使用`<canvas>`元素来呈现PDF文档的页面。你可以使用`pdfDoc.getPage()`方法获取特定页面的呈现。 下面是一个简单的Vue组件,展示了如何使用pdf.js预览本地PDF文件: ```html <template> <div> <canvas ref="pdfCanvas"></canvas> </div> </template> <script> import pdfjsLib from 'pdfjs-dist'; export default { data() { return { pdfUrl: 'path/to/your/local/pdf/file.pdf', pdfDoc: null }; }, mounted() { pdfjsLib.getDocument(this.pdfUrl).then((pdfDoc_) => { this.pdfDoc = pdfDoc_; this.renderPage(1); }); }, methods: { renderPage(pageNum) { this.pdfDoc.getPage(pageNum).then((page) => { const canvas = this.$refs.pdfCanvas; const context = canvas.getContext('2d'); const viewport = page.getViewport({ scale: 1 }); canvas.height = viewport.height; canvas.width = viewport.width; page.render({ canvasContext: context, viewport: viewport }); }); } } } </script> ``` 在这个组件中,我们在mounted钩子函数中加载PDF文档,并在第一页上呈现PDF文档。`renderPage()`方法获取特定页面并在`<canvas>`元素上呈现。你可以通过更改`renderPage()`方法中的pageNum参数来呈现不同页面的PDF文档。 最后,记得在你的Vue组件中引入CSS文件,该文件pdf.js提供,用于正确呈现PDF文档: ```html <style> @import '~pdfjs-dist/web/pdf_viewer.css'; </style> ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟茜

随多随少随你心意^-^

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值