作为一个后端开发,写前端的一些功能也是头大,好在网友强大,网上资源比较多;做一个移动端PDF预览的功能,本来可以通过window.open(),打开的,但是没办法,做后台的小伙伴,传给前端的数据是base64位,我只能按照后台给的数据进行处理了;

  方法一:

  最原始的方式:通过canvas将字节流转成图片,方法简单,别人的代码直接抄过来就能用;但是缺点也同样严重,图片展示清晰度很低

代码如下

   1.安装依赖    

npm install   pdfjs-dist

2.template代码:

<template>
<div style="background-color:white;height:100%;">
<div class="v-viewbtns">
<div style="position:relative">
<button @click="scaleAdd">+</button>
<button @click="scaleReduce">-</button>
</div>
</div>
<div class="pdfList" style="position:relative;overflow:auto;">
</div>
</div>
</template>

  3.js代码

import PDFJS from 'pdfjs-dist';
import {getters} from '@/lib/store';
import {Dialog} from 'vant'; export default {
data(){
return {
pdfDataList : '',
scale:100,
}
},
created() {
PDFJS.GlobalWorkerOptions.workerSrc = require('pdfjs-dist/build/pdf.worker.min.js');
},
mounted(){
this.getPdfList(); //在这里调用pdf的方法
},
methods:{
getPdfList(){
//这里是我用来请求后台返回给我返回base64格式的文件发的ajax请求
this.$toast.loading('加载中');
this.$axios.post(url, params)
.then(res => {
if(res.data){
this.getPageNum(res);
var data = res.data;
this.pdfDataList = data ; //接收传回来的数据
this.showPdf(); //调用生成PDF
}else{
this.loading = false;
Dialog.alert({
message:res.message
}).then(()=>{
this.$router.go(-1);
});
}
this.$toast.hide();
});
},
async showPdf(){
let pdfList = document.querySelector('.pdfList') //通过querySelector选择DOM节点,使用document.getElementById()也一样
let base64 = this.pdfDataList.fileValue //获得bas464编码
let decodedBase64 = atob(base64) //使用浏览器自带的方法解码
let pdf = await PDFJS.getDocument({data: decodedBase64}) //返回一个pdf对象
let pages = pdf.numPages //声明一个pages变量等于当前pdf文件的页数
for (let i = 1; i <= pages; i++) { //循环页数
let canvas = document.createElement('canvas') ;
let page = await pdf.getPage(i) //调用getPage方法传入当前循环的页数,返回一个page对象
let scale = 0.5;//缩放倍数,1表示原始大小
let width = document.body.clientWidth ;//窗口的宽度
let viewport = page.getViewport(scale);
let context = canvas.getContext('2d'); //创建绘制canvas的对象
canvas.height = viewport.height; //定义canvas高和宽
canvas.width = viewport.width;
let renderContext = {
canvasContext: context,
viewport: viewport
};
await page.render(renderContext)
canvas.className = 'canvas' //给canvas节点定义一个class名,这里我取名为canvas
pdfList.appendChild(canvas) //插入到pdfList节点的最后
}
}
this.loading = false ;
},
scaleAdd() {
if(this.scale == 300) return ;
this.scale += 10;
this.$refs.pdf.$el.style.width = parseInt(this.scale) + "%";
},
scaleReduce() {
this.scale += -10;
this.$refs.pdf.$el.style.width = parseInt(this.scale) + "%";
}
},
}

    方法一真的是相当简单了,,代码都是差不多一样,具体情况根据自己的业务需求改改就行了,但是这种方式处理问题也严重,就是pdf不清晰,缩放之后更严重。当然,为啥会很模糊,我当然是不知道的了。。。

  第二种方式更简单惹:使用vue的依赖PDFJS

第一步:安装依赖

npm install  vue-pdf
npm install   pdfjs-dist  //之前漏写了,一定要添加这个依赖,要不然会报错

  第二步:template页面

