Vue-base64移动端PDF展示
作为一个后端开发,写前端的一些功能也是头大,好在网友强大,网上资源比较多;做一个移动端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;">
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展示的更多相关文章
- VUE Base64编码图片展示与转换图片
图片的 base64 编码就是可以将一副图片数据编码成一串字符串,使用该字符串代替图像地址,使用 base64 传输图片文件可以节省一个 http 请求,图片的 base64 编码可以算是前端优化的一 ...
- ASP.NET Core 与 Vue.js 服务端渲染
http://mgyongyosi.com/2016/Vuejs-server-side-rendering-with-aspnet-core/ 原作者:Mihály Gyöngyösi 译者:oop ...
- vue中如何实现pdf文件预览?
今天产品提出一个优化的需求,就是之前我们做的图片展示就是一个img标签搞定,由于我们做的是海外后台管理系统,那边的人上传的文件时pdf格式,vue本事是不支持这种格式文件展示的,于是就google搜索 ...
- NET Core 与 Vue.js 服务端渲染
NET Core 与 Vue.js 服务端渲染 http://mgyongyosi.com/2016/Vuejs-server-side-rendering-with-aspnet-core/原作者: ...
- 基于Vue开发的门户网站展示和后台数据管理系统
基于Vue的前端框架有很多,这几年随着前端技术的官方应用,总有是学不完的前端知识在等着我们,一个人的精力也是有限,不可能一一掌握,不过我们学习很大程度都会靠兴趣驱动,或者目标导向,最终是可以以点破面, ...
- 基于SqlSugar的开发框架循序渐进介绍(20)-- 在基于UniApp+Vue的移动端实现多条件查询的处理
在做一些常规应用的时候,我们往往需要确定条件的内容,以便在后台进行区分的进行精确查询,在移动端,由于受限于屏幕界面的情况,一般会对多个指定的条件进行模糊的搜索,而这个搜索的处理,也是和前者强类型的条件 ...
- H5拖拽 构造拖拽及缩放 pdf展示
前言: 协助项目需要实现一个签名的功能. 功能说明:1.有文本签名和头像签名.2.头像签名需要实现可拖拽功能.3.需要展示的是pdf的文件并需要获取签名位于pdf文件的相对位置. 功能一:实现拖拽 思 ...
- Vue.js 服务端渲染业务入门实践
作者:威威(沪江前端开发工程师) 本文原创,转载请注明作者及出处. 背景 最近, 产品同学一如往常笑嘻嘻的递来需求文档, 纵使内心万般拒绝, 身体倒是很诚实. 接过需求,好在需求不复杂, 简单构思 后 ...
- vue.js移动端配置flexible.js
前言 最近在用vue做移动端项目,网上找了一些移动端适配的方案,个人觉得手淘团队flexible.js还是比较容易上手,在这里做下总结. 主体 flexible.js适配方案采用rem布局,根据屏幕分 ...
随机推荐
- Windows10开启Ubuntu子系统并搭建Docker环境
前言 很早就听说微软有个基于Ubuntu的子系统,一直也没机会尝试一下,之前也只是用VMware安装,但是还要单独安装软件,安装镜像,一点都不fit,所以就瞎折腾下(也是因为最近有空). 搭建Ubun ...
- pi-star镜像 下载地址
Pi-Star_NanoPi_Air_V3.4.17_09-Jan-2019.zip nanopi air点这里 Pi-Star_NanoPi_V3.4.17_09-Jan-2019.zip nan ...
- 关于linux免密登录及ssh客户端的使用
操作系统环境: CentOS Linux release 7.7.1908 (Core) 1.首先在linux服务器上,使用ssh-keygen命令生成密钥对文件(一直回车即可,默认使用rsa算法), ...
- python3 修改计算机名称GUI程序
from tkinter import *from tkinter import messageboximport tkinterimport winregimport osdef serch(): ...
- HDFS ha 格式化报错:a shared edits dir must not be specified if HA is not enabled.
错误内容: Formatting using clusterid: CID-19921335-620f-4e72-a056-899702613a6b2019-01-12 07:28:46,986 IN ...
- AddDbContext was called with configuration, but the context type 'MyDBContext' only declares a parameterless constructor
System.ArgumentException HResult=0x80070057 Message=AddDbContext was called with configuration, but ...
- 一文带你快速搞懂动态字符串SDS,面试不再懵逼
目录 redis源码分析系列文章 前言 API使用 embstr和raw的区别 SDSHdr的定义 SDS具体逻辑图 SDS的优势 更快速的获取字符串长度 数据安全,不会截断 SDS关键代码分析 获取 ...
- TypeScript使用体会(一)
typescript使用体会 近期接手了一个公司项目是由TS写的,第一次用在这里做一下简单的使用体会 个人觉得TS与JS相差不多,只是多了一些约束(可能自己还没体会到精髓) typescript是Ja ...
- react使用Echarts绘制高亮可点击选中的省市地图
最近做项目遇到一个需求,需要显示广东省各个地级市的地图,并且鼠标移入高亮显示,鼠标点击可以选中某个地级市.在网上查阅了大量资料之后,最后选择了使用echarts实现该需求.在此记录一下,希望可以帮到有 ...
- C和C++中static的比较
using namespace std; class A{ private: static int a;//由static修饰的变量仅仅是一个声明,不能在此处进行初始化,需要在类的外部初始化. voi ...