vue2.0全局组件之pdf详解
发布时间 - 2026-01-11 02:03:33 点击率:次目的:像elementUI那样注册全局组件 预览pdf文件

技术支持:使用火狐的pdf.js http://mozilla.github.io/pdf.js/
准备:新建一个CPdf.vue文件,把火狐demo里面的build里面的pdf.js下载来,并且依赖了elementUI开发的其实就是用了<el-button>
编写:
template
<template>
<div class="cpdf">
<div class="center">
<div class="contor">
<el-button @click="prev">上一页</el-button>
<el-button @click="next">下一页</el-button>
<span>Page: <span v-text="page_num"></span> / <span v-text="page_count"></span></span>
<el-button @click="addscale" icon="plus"></el-button>
<el-button @click="minus" icon="minus"></el-button>
<el-button id="prev" @click="closepdf">关闭</el-button>
</div>
<canvas class="canvasstyle" id="the-canvas"></canvas>
</div>
</div>
</template>
js
import PDFJS from '../../../static/pdf/pdf.js'
import {
mapActions,
mapGetters
} from 'vuex';
export default {
name: 'c-pdf',
props: ['pdfurl'],
data() {
return {
pdfDoc: null, //pdfjs 生成的对象
pageNum: 1,//
pageRendering: false,
pageNumPending: null,
scale: 1.2,//放大倍数
page_num: 0,//当前页数
page_count: 0,//总页数
maxscale: 2,//最大放大倍数
minscale: 0.8//最小放大倍数
}
},
methods: {
renderPage(num) { //渲染pdf
let vm = this
this.pageRendering = true;
let canvas = document.getElementById('the-canvas')
// Using promise to fetch the page
this.pdfDoc.getPage(num).then(function(page) {
var viewport = page.getViewport(vm.scale);
//alert(vm.canvas.height)
canvas.height = viewport.height;
canvas.width = viewport.width;
// Render PDF page into canvas context
var renderContext = {
canvasContext: vm.ctx,
viewport: viewport
};
var renderTask = page.render(renderContext);
// Wait for rendering to finish
renderTask.promise.then(function() {
vm.pageRendering = false;
if(vm.pageNumPending !== null) {
// New page rendering is pending
vm.renderPage(vm.pageNumPending);
vm.pageNumPending = null;
}
});
});
vm.page_num = vm.pageNum;
},
addscale() {//放大
if(this.scale >= this.maxscale) {
return
}
this.scale += 0.1;
this.queueRenderPage(this.pageNum)
},
minus() {//缩小
if(this.scale <= this.minscale) {
return
}
this.scale -= 0.1;
this.queueRenderPage(this.pageNum)
},
prev() {//上一页
let vm = this
if(vm.pageNum <= 1) {
return;
}
vm.pageNum--;
vm.queueRenderPage(vm.pageNum);
},
next() {//下一页
let vm = this
if(vm.pageNum >= vm.page_count) {
return;
}
vm.pageNum++;
vm.queueRenderPage(vm.pageNum);
},
closepdf() {//关闭PDF
this.$emit('closepdf')
},
queueRenderPage(num) {
if(this.pageRendering) {
this.pageNumPending = num;
} else {
this.renderPage(num);
}
}
},
computed: {
ctx() {
let id = document.getElementById('the-canvas')
return id.getContext('2d');
}
},
mounted() {
let vm = this
PDFJS.getDocument(vm.pdfurl).then(function(pdfDoc_) { //初始化pdf
vm.pdfDoc = pdfDoc_;
vm.page_count = vm.pdfDoc.numPages
vm.renderPage(vm.pageNum);
});
}
}
style less
.cpdf {
position: fixed;
top: 0;
left: 0;
background-color: rgba(0, 0, 0, .5);
width: 100%;
height: 100%;
z-index: 99999;
display: flex;
justify-content: center;
align-items: center;
.center {
text-align: center;
height: 100%;
overflow: auto;
padding-top: 20px;
.contor {
margin-bottom: 10px;
}
}
}
注册到全局:在main.js 引入CPdf.vue
Vue.component(CPdf.name, CPdf)
使用:在想预览pdf文件的组件里面
<c-pdf @closepdf="closepdf" v-show="isshowpdf" :pdfurl="testpdfurl"></c-pdf>
data() {
return {
isshowpdf:false,
testpdfurl:'//cdn.mozilla.net/pdfjs/tracemonkey.pdf'
}
},
methods: {
closepdf(){
this.isshowpdf=false
},
}
效果:
npm :有人关注 那么我就发到 npm 上。 地址 https://www.npmjs.com/package/vueshowpdf
本文已被整理到了《Vue.js前端组件学习教程》,欢迎大家学习阅读。
关于vue.js组件的教程,请大家点击专题vue.js组件学习教程进行学习。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# vue2.0
# 全局组件
# pdf
# vue2前端导出pdf文件实例demo
# vue2.0如何借用vue-pdf实现在线预览pdf文件
# vue2中Print.js的使用超详细讲解(pdf、html、json、image)
# vue2实现pdf电子签章问题记录
# vue2利用html2canvas+jspdf动态生成多页PDF方式
# 下一页
# 上一页
# 火狐
# 我就
# 已被
# 请大家
# 用了
# 欢迎大家
# 大家多多
# 新建一个
# vuex
# export
# icon
# mapGetters
# pdfurl
# data
# default
# props
# PDFJS
# canvas
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
浅谈javascript alert和confirm的美化
Android自定义控件实现温度旋转按钮效果
如何注册花生壳免费域名并搭建个人网站?
JavaScript如何实现路由_前端路由原理是什么
电商网站制作价格怎么算,网上拍卖流程以及规则?
Laravel怎么生成URL_Laravel路由命名与URL生成函数详解
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
如何在橙子建站中快速调整背景颜色?
如何在橙子建站上传落地页?操作指南详解
奇安信“盘古石”团队突破 iOS 26.1 提权
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】
Android中AutoCompleteTextView自动提示
html如何与html链接_实现多个HTML页面互相链接【互相】
浅述节点的创建及常见功能的实现
Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势
Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】
如何确保西部建站助手FTP传输的安全性?
详解Android——蓝牙技术 带你实现终端间数据传输
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)
Python制作简易注册登录系统
jQuery中的100个技巧汇总
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
如何自定义建站之星网站的导航菜单样式?
Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中
香港服务器建站指南:免备案优势与SEO优化技巧全解析
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
Laravel如何使用withoutEvents方法临时禁用模型事件
如何在云指建站中生成FTP站点?
利用 Google AI 进行 YouTube 视频 SEO 描述优化
悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音
Bootstrap整体框架之CSS12栅格系统
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】
Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知
如何用PHP工具快速搭建高效网站?
如何在景安服务器上快速搭建个人网站?
laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法
Laravel怎么为数据库表字段添加索引以优化查询
VIVO手机上del键无效OnKeyListener不响应的原因及解决方法
如何获取PHP WAP自助建站系统源码?
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
WordPress 子目录安装中正确处理脚本路径的完整指南
jquery插件bootstrapValidator表单验证详解
Laravel如何升级到最新版本?(升级指南和步骤)
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤
零服务器AI建站解决方案:快速部署与云端平台低成本实践
HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】
浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】
如何在香港免费服务器上快速搭建网站?

