vue-pdf 在 nuxt2 中的使用(详细注释)

1. 首先安装插件 (推荐使用一下版本号)

// 目前是稳定版本,如有需要可以按照其他版本
npm i vue-pdf@4.2
npm i pdfjs-dist@2.5.207

2.  在 nuxt.config.js 中添加下面的代码

  plugins: [
    ...
    // 以上代码
    // /plugins/pdf.js 需创建pdf.js 文件
    { src: "~/plugins/pdf.js", ssr: false },
  ],

3. .新建一个 pdf.js 注册 vue-pdf

// plugins/pdf.js

import Vue from "vue";
import pdf from "vue-pdf";

Vue.component("pdf", pdf);

//挂载到全局,用于 createLoadingTask 功能

export default function ({ app, redirect }, inject) {
  inject("pdf", pdf);
}

4.然后使用到页面中(组件中)

src 是 pdf 的地址 page 是显示第几页 如果想展示全部可以 添加 v-for 便利每一页有方法获取到每一页 可以自己设置两个按钮添加俩个点击事件来对 page++或者 page--做上一页下一页功能 这里我会把两个功能都写出来 供大家参考(分页跟全部加载)

 4.1 分页加载

4.1.1 HTML 部分

<!-- 分页 -->
<pdf :src="blobSrc" :page="currPage"></pdf>

<span style="margin-right: 20px; color: #131313">共{{ totalPages }}页</span>

<el-button type="text" @click="updatePage('preview')">上一页</el-button>
<span>第{{ currPage }}页</span>
<el-button type="text" @click="updatePage('next')">下一页</el-button>

4.1.2 Js 部分

export default {
  data() {
    return {
      obj: {}, // 接口数据
      blobSrc: null, // pdf的url
      totalPages: 1, // 页码总数
      currPage: 1, // 当前页码
    };
  },
  methods: {
    getview(id) {
      // 调用 $indexApi 对象的 getpageView 方法,传入参数 id
      this.$indexApi.getpageView(id).then((r) => {
        // 使用获取到的数据更新当前对象的属性 obj
        this.obj = { ...r.data };
        // 创建一个 PDF 的加载任务,使用 $pdf 对象的 createLoadingTask 方法
        this.blobSrc = this.$pdf.createLoadingTask({
          // 传入 PDF 文件的 URL
          url: this.obj.filesPath,
          // CMapReaderFactory 是一个工厂对象,可能是用于处理 CMap(字符映射)的
          CMapReaderFactory,
        });

        // 等待加载任务完成
        this.blobSrc.promise
          .then((pdf) => {
            // 当加载完成时,获取 PDF 的信息,例如总页数
            this.totalPages = pdf._pdfInfo.numPages;
          })
          .catch((error) => {
            // 如果加载过程中出现错误,输出错误信息到控制台
            console.error("pdf加载失败", error);
          });
      });
    },
    // 上一页/下一页
    updatePage(str) {
      // 如果参数是 "preview" 且当前页码大于 1,则向前翻一页
      if (str === "preview" && this.currPage > 1) {
        this.currPage -= 1;
      } 
      // 如果参数是 "next" 且当前页码小于总页数,则向后翻一页
      else if (str === "next" && this.currPage < this.totalPages) {
        this.currPage += 1;
      }
      // 注意:如果当前页码是第一页且参数是 "preview",或者当前页码是最后一页且参数是 "next",不会执行任何操作
    },
  },
};

4.2  单页加载全部 这个相对简单

4.2.1  HTML 部分

<!-- 单页 -->
<pdf :src="blobSrc" :page="i" v-for="i in totalPages" :key="i"></pdf>

4.2.2 Js 部分 

export default {
  data() {
    return {
      obj: {}, // 接口数据
      blobSrc: null, // pdf的url
      totalPages: 1, // 页码总数
    };
  },
  methods: {
    getview(id) {
      // 调用 $indexApi 对象的 getpageView 方法,传入参数 id
      this.$indexApi.getpageView(id).then((r) => {
        // 使用获取到的数据更新当前对象的属性 obj
        this.obj = { ...r.data };
        // 创建一个 PDF 的加载任务,使用 $pdf 对象的 createLoadingTask 方法
        this.blobSrc = this.$pdf.createLoadingTask({
          // 传入 PDF 文件的 URL
          url: this.obj.filesPath,
          // CMapReaderFactory 是一个工厂对象,可能是用于处理 CMap(字符映射)的
          CMapReaderFactory,
        });

        // 等待加载任务完成
        this.blobSrc.promise
          .then((pdf) => {
            // 当加载完成时,获取 PDF 的信息,例如总页数
            this.totalPages = pdf._pdfInfo.numPages;
          })
          .catch((error) => {
            // 如果加载过程中出现错误,输出错误信息到控制台
            console.error("pdf加载失败", error);
          });
      });
    },
  },
};

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值