前端预览和打印PDF的两种方式
最近工作中遇到了一个需求,就是前端选择表格中的某一条数据去请求后端接口,后端返回的是一个PDF文件的下载地址,但是需求不希望用户下载下来再去打印,而是直接预览展示,然后就能打印。
一开始按照网上的方式去操作,但是每一次浏览器直接就下载了下来,后面一看响应头,原来后端的Content-type设置成了如图所示,直接触发了浏览器的下载。

怎么办呢?于是就想到了以下两种方案,两种方案都是再一次去请求返回的地址,只不过前端改成了用二进制Blob(responseType: 'blob'),获取原始二进制数据
方案一如下图所示:
其中的data为要传入的地址,然后将拿到的结果创建一个Blob对象,并重新指定其MIME类型为{ type: 'application/pdf '},这样就不会再触发浏览器的下载功能。接着使用URL.createObjectURL()生成临时访问地址,通过window.open()的方式在新窗口打开预览,等待加载后自动打印。

但是这种方案要确保后端设置了如下的CORS头,这种方案兼容所有现代浏览器(Chrome/Firefox/Edge/Safari)
Access-Control-Allow-Origin: * Access-Control-Allow-Methods: GET
方案二如下图所示:
创建一个隐藏的iframe标签src设置为pdf地址;前端通过获取隐藏的iframe标签的id来实现打印指定内容;

