作为一个后端开发,写前端的一些功能也是头大,好在网友强大,网上资源比较多;做一个移动端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实现第八届蓝桥杯兴趣小组

    兴趣小组 为丰富同学们的业余文化生活,某高校学生会创办了3个兴趣小组 (以下称A组,B组,C组). 每个小组的学生名单分别在[A.txt],[B.txt]和[C.txt]中. 每个文件中存储的是学生的 ...

  2. Java实现第八届蓝桥杯日期问题

    日期问题 题目描述 小明正在整理一批历史文献.这些历史文献中出现了很多日期.小明知道这些日期都在1960年1月1日至2059年12月31日.令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/ ...

  3. tensorflow2.0学习笔记第二章第二节

    2.2复杂度和学习率 指数衰减学习率可以先用较大的学习率,快速得到较优解,然后逐步减少学习率,使得模型在训练后期稳定指数衰减学习率 = 初始学习率 * 学习率衰减率^(当前轮数/多少轮衰减一次) 空间 ...

  4. React、Vue添加全局的请求进度条(nprogress)

    全局的请求进度条,我们可以使用nprogress来实现,效果如下: 首先需要安装插件: npm i nprogress -S 然后使用的时候主要有两种方式,第一种是切换页面的时候,第二种则是请求接口的 ...

  5. CentOS8.1安装Docker及Docker-compose

    使用 Docker 仓库进行安装 在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库.之后,您可以从仓库安装和更新 Docker. 设置仓库 安装所 ...

  6. 刷一遍《剑指Offer》,你还需要这些知识!(一刷)

    因为时间紧和基础薄弱,一刷<剑指Offer>就变成了速看. 我按照: 1.看题目思考一会: 2.上网找找关于题目里不懂的知识点: 3.看评论和官方题解的解法,尽量看懂,并及时弄懂不懂的地方 ...

  7. 【Spring注解驱动开发】面试官:如何将Service注入到Servlet中?朋友又栽了!!

    写在前面 最近,一位读者出去面试前准备了很久,信心满满的去面试.没想到面试官的一个问题把他难住了.面试官的问题是这样的:如何使用Spring将Service注入到Servlet中呢?这位读者平时也是很 ...

  8. WPS2016ProPlus_normal 安装包+序列号

    WPS OFFICE 2016 安装 链接:https://pan.baidu.com/s/1dfjNFDxcl1n2fvYTt9c86A 提取码: ij8e 下载解压:.txt是序列号,.exe是安 ...

  9. JSR133提案-修复Java内存模型

    目录 1. 什么是内存模型? 2. JSR 133是关于什么的? 3. 再谈指令重排序 4.同步都做了什么? 5. final字段在旧的内存模型中为什么可以改变? 6."初始化安全" ...

  10. cb27a_c++_STL_算法_最小值和最大值

    cb27a_c++_STL_算法_最小值和最大值min_element(b,e) b--begin(), e--end()min_element(b,e,op). op:函数,函数对象,一元谓词.ma ...