<template>
<div style="background-color:white;height:100%;">
<div class="v-viewbtns" :style="{'margin-top':screentHeight *0.72 +'px'}" >
<div style="position:relative">
<button @click="scaleAdd">+</button>
<button @click="scaleReduce">-</button>
</div>
</div>
<div class="pdfList" style="position:relative;overflow:auto;">
<pdf
v-for="i in numPages"
ref="pdf"
:src="pdfSrc"
:key="i"
:page="i" >
</pdf>
</div>
</div>
</template>

  第三步:JS代码

export default {
data(){
return {
pdfSrc:'',
scale:100,
numPages:0
}
},
components:{
pdf
},

created() {

   PDFJS.GlobalWorkerOptions.workerSrc = require('pdfjs-dist/build/pdf.worker.min.js');

   },

    mounted(){
this.getPdfList();
},
methods:{
getPdfList(){
//这里是我用来请求后台返回给我返回base64格式的文件发的ajax请求
this.$toast.loading('加载中');
this.$axios.post(url, params)
.then(res => {
if(res.data){
this.getPageNum(res);
}else{
this.loading = false;
Dialog.alert({
message:res.message
}).then(()=>{
this.$router.go(-1);
});
}
this.$toast.hide();
});
},
async getPageNum(res){//这里注意一下哈,因为传过来的base64位文件流,所以肯定不知道page是多少了,当然是要先获取一下页数啦
var decodedBase64 = atob(res.data.DocumentData)
var pdf = await PDFJS.getDocument({data: decodedBase64}) //返回一个pdf对象
this.numPages = pdf.numPages ;
this.pdfSrc = `data:application/pdf;base64,${res.data.DocumentData}`;

},
scaleAdd() {
if(this.scale == 300) return ;
this.scale += 10;
for(var i in this.$refs.pdf){
this.$refs.pdf[i].$el.style.width = parseInt(this.scale) + "%";
}
},
scaleReduce() {
if (this.scale == 100) {
return;
}
this.scale += -10;
for(var i in this.$refs.pdf){
this.$refs.pdf[i].$el.style.width = parseInt(this.scale) + "%";
}
}
},
}

    以上就是两种处理的方法,阔以看的出来,第二种方式明显代码更少一点,并且第二种,完美的保留了文件的清晰度;所以以后遇到base64位PDF展示就用第二种吧!

Vue-base64移动端PDF展示的更多相关文章

  1. VUE Base64编码图片展示与转换图片

    图片的 base64 编码就是可以将一副图片数据编码成一串字符串,使用该字符串代替图像地址,使用 base64 传输图片文件可以节省一个 http 请求,图片的 base64 编码可以算是前端优化的一 ...

  2. ASP.NET Core 与 Vue.js 服务端渲染

    http://mgyongyosi.com/2016/Vuejs-server-side-rendering-with-aspnet-core/ 原作者:Mihály Gyöngyösi 译者:oop ...

  3. vue中如何实现pdf文件预览?

    今天产品提出一个优化的需求,就是之前我们做的图片展示就是一个img标签搞定,由于我们做的是海外后台管理系统,那边的人上传的文件时pdf格式,vue本事是不支持这种格式文件展示的,于是就google搜索 ...

  4. NET Core 与 Vue.js 服务端渲染

    NET Core 与 Vue.js 服务端渲染 http://mgyongyosi.com/2016/Vuejs-server-side-rendering-with-aspnet-core/原作者: ...

  5. 基于Vue开发的门户网站展示和后台数据管理系统

    基于Vue的前端框架有很多,这几年随着前端技术的官方应用,总有是学不完的前端知识在等着我们,一个人的精力也是有限,不可能一一掌握,不过我们学习很大程度都会靠兴趣驱动,或者目标导向,最终是可以以点破面, ...

  6. 基于SqlSugar的开发框架循序渐进介绍(20)-- 在基于UniApp+Vue的移动端实现多条件查询的处理

    在做一些常规应用的时候,我们往往需要确定条件的内容,以便在后台进行区分的进行精确查询,在移动端,由于受限于屏幕界面的情况,一般会对多个指定的条件进行模糊的搜索,而这个搜索的处理,也是和前者强类型的条件 ...

  7. H5拖拽 构造拖拽及缩放 pdf展示

    前言: 协助项目需要实现一个签名的功能. 功能说明:1.有文本签名和头像签名.2.头像签名需要实现可拖拽功能.3.需要展示的是pdf的文件并需要获取签名位于pdf文件的相对位置. 功能一:实现拖拽 思 ...

  8. Vue.js 服务端渲染业务入门实践

    作者:威威(沪江前端开发工程师) 本文原创,转载请注明作者及出处. 背景 最近, 产品同学一如往常笑嘻嘻的递来需求文档, 纵使内心万般拒绝, 身体倒是很诚实. 接过需求,好在需求不复杂, 简单构思 后 ...

  9. vue.js移动端配置flexible.js

    前言 最近在用vue做移动端项目,网上找了一些移动端适配的方案,个人觉得手淘团队flexible.js还是比较容易上手,在这里做下总结. 主体 flexible.js适配方案采用rem布局,根据屏幕分 ...

