位置: IT常识 - 正文

后端返回PDF文件流,前端处理展示及打印(补:PDF多页不显示问题)(后端返回pdf文件地址,前端怎么渲染到页面)

编辑:rootadmin
后端返回PDF文件流,前端处理展示及打印(补:PDF多页不显示问题)

推荐整理分享后端返回PDF文件流,前端处理展示及打印(补:PDF多页不显示问题)(后端返回pdf文件地址,前端怎么渲染到页面),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:后端返回pdf文件流,后端返回pdf文件地址,前端怎么渲染到页面,后端返回pdf文件,并打印,后端返回pdf文件地址,前端怎么渲染到页面,后端返回pdf文件地址前端页面预览,后端返回pdf文件url,前端怎么处理,后端返回pdf文件流,后端返回pdf文件流,内容如对您有帮助,希望把文章链接给更多的朋友!

国庆突如其来的加班q.q,上午接到的需求,只能起床啦

自己也是第一次接触这种业务需求,进行了一顿cv大法,网上有很多版本,个人学习借鉴(cv)了一下,在这里做个学习记录,欢迎各位指正优化,参考学习,如有侵权立即删除。

printDialog.vue(PDF使用弹窗展示,确认btn打印)

HTML

<template> <div> <el-dialog title="打印" :visible.sync="dialogVisible" width="50%"> <div class="box"> <pdf ref="pdf" :src="pdfUrl"></pdf> </div> <span slot="footer" class="dialog-footer"> <el-button @click="dialogVisible = false">取 消</el-button> <el-button type="primary" @click="$refs.pdf.print()" >确 定</el-button > </span> </el-dialog> </div></template>

js

<script>//插件vue-pdf-signatureimport pdf from "vue-pdf-signature";import CMapReaderFactory from "vue-pdf-signature/src/CMapReaderFactory.js";export default { components: { pdf, }, data() { return { dialogVisible: false, pdfUrl:'' }; }, methods:{ init(res){ this.dialogVisible = true; this.getObjectURL(res) }, // 将返回的文件流数据转换为url(data: 文件流数据) getObjectURL(data) { let url = null; let file = new Blob([data], { type: "application/pdf" }); if (window.createObjectURL != undefined) { // 通用 url = window.createObjectURL(file); } else if (window.webkitURL != undefined) { // 兼容谷歌 try { url = window.webkitURL.createObjectURL(file); } catch (error) {} } else if (window.URL != undefined) { // 兼容其他 try { url = window.URL.createObjectURL(file); } catch (error) {} } //这里是重点,将处理的url使用CMapReaderFactory方法在进行处理 url = pdf.createLoadingTask({ url: url, CMapReaderFactory }); // 将转化后url赋值 this.pdfUrl = url; }, }};</script>父组件.vue(btn点击)

HTMl

<el-button size="small" type="primary" @click="subscriptionPrinting()" >打印</el-button>//弹窗<print-dialog ref="printDialog" ></print-dialog>

js

