最近做到一个功能,PDF预览;这个功能看着蛮简单的,结果搞了两个下午,真是欲哭无泪。记录一下所查到的预览方法。
我在网上找了蛮多教程的,大致都是以下几个方法实现预览:

  1. 使用 iframe 标签
  2. 使用 embed 标签
  3. 安装 Vue 插件 vue-pdf
  4. 安装 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预览相关推荐

  1. vue 项目中实现pdf预览 pdf打印 pdf下载

    在Vue项目中实现PDF预览.打印和下载可以通过以下步骤来实现: 安装pdf.js pdf.js是一个JavaScript库,可以用于在Web上渲染PDF文件. 可以使用npm安装pdf.js,命令如 ...

  2. Vue前端JavaScript实现PDF预览与图片预览

    Vue前端JavaScript实现PDF预览与图片预览 说明 PDF.JS 代码实现 预览测试 embed与iframe标签 `<embed>` `<iframe>` 浏览器预 ...

  3. vue中前端实现pdf预览(含vue-pdf插件用法)

    场景:前端需要根据后端返回的线上pdf的地址,实现pdf的预览功能. 情况一:后端返回的pdf地址,粘贴到浏览器的url框中,是可以在浏览器中直接进行预览的. 方法(1)可以直接使用window.op ...

  4. 移动端和PC端的pdf预览与下载

    34.移动端和PC端的pdf的预览与下载 1.预览 需求:在手机端实现pdf的文件与下载,主要是zlb_app中 实现过程:在研究了vue-pdf.pdfjs.pdfh5之后,选择了vue-pdf-s ...

  5. vue移动端实现图片预览

    接着上文的文件上传.下载.删除继续往下说,我们先说移动端的图片格式预览 上文说到了vue引用了vant插件,是一个很好用的移动端开发组件,它自带了上传文件的方法,当然也带了图片预览的方法 图片预览其实 ...

  6. pdfh5.js 基于pdf.js和jQuery,web/h5/移动端PDF预览手势缩放插件。

    pdfh5.js 基于pdf.js和jQuery,web/h5/移动端PDF预览手势缩放插件. 注意:本地绝对路径地址不能加载,跨域问题用代理或者服务端解决. svg模式渲染存在缺陷,只能渲染普通pd ...

  7. 实现微信小程序和手机app(基于vue)PDF预览功能

    引言:最近在做微信小程序和手机端app开发(基于vue),实现一个pdf预览功能. 需求:点击pdf列表,跳转到预览pdf页面,页面上强制阅读10s后,显示一个按钮返回,更新阅读状态: 要求:不能调用 ...

  8. uniapp移动端H5在线预览PDF等文件实现源码及注解

    uniapp移动端H5预览文件实现分为两个场景处理: (这里以预览PDF文件为示例,在线预览就是查看网络文件) 1. IOS客户端预览PDF文件 IOS客户端预览PDF文件可以通过跳转文件地址实现预览 ...

  9. vue中pdf预览组件_Vue+ElementUI使用vue-pdf实现预览功能

    Vue + ElementUI项目中使用vue-pdf实现简单预览,供大家参考,具体内容如下 1.安装 vue-pdf npm install --save vue-pdf 2.在vue页面中导入对应 ...

最新文章

  1. 【IOS】ios之httpServer
  2. html class css,div id class
  3. mysql memory leak_解决memory leak问题
  4. 想让数据分析更简便,怎能少了它!
  5. 百钱买白鸡与啤酒饮料
  6. java.sql.SQLSyntaxErrorException: ORA-00923: 未找到要求的 FROM 关键字
  7. windows高精度计数器
  8. redis mysql 视图_Redis 可以用来做数据库吗?
  9. 灵棋排盘:一款让人感到惊喜的命理排盘工具
  10. c语言以e为底和以10为底对数,以e为底的运算法则
  11. “正大杯”第十三届全国大学生市场调查与分析大赛(本科模拟题)
  12. 园林景观cad_5+ 园林景观设计PSD树木建筑人物鸟瞰图效果图ps后期分层素材库配景A...
  13. 163vip邮箱登录,163邮箱怎么登陆?如何登录163vip邮箱?
  14. 微观结构到应用材料力学行为
  15. 解决jest处理es模块
  16. 摄影_焦点、对焦、对焦点
  17. 淘宝直通车为什么要低价引流,低价引流的原理、低价引流的具体操作
  18. PYTHON3 Modbus_tk
  19. 运维-系统监控方案:基于Grafana的TDengine零依赖监控解决方案
  20. 纯CSS 红砖背景墙

热门文章

  1. 前端攻城狮的自我修养1
  2. 安装SQL Server 2008 及 VS 2008
  3. Eclipse 汉化教程完美版
  4. Camera 冷启动阶段分解
  5. 黑马程序员java学习打卡----程序流程控制
  6. 武汉大学 计算机学院 许传奇,许永超 - 教师简历 CV- 武汉大学计算机学院
  7. cross_val_score中scoring参数
  8. 记一次阿里云k8s部署-测试存储
  9. Unity两种获取屏幕点击位置的世界坐标方法
  10. 电脑重装系统经验总结