随机推荐

  1. Java实现圆柱体表面积和体积的计算

    题目描述: Java编程实现圆柱体表面积和体积的计算,要求从键盘上输入圆的半径和高,然后输出结果. 题目分析: 首先定义Circle类,然后在main方法中创建Circle类的对象c,利用对象c访问其 ...

  2. 120行代码打造.netcore生产力工具-小而美的后台异步组件

    相信绝大部分开发者都接触过用户注册的流程,通常情况下大概的流程如下所示: 接收用户提交注册信息 持久化注册信息(数据库+redis) 发送注册成功短信(邮件) 写操作日志(可选) 伪代码如下: pub ...

  3. JSON案例

    原文链接:https://zhuanlan.zhihu.com/p/62763428 json字符串->JSONObject 用JSON.parseObject()方法即可将JSon字符串转化为 ...

  4. 测试必备工具之最强抓包神器 Charles,你会了么?

    前言 ​ 作为软件测试工程师,大家在工作中肯定经常会用到各种抓包工具来辅助测试,比如浏览器自带的抓包工具-F12,方便又快捷:比如时下特别流行的Fiddler工具,使用各种web和APP测试的各种场景 ...

  5. 商城05——首页轮播图显示实现&Redis环境搭建&Redis实现缓存

    1.   课程计划 1.首页轮播图的展示 2.首页大广告展示流程图 3.Redis的常用命令 4.Redis的服务器搭建 (集群的搭建) 5.向业务逻辑中添加缓存 6.Jedis的使用(redis的客 ...

  6. ULVAC爱发科皮拉尼真空计SW1-N说明书-手册

    ULVAC爱发科皮拉尼真空计SW1-N1/N2/N SWP-16-N/传感器单元规管 https://wenku.baidu.com/view/cff03803a6c30c2259019ef5.htm ...

  7. cb39a_c++_STL_算法_for_each_transform_比较

    cb39a_c++_STL_算法_for_each_transform_比较for_each() 速度快,不灵活transform() 速度慢, 非常灵活 STL算法-修改性算法for_each()c ...

  8. 微信小程序踩坑之前端问题处理篇

    近期完成了一个小程序,自己做的前后端开发.真是惨哭我了o(╥﹏╥)o,下面几点希望大家可以避雷. 首先,想先介绍一下我遇到问题的解决思路: 1.先在postman调试接口,看数据获取是否正常, 2.在 ...

  9. Java学习笔记6(集合类)

    集合类 集合按照其存储结构可以分为两大类,即单列集合Collection和双列集合Map. Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,有List和Set两个重要子接口 ...

  10. typedef 定义指针数组和数组指针及其使用。

    #include<stdio.h> typedef char arr[][]; typedef char *name[]; // 指针数组 typedef char (*lan)[]; / ...