附上具体代码:
async batchPrintReturn(data) {
axios.get(data,{responseType: 'blob'}).then(res => { // 以二进制Blob格式接收
console.log('res>', res)
const blob = new Blob([res.data], { type: 'application/pdf' }); // 创建Blob对象并指定新的MIME类型
// 方案一
const objectUrl = URL.createObjectURL(blob); // 生成临时URL
const previewWindow = window.open(objectUrl, '_blank'); // 打开新窗口预览
previewWindow.onload = function() { // 等待加载后自动打印
previewWindow.print();
};
// 方案二
var date = (new Date()).getTime()
var ifr = document.createElement('iframe')
ifr.style.frameborder = 'no'
ifr.style.display = 'none'
ifr.style.pageBreakBefore = 'always'
ifr.setAttribute('id', 'printPdf' + date)
ifr.setAttribute('name', 'printPdf' + date)
ifr.src = window.URL.createObjectURL(blob)
document.body.appendChild(ifr)
this.doPrint('printPdf' + date)
window.URL.revokeObjectURL(ifr.src) // 释放URL 对象
})
},
doPrint(val) {
var ordonnance = document.getElementById(val).contentWindow
setTimeout(() => {
ordonnance.print()
}, 100)
},
获取原始二进制数据
前端预览和打印PDF的两种方式的更多相关文章
- 程序中使用log4J打印信息的两种方式
(1)通过org.apache.commons.logging.Log 接口实例化: public static Log log = LogFactory.getLog(String name); p ...
- vue项目中导出PDF的两种方式
参考大家导出的方式,基本上是如下两种: 1.使用 html2Canvas + jsPDF 导出PDF, 这种方式什么都好,就是下载的pdf太模糊了.对要求好的pdf这种方式真是不行啊! 2.调用浏览器 ...
- layui.js---layer;;前端预览pdf
layui.js---layer;;前端预览pdf 1.必须引入layui.js 2.uul是pdf文件地址 3.触发function函数:小于号button onclick="pdfsee ...
- js图片前端预览之 filereader 和 window.URL.createObjectURL
//preview img : filereader方式 document.getElementById('imgFile').onchange = var ele = document.getEle ...
- 网站开发进阶(十二)JS实现打印功能(包括打印预览、打印设置等)
JS实现打印功能(包括打印预览.打印设置等) 绪 最近在进行项目开发时,需要实现后台管理端打印功能,遂在网上一阵搜索,搜到了很多相关的文章.其中绝大部分文章都是使用的Lodop5.0(Web打印和套打 ...
- 浅析使用vue-router实现前端路由的两种方式
关于vue-router 由于最近的项目中一直在使用vue,所以前端路由方案也是使用的官方路由vue-router,之前在angularJS项目中也是用过UI-router,感觉大同小异,不过很显然v ...
- 设置Mybatis打印调试sql的两种方式
http://blog.csdn.net/gao36951/article/details/53641432 ********************************************* ...
- Mybatis控制台打印SQL语句的两种方式
问题描述在使用mybatis进行开发的时候,由于可以动态拼接sql,这样大大方便了我们.但是也有一定的问题,当我们动态sql拼接的块很多的时候,我们要想从*mapper.xml中直接找出完整的sql就 ...
- 怎样在Android开发中FPS游戏实现的两种方式比较
怎样在Android开发中FPS游戏实现的两种方式比较 如何用Android平台开发FPS游戏,其实现过程有哪些方法,这些方法又有哪些不同的地方呢?首先让我们先了解下什么是FPS 英文名:FPS (F ...
- 两种方式实现java生成Excel
Web应用中难免会遇到需要将数据导出并生成excel文件的需求.同样,对于本博客中的总结,也是建立在为了完成这样的一个需求,才开始去了解其实现形式,并且顺利完成需求的开发,先将实现过程总结于此.本博文 ...
随机推荐
- 纯离线部署本地知识库LLM大模型
纯离线部署本地知识库LLM大模型 一.下载离线大模型 下载的网址:https://hf-mirror.com/ deepseek qwen 相关的模型,只建议使用1.5B的,GGUF后缀的模型 推荐下 ...
- ARC101E题解
前言 此片题解大致按照笔者做题思路进行讲解. 简要题意 有一棵树,树上有偶数个节点.你需要给这些点两两配对,一组已经配对的点会将两点之间的树边进行一次覆盖.一组合法方案需要满足树上所有边都被覆盖至少一 ...
- Python基础-Python操作word、面向对象
今日概要: 第三方模块 -- word 面向对象 1 Word格式-第三方模块 自定义模块 内置模块 第三方模块 requests bs4 openpyxl python-docx 1.1 快速上手 ...
- mysql导出指定数据或部份数据的方法
https://www.jb51.net/article/47525.htm 1.新建一个表,比如new-table,包含所要导出的字段的名称,比如a,b,c2.使用insert into new-t ...
- MySQL2022.3.2
创建库 CREATE DATABASE STUDENT; 创建表 CREATE TABLE STU(SNO INT PRIMARY KEY,//主键SNM CHAR(2) NOT NULL,//不能为 ...
- Vue3 值得注意的新特性
Vue3 值得注意的新特性 Vue3 新特性介绍 片段 组合式 API 单文件组件组合式 API 语法糖 (<script setup>) Teleport Suspense 实验性 SF ...
- docker报错 ERROR: Service 'workspace' failed to build: ERROR: Service 'php-fpm' failed to build:
在 Windows 系统中使用 Laradock 搭建基于 Docker 的 PHP 开发环境 执行命令 docker-compose up nginx mysql redis 执行过程中出现错误 报 ...
- 什么!你还不会写Vue组件,编写《功能级权限》匹配公式组件
说明 该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发). 该系统文章,我会尽量说的非常详细,做到不管新手.老手都能看懂. 说明:OverallAuth2 ...
- Spring Cloud Gateway限流极速部署:3步搞定,秒级防护微服务!
Spring Cloud Gateway限流极速部署:3步搞定,秒级防护微服务! 想要快速为Spring Cloud Gateway集成限流功能?本文提供最简方案,无需复杂配置,三步即可完成!通过内置 ...
- String常见面试题
第一题:打印的结果是true还是false呢? 在之前我们就说过这题,执行s1时,检查字符串常量池,发现没有"abc",于是创建"abc",执行s2时,接着检查 ...