<script>import printDialog from "./printDialog.vue";export default { components: { printDialog, }, methods:{ subscriptionPrinting() { this.$http .get( `请求~~~`, { responseType: "blob",//这个必须带 } ) .then(({ data: res }) => { this.$refs['printDialog'].init(res); }); }, }</script>

以上就是全部代码了,坑还是比较多的以下来进行总结

1.插件的使用

后端返回PDF文件流,前端处理展示及打印(补:PDF多页不显示问题)(后端返回pdf文件地址,前端怎么渲染到页面)

  使用的是vue-pdf-signature而不是vue-pdf,是因为vue-pdf在第一次正常打开会正常显示,第二次打开会显示空白,控制台会提示报错(Error during font loading: Failed to execute 'postMessage' on 'Worker': ArrayBuffer at index 0 is already detached),vue-pdf-signature是大佬针对vue-pdf出现的这一问题进行的改良版。细看可前往大佬链接~

vue-pdf踩坑指南_快进小树林的博客-CSDN博客

2.不显示中文

  通过引入CMapReaderFactory.js解决,但是引入会出现1所描述的问题,所以采用了vue-pdf-signature进行解决(崇拜大佬ing)

3.向后端请求解析失败问题(显示空白,控制台提示报错)

  在请求中添加{              responseType: "blob",//这个必须带             }即可解决。

  请求回的文件流所做的数据处理在上面代码有注释,详看翻上

4.打印调用$refs.pdf.print()即可。

*补:PDF多页不展示问题

在处理返回流的方法(getObjectURL)中,this.numPages在data中

getObjectURL(data) { let url = null; let file = new Blob([data], { type: "application/pdf" }); if (window.createObjectURL != undefined) { // 通用 url = window.createObjectURL(file); } else if (window.webkitURL != undefined) { // 兼容谷歌 try { url = window.webkitURL.createObjectURL(file); } catch (error) {} } else if (window.URL != undefined) { // 兼容其他 try { url = window.URL.createObjectURL(file); } catch (error) {} } //这里是重点,将处理的url使用CMapReaderFactory方法在进行处理 url = pdf.createLoadingTask({ url: url, CMapReaderFactory }); url.promise.then(pdf=>{ this.unmPages = pdf.numPages // 将转化后url赋值 this.pdfUrl = url; },

html处

<div class="box"> <pdf ref="pdf" :src="pdfUrl" v-for="item in numPages" :key="index" :page="item"></pdf></div><el-button type="primary" @click="$refs.pdf[0].print()" >打 印</el-button >

处理pdf多页不展示问题

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

上一篇:Win7系统真三国无双提示无法找到XAPOFX1_5.dll的解决(真三国在哪下载)

下一篇:小孩不爱吃蔬菜怎么办(小孩不爱吃蔬菜怎么办?)

  • 申请A级纳税企业需具备哪些条件
  • 增值税留抵税额账务处理
  • 摊销无形资产商标权计入什么科目
  • 建筑公司包工包料账务处理
  • 计提个人所得税怎么计提
  • 承兑汇票私人贴现要多久
  • 土地摊销计入在建工程吗
  • 预算为负数实际为负数 怎么计算完成率
  • 对赌协议赢了怎么样
  • 个人投资款怎么入账
  • 港币转人民币差额怎么平帐?
  • 资金周转率计算公式期初占用资金
  • 服务费公司的账务处理
  • 建筑工程劳务承包
  • 税收分类编码如何填写
  • 补发工资个人所得税怎么申报
  • 附加税交税依据
  • 专票上少打了开户行账号可以认证吗
  • 小规模纳税人的增值税账务处理
  • 代垫资金的代购是什么
  • 应交增值税未认证怎么办
  • 费用化支出含义
  • 手机超过1万元有必要买吗
  • PRISMSVR.EXE - PRISMSVR是什么进程 有什么用
  • 小企业执行新会计准则吗
  • 预付的货款的发票在哪里
  • 向非绑定账户转账超限是什么意思
  • 外汇账户怎么做账
  • php实现批量删除
  • laravel自动生成接口文档
  • u启动怎么装机
  • 最早遥控器是谁发明的
  • 两台电脑文件共享,显示没有访问权限
  • 个体户变更为有限公司成立时间
  • nginx隐藏后缀
  • nerf 怎么瞄准
  • 应收票据确认坏账怎么处理
  • 前端处理map
  • php自动生成文章
  • 现金盘存的具体方法
  • 待抵扣进项税额和进项税额的区别
  • 研发费用计入科目
  • opengl全称
  • 电子承兑逾期超过30天怎么办
  • 研发类公司能不能生产
  • 管理费用的核算内容主要包括哪些
  • 营业收入的构成分析包括
  • 资产负债率如何
  • mysql数据库查询表命令
  • 在Windows平台上不属于命令ar-d的作用是
  • mysql 5.5 5.6 5.7
  • mysql错误日志在哪里
  • 固定资产卡片账是明细账吗
  • 付款退回怎么做账
  • 生产企业的模具费用计入什么科目
  • 受托加工物资如何开票
  • 进口关税免征
  • 加计扣除是什么时候申报
  • 股东之间股权转让的税务处理
  • 损益类科目借贷怎么记
  • 代收收入
  • 小微企业免征增值税优惠政策
  • 建筑业企业承包资质类别包括
  • 私营公司固定资产怎么查
  • sqlserver索引类型区别
  • 苹果系统声音怎么设置方法
  • win8尝试修复
  • windows10对话框是什么
  • javascript学习指南
  • 基于jQuey实现鼠标滑过变色(整行变色)
  • 批处理获取本地连接名称
  • 耳机插头怎么拔
  • unity平面透明
  • JQuery给select添加/删除节点的实现代码
  • Android as Bluetooth Low Energy Peripherial (GATT server).
  • 重庆地方税务局刘飞虎
  • 上海税务局实名认证流程
  • 如何查询甘肃省志愿录取状态
  • 一般纳税人什么意思
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设