位置: IT常识 - 正文

接收后端返回的pdf文件流 前端使用Vue-pdf实现预览(分页)(后端接口返回数据类型规范)

编辑:rootadmin
接收后端返回的pdf文件流 前端使用Vue-pdf实现预览(分页) vue系列文章目录

推荐整理分享接收后端返回的pdf文件流 前端使用Vue-pdf实现预览(分页)(后端接口返回数据类型规范),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:后端返回数据格式有哪些,前端接收后端返回值,后端接口返回数据类型规范,后端接收对象,后端返回数据格式有哪些,前端接收后端返回值,后端接口返回数据类型规范,前端接收后端返回值,内容如对您有帮助,希望把文章链接给更多的朋友!

需求:后端返回文件流前端将文件流转为成blob地址预览pdf文件

提示:以下是本篇文章正文内容,下面案例可供参考

一、安装PDF插件依赖

npm install vue-pdf --save

二、封装vuePdf组件为预览页面,通过Management.vue路由传参形式跳转到预览页面1.Management.vue

代码如下(示例):

封装的请求pdfDocument 一定要加上 { responseType: "blob", }

后台返回的pdf文件流 也就是result.data 附代码:

// 预览 async scanSubmit(row) { // 这个代码我不多做解释,接口请求而已 const result = await pdfDocument(this.fileId); // 直接使用createObjectURL可能会出现问题 // 所以我建议使用下面这种方式将文件流转化为本地blod地址 var binaryData = []; binaryData.push(result.data); console.log(binaryData); // 记得一定要设置application的类型 let url = window.URL.createObjectURL( new Blob(binaryData, { type: "application/pdf;charset=utf-8", }) ); if (url != null && url != undefined && url) { // vue路由跳转并以问号形式携带vue-pdf预览时所需要的pdf地址 const { href } = this.$router.resolve({ path: "/vuePdf", query: { //要传的参数 url: url, }, }); // 新页面打开 window.open(href, "_blank"); this.openTheScanningdialog = false; } },2.vuedf.vue接收后端返回的pdf文件流 前端使用Vue-pdf实现预览(分页)(后端接口返回数据类型规范)

HTML部分,无需修改,复制可直接使用

<template> <div id="container"> <!-- 上一页、下一页 --> <div class="right-btn"> <!-- 输入页码 --> <div class="pageNum"> <input v-model.number="currentPage" type="number" class="inputNumber" @input="inputEvent()" /> / {{ pageCount }} </div> <div @click="changePdfPage('first')" class="turn">首页</div> <!-- 在按钮不符合条件时禁用 --> <div @click="changePdfPage('pre')" class="turn-btn" :style="currentPage === 1 ? 'cursor: not-allowed;' : ''" > 上一页 </div> <div @click="changePdfPage('next')" class="turn-btn" :style="currentPage === pageCount ? 'cursor: not-allowed;' : ''" > 下一页 </div> <div @click="changePdfPage('last')" class="turn">尾页</div> </div> <div class="pdfArea"> <!-- // 不要改动这里的方法和属性,下次用到复制就直接可以用 --> <pdf :src="src" ref="pdf" v-show="loadedRatio === 1" :page="currentPage" @num-pages="pageCount = $event" @progress="loadedRatio = $event" @page-loaded="currentPage = $event" @loaded="loadPdfHandler" @link-clicked="currentPage = $event" style="display: inline-block; width: 100%" id="pdfID" ></pdf> </div> <!-- 加载未完成时,展示进度条组件并计算进度 --> <div class="progress" v-if="loadedRatio != 1"> <el-progress type="circle" :width="70" color="#53a7ff" :percentage=" Math.floor(loadedRatio * 100) ? Math.floor(loadedRatio * 100) : 0 " ></el-progress> <br /> <!-- 加载提示语 --> <span>{{ remindShow }}</span> </div> </div></template>

JS部分,无需修改,复制可直接使用

