实现Vue移动端的PDF预览
最近做到一个功能,PDF预览;这个功能看着蛮简单的,结果搞了两个下午,真是欲哭无泪。记录一下所查到的预览方法。
我在网上找了蛮多教程的,大致都是以下几个方法实现预览:
- 使用 iframe 标签
- 使用 embed 标签
- 安装 Vue 插件 vue-pdf
- 安装 Vue 插件 pdfh5
下面配合代码详细说我实现预览的过程吧!
iframe标签
<iframe :src="url" style="border: none;width: 100%;height: 100%;" frameborder="0" />
<script>
export default {data() {return {show: false, url: '', // pdf地址}},methods: {
}
</script>
这个标签其实蛮方便的,毕竟上一页、下一页,跳转,下载都是齐全的,个人觉得如果是用在pc端就非常的舒适,一个标签解决所有,但是如果在移动端可能就有点小毛病;我这次需要在一个弹窗里预览PDF文件,在展示时样式就很丑(如下图),不过我没多挣扎就放弃了
embed 标签
<embed :src="url" type="application/pdf" width: 100% height: 100% >
<script>
export default {data() {return {show: false, url: '', // pdf地址}},methods: {
}
</script>
这个方法有局限性,如果浏览器不支持PDF嵌入,那这个标签就什么也不展示。
Vue 插件 vue-pdf
npm install --save vue-pdf // 安装一下
<!--这是一次加载完,还可以分页展示,这里就不详细说了-->
<div class="toast"><PDF v-for="i in pageNum" :key="i" ref="pdf" :src="url" :page="i" style="width: 100%" />
</div>
<script>
import PDF from 'vue-pdf' // 引入
import { CellGroup, Field, Popup, Toast } from 'vant'
export default {components: {PDF, [CellGroup.name]: CellGroup, [Field.name]: Field, [Popup.name]: Popup, [Toast.name]: Toast},data() {return {show: false, // 打开弹窗url: '', // 预览地址currentPage: 0, // 页码pageNum: null}},computed: {},created() {},methods: {// 查看pdflookPdf(item) {console.log('打开弹窗')this.getNumPages()this.show = true},getNumPages() {this.url = 'https://xxx/xxxx/test.pdf'const loadingTask = PDF.createLoadingTask(this.url)loadingTask.promise.then((pdf) => {this.pageNum = pdf.numPages}).catch((err) => {console.error('pdf 加载失败', err)})}}
}
</script>
这个方法,我之前做PC端的时候,真的很丝滑;但这次做移动端就开始报错,用浏览器调试时,一到移动端模式就开始报错(如下图),在网上找的解决教程也没起作用,果断放弃。毕竟要多给别的方法机会嘛!
npm install pdfh5
npm install pdfh5 // 安装一下
<template><div class="m-pdf"><div id="pdf-content" /></div>
</template>
<script>
import Pdfh5 from 'pdfh5'
import 'pdfh5/css/pdfh5.css'
export default {name: 'Pdfh5',data() {return {pdfh5: null,}},mounted() {},methods: {initPdf(pdfUrl) {console.log('子组件的地址', pdfUrl)// pdfh5实例化时传两个参数:selector选择器,options配置项参数,会返回一个pdfh5实例对象,可以操作pdf,监听相关事件this.pdfh5 = new Pdfh5('#pdf-content', {pdfurl: pdfUrl})this.pdfh5.scrollEnable(true) // 允许pdf滚动// 监听pdf准备开始渲染,可以拿到pdf总页数this.pdfh5.on('ready', function() {console.log('总页数:' + this.totalNum)})// 监听pdf加载完成事件this.pdfh5.on('complete', (status, msg, time) => {console.log('状态:' + status + ',信息:' + msg + ',耗时:' + time + '毫秒')})}}
}
</script>
// 父组件
<template><button @click="showPdf"><div v-if = "show"><preview-pdf ref="previewPdfh5" style="height:450px;margin-bottom:12px;" /></div>
</template>
<script>
import PreviewPdf from '../pdf.vue'
export default {
components: {PreviewPdf},data() {return {show: false, url: '', // pdf地址}},methods: {showPdf(){this.showthis.url = 'https://xxx/xxxx/test.pdf' // pdf文件的地址this.$refs.previewPdfh5.initPdf(this.url) // 父组件调用子组件的方法,动态渲染pdf}
}
</script>
这个方法到这里也很丝滑,上述方法的问题都没有碰到;然而在调后端接口时,报错了。
真是欲哭无泪,我上网找教程,根本没有。接口传过来的PDF里有一些字段是动态变化的,就导致这个问题出现。在我不懈奋斗了几个小时之后,无意间看到了pdfh5的中文文档的一个参数例子(如图),问题就解决啦!
给代码加个参数
methods: {initPdf(pdfUrl) {console.log('子组件的地址', pdfUrl)this.pdfh5 = new Pdfh5('#pdf-content', {pdfurl: pdfUrl,cMapUrl: 'https://unpkg.com/pdfjs-dist@2.0.943/cmaps/' // 改一下这个参数的默认地址})this.pdfh5.scrollEnable(true) this.pdfh5.on('ready', function() {console.log('总页数:' + this.totalNum)})this.pdfh5.on('complete', (status, msg, time) => {console.log('状态:' + status + ',信息:' + msg + ',耗时:' + time + '毫秒')})}}
这是我参考的文档地址:https://github.com/EncodingAESKey/pdfh5/blob/master/README.md
总结一下:磕磕碰碰也终于实现了功能。这几个方法都能实现功能;如果图方便就用iframe标签,图样式简洁且使用方法简单就用 vue-pdf 插件,图样式简洁且功能齐全就用 pdfh5 插件;至于embed 标签,我还没用过。不过我用 vue-pdf 插件遇到的问题,到现在也没解决好,不知道是不是移动端要添加什么配置,还是我代码环境不兼容;后面如果有好的解决方法,我会记得来更。
实现Vue移动端的PDF预览相关推荐
- vue 项目中实现pdf预览 pdf打印 pdf下载
在Vue项目中实现PDF预览.打印和下载可以通过以下步骤来实现: 安装pdf.js pdf.js是一个JavaScript库,可以用于在Web上渲染PDF文件. 可以使用npm安装pdf.js,命令如 ...
- Vue前端JavaScript实现PDF预览与图片预览
Vue前端JavaScript实现PDF预览与图片预览 说明 PDF.JS 代码实现 预览测试 embed与iframe标签 `<embed>` `<iframe>` 浏览器预 ...
- vue中前端实现pdf预览(含vue-pdf插件用法)
场景:前端需要根据后端返回的线上pdf的地址,实现pdf的预览功能. 情况一:后端返回的pdf地址,粘贴到浏览器的url框中,是可以在浏览器中直接进行预览的. 方法(1)可以直接使用window.op ...
- 移动端和PC端的pdf预览与下载
34.移动端和PC端的pdf的预览与下载 1.预览 需求:在手机端实现pdf的文件与下载,主要是zlb_app中 实现过程:在研究了vue-pdf.pdfjs.pdfh5之后,选择了vue-pdf-s ...
- vue移动端实现图片预览
接着上文的文件上传.下载.删除继续往下说,我们先说移动端的图片格式预览 上文说到了vue引用了vant插件,是一个很好用的移动端开发组件,它自带了上传文件的方法,当然也带了图片预览的方法 图片预览其实 ...
- pdfh5.js 基于pdf.js和jQuery,web/h5/移动端PDF预览手势缩放插件。
pdfh5.js 基于pdf.js和jQuery,web/h5/移动端PDF预览手势缩放插件. 注意:本地绝对路径地址不能加载,跨域问题用代理或者服务端解决. svg模式渲染存在缺陷,只能渲染普通pd ...
- 实现微信小程序和手机app(基于vue)PDF预览功能
引言:最近在做微信小程序和手机端app开发(基于vue),实现一个pdf预览功能. 需求:点击pdf列表,跳转到预览pdf页面,页面上强制阅读10s后,显示一个按钮返回,更新阅读状态: 要求:不能调用 ...
- uniapp移动端H5在线预览PDF等文件实现源码及注解
uniapp移动端H5预览文件实现分为两个场景处理: (这里以预览PDF文件为示例,在线预览就是查看网络文件) 1. IOS客户端预览PDF文件 IOS客户端预览PDF文件可以通过跳转文件地址实现预览 ...
- vue中pdf预览组件_Vue+ElementUI使用vue-pdf实现预览功能
Vue + ElementUI项目中使用vue-pdf实现简单预览,供大家参考,具体内容如下 1.安装 vue-pdf npm install --save vue-pdf 2.在vue页面中导入对应 ...
最新文章
- 【IOS】ios之httpServer
- html class css,div id class
- mysql memory leak_解决memory leak问题
- 想让数据分析更简便,怎能少了它!
- 百钱买白鸡与啤酒饮料
- java.sql.SQLSyntaxErrorException: ORA-00923: 未找到要求的 FROM 关键字
- windows高精度计数器
- redis mysql 视图_Redis 可以用来做数据库吗?
- 灵棋排盘:一款让人感到惊喜的命理排盘工具
- c语言以e为底和以10为底对数,以e为底的运算法则
- “正大杯”第十三届全国大学生市场调查与分析大赛(本科模拟题)
- 园林景观cad_5+ 园林景观设计PSD树木建筑人物鸟瞰图效果图ps后期分层素材库配景A...
- 163vip邮箱登录,163邮箱怎么登陆?如何登录163vip邮箱?
- 微观结构到应用材料力学行为
- 解决jest处理es模块
- 摄影_焦点、对焦、对焦点
- 淘宝直通车为什么要低价引流,低价引流的原理、低价引流的具体操作
- PYTHON3 Modbus_tk
- 运维-系统监控方案:基于Grafana的TDengine零依赖监控解决方案
- 纯CSS 红砖背景墙