<script>import pdf from "vue-pdf";export default { components: { pdf, }, data() { return { // ----- loading ----- remindText: { loading: "加载文件中,文件较大请耐心等待...", refresh: "若卡住不动,可刷新页面重新加载...", }, remindShow: "加载文件中,文件较大请耐心等待...", intervalID: "", // ----- vuepdf ----- // src静态路径: /static/xxx.pdf // src服务器路径: 'http://.../xxx.pdf' src: "", // 当前页数 currentPage: 0, // 总页数 pageCount: 0, // 加载进度 loadedRatio: 0, }; }, created() { // 页面加载,拿到路由中的url复制给data中的src this.src = this.$route.query.url; console.log(this.src); }, mounted() { // // 更改 loading 文字 this.intervalID = setInterval(() => { this.remindShow === this.remindText.refresh ? (this.remindShow = this.remindText.loading) : (this.remindShow = this.remindText.refresh); }, 4000); }, methods: { // 页面回到顶部 toTop() { document.getElementById("container").scrollTop = 0; }, // 输入页码时校验 inputEvent() { if (this.currentPage > this.pageCount) { // 1. 大于max this.currentPage = this.pageCount; } else if (this.currentPage < 1) { // 2. 小于min this.currentPage = 1; } }, // 切换页数 changePdfPage(val) { if (val === "pre" && this.currentPage > 1) { // 切换后页面回到顶部 this.currentPage--; this.toTop(); } else if (val === "next" && this.currentPage < this.pageCount) { this.currentPage++; this.toTop(); } else if (val === "first") { this.currentPage = 1; this.toTop(); } else if (val === "last" && this.currentPage < this.pageCount) { this.currentPage = this.pageCount; this.toTop(); } }, // pdf加载时 loadPdfHandler(e) { // 加载的时候先加载第一页 this.currentPage = 1; }, }, destroyed() { // 在页面销毁时记得清空 setInterval clearInterval(this.intervalID); },};</script>

CSS部分,可根据自己的需求自行修改

<style scoped>#container { position: absolute !important; left: 0; right: 0; bottom: 0; top: 0; background: #f4f7fd; overflow: auto; font-family: PingFang SC; width: 100%; display: flex; /* justify-content: center; */ position: relative;}/* 右侧功能按钮区 */.right-btn { position: fixed; right: 5%; bottom: 15%; width: 120px; display: flex; flex-wrap: wrap; justify-content: center; z-index: 99;}.pdfArea { width: 900px; margin: 0 auto;}/* ------------------- 输入页码 ------------------- */.pageNum { margin: 10px 0; font-size: 18px;}/*在谷歌下移除input[number]的上下箭头*/input::-webkit-outer-spin-button,input::-webkit-inner-spin-button { -webkit-appearance: none !important; margin: 0;}/*在firefox下移除input[number]的上下箭头*/input[type="number"] { -moz-appearance: textfield;}.inputNumber { border-radius: 8px; border: 1px solid #999999; height: 35px; font-size: 18px; width: 60px; text-align: center;}.inputNumber:focus { border: 1px solid #00aeff; background-color: rgba(18, 163, 230, 0.096); outline: none; transition: 0.2s;}/* ------------------- 切换页码 ------------------- */.turn { background-color: #164fcc; opacity: 0.9; color: #ffffff; height: 70px; width: 70px; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin: 5px 0;}.turn-btn { background-color: #164fcc; opacity: 0.9; color: #ffffff; height: 70px; width: 70px; border-radius: 50%; margin: 5px 0; display: flex; align-items: center; justify-content: center;}.turn-btn:hover,.turn:hover { transition: 0.3s; opacity: 0.5; cursor: pointer;}/* ------------------- 进度条 ------------------- */.progress { position: absolute; right: 50%; top: 50%; text-align: center;}.progress > span { color: #199edb; font-size: 14px;}</style>效果图

**

实现下载/在线打开

**

①安装downloadjs

npm install downloadjs

②在需要的地方引入

import download from 'downloadjs'

③在下载的方法里调用download就可以实现下载了

文件流数据 保存的名字 要下载的文件类型

本文链接地址:https://www.jiuchutong.com/zhishi/283607.html 转载请保留说明!

上一篇:fs20.exe是什么进程 有什么作用 fs20进程查询(电脑fs0是什么)

下一篇:一只躺在沙滩上的港海豹幼崽,德国黑尔戈兰岛 (© Fotofeeling/Westend61/Offset)(一只躺在沙滩上的鸟)

  • 手机收款语音不播报是怎么回事(手机收款语音不播报怎么办)

    手机收款语音不播报是怎么回事(手机收款语音不播报怎么办)

  • 华为手机怎么给部分照片加密(华为手机怎么给另一个手机充电)

    华为手机怎么给部分照片加密(华为手机怎么给另一个手机充电)

  • 华为的otg功能在哪里(华为的OTG功能在哪打开)

    华为的otg功能在哪里(华为的OTG功能在哪打开)

  • 苹果电脑漏电是什么原因(苹果电脑漏电是什么原因开不了机)

    苹果电脑漏电是什么原因(苹果电脑漏电是什么原因开不了机)

  • 电脑上全选是哪两个键(电脑上全选是哪个快捷键)

    电脑上全选是哪两个键(电脑上全选是哪个快捷键)

  • 网络层的协议有哪些(属于网络层的协议有)

    网络层的协议有哪些(属于网络层的协议有)

  • 苹果XS停产了吗(iphone xs停产了嘛)

    苹果XS停产了吗(iphone xs停产了嘛)

  • 如何让小米手机耗电慢(如何让小米手机变得流畅不卡顿)

    如何让小米手机耗电慢(如何让小米手机变得流畅不卡顿)

  • 路由器光猫机顶盒三方怎么连接(路由器光猫机顶盒集中供电)

    路由器光猫机顶盒三方怎么连接(路由器光猫机顶盒集中供电)

  • 爱奇艺属于腾讯吗(爱奇艺属于腾讯还是阿里)

    爱奇艺属于腾讯吗(爱奇艺属于腾讯还是阿里)

  • 微信收款不发货能追回吗(微信收款不发货怎么追回钱)

    微信收款不发货能追回吗(微信收款不发货怎么追回钱)

  • 蓝牙mesh有什么用(蓝牙mesh wifi mesh)

    蓝牙mesh有什么用(蓝牙mesh wifi mesh)

  • 为什么微信步数只显示一部分人(为什么微信步数与实际步数不符)

    为什么微信步数只显示一部分人(为什么微信步数与实际步数不符)

  • 苹果手机怎么放大图片中的一部分(苹果手机怎么放小屏)

    苹果手机怎么放大图片中的一部分(苹果手机怎么放小屏)

  • 华为手机支付宝怎么分身(华为手机支付宝在桌面不显示不出来)

    华为手机支付宝怎么分身(华为手机支付宝在桌面不显示不出来)

  • 手机存储文件哪些能删除(手机储存文件的app排行)

    手机存储文件哪些能删除(手机储存文件的app排行)

  • 新浪微博拉黑对方知道吗(新浪微博拉黑对方后是怎样的)

    新浪微博拉黑对方知道吗(新浪微博拉黑对方后是怎样的)

  • 计算机硬件设备有哪些(鼠标是最容易出故障的计算机硬件设备)

    计算机硬件设备有哪些(鼠标是最容易出故障的计算机硬件设备)

  • iphone11都是全网通吗(苹果11全网通嘛)

    iphone11都是全网通吗(苹果11全网通嘛)

  • 苹果11和苹果11pro区别(苹果11和苹果11pro手机壳通用吗)

    苹果11和苹果11pro区别(苹果11和苹果11pro手机壳通用吗)

  • 手机上的手电筒在哪找(手机上的手电筒不见了怎么找回)

    手机上的手电筒在哪找(手机上的手电筒不见了怎么找回)

  • 苹果手机的超广角怎么打开(苹果手机的超广角在哪里)

    苹果手机的超广角怎么打开(苹果手机的超广角在哪里)

  • 淘宝账户已被保护如何解除(淘宝账户已被保护还能解除吗)

    淘宝账户已被保护如何解除(淘宝账户已被保护还能解除吗)

  • 苹果x下载软件为什么需要验证(苹果X下载软件显示未完成支付是怎么了)

    苹果x下载软件为什么需要验证(苹果X下载软件显示未完成支付是怎么了)

  • 手机怎么打彩色字体(手机怎么打彩色灯光)

    手机怎么打彩色字体(手机怎么打彩色灯光)

  • 26650锂电池对比18650(26650锂电池对比1号电池)

    26650锂电池对比18650(26650锂电池对比1号电池)

  • 荣耀20怎么复制门禁卡(荣耀20怎么复制门禁卡怎样复制门禁卡)

    荣耀20怎么复制门禁卡(荣耀20怎么复制门禁卡怎样复制门禁卡)

  • 小米9重量(小米10重量)

    小米9重量(小米10重量)

  • 小米手环4怎么连蓝牙(小米手环4怎么设置密码)

    小米手环4怎么连蓝牙(小米手环4怎么设置密码)

  • 股票印花税如何计算
  • 进口货物的会计科目
  • 会计做账借贷怎么做
  • 工业企业总产值的计算是以什么为主体
  • 母子公司借款要交什么税
  • 资本公积转增股本什么意思
  • 什么情况下要做试管怀孕
  • 会务费账务处理
  • 企业购买机械设备是否需要进行过户登记
  • 停工损失会计科目
  • 地税局返的个人所得税手续费多久返还?
  • 营改增之后还有营业税吗
  • 营改增阶段
  • 房地产开发企业会计科目
  • 旅行社差额征税增值税申报表怎么填
  • 小规模纳税人核定征收标准
  • 公司经营困难情况说明怎么写
  • 公司年终分红如何入账
  • 工会经费计税依据是应发还是实发
  • 审计报告报备流程
  • 会计审核票据如何签字
  • 内账进项税不设置怎么账务处理
  • 固定资产原值减少说明什么
  • Win10 Build21376内测版发布 重新设计默认用户界面字体
  • php常用设计模式(大总结)
  • php限制登录次数
  • 餐饮业原料采购都包括哪些
  • 会计核算形式的定义
  • 世界著名气泡酒公司
  • 拱门国家公园景点
  • 未按规定采取预防措施,导致发生严重突发事件的
  • Pont Rouge (Red Bridge) over the Palmer River in Sainte-Agathe-de-Lotbinière, Quebec, Canada (© Jean Surprenant/Getty Images)
  • 长期借款利息调整会计分录
  • 如何收取会员会费才合法
  • ai作画app
  • php获取目录所有文件
  • 微信小程序入门指南
  • thinkphp获取数据库数据
  • 孪生神经网络 计算相似度
  • 免抵退税额怎么计算城建税
  • python frames
  • 融资租赁首付租金定义
  • 没有盈利的公司
  • 应付账款贷方余额怎么处理
  • 未确认融资费用账务处理
  • 业务招待费的列支范围
  • 充电桩的安装费是多少
  • 出口货物关税完税价格包括哪些
  • 房地产企业所得税管理办法
  • 资本公积转增资本要交税吗
  • 现金等价物的特征是
  • 合伙企业对外投资需要全体合伙人同意吗
  • 人力资源社保代缴
  • 企业应如何合理安排筹资期限的组合方式,优化资金结构
  • 产业扶持资金账户是什么
  • 逾期贷款利息收入增值税和企业所得税纳税义务时间
  • 培训发票能抵扣吗
  • 固定资产折旧从什么时候
  • 金蝶银行存款日记账
  • 事业单位收入是再分配吗
  • 公司账户美金入账后怎么做分录
  • 新成立的公司购买的家具可以计入主营业务成本吗
  • 红十字会是事业编还是行政编
  • mysql优化查询
  • linux pb
  • open bsd
  • windowsxp停止服务的时间
  • os x yosemite dp5下载地址 os x 10.10 dp5更新内容
  • scair.exe是什么程序
  • 系统应用没有相机
  • windows8有几个模式
  • win10个性化颜色在开始任务栏选不了
  • 开快打开
  • 趣谈 linux 操作系统
  • CCClippingNode导致的贴图错误问题
  • 购置税完税证明在哪里打印
  • 股权收购的好处
  • 资源税是什么?
  • 城市维护建设税税基是什么
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设