关键词:
功能场景:
- 点击页面的打印按钮,可以调用浏览器的打印功能,并预览打印pdf文件。
- 解决火狐浏览器出现about:blank问题。
功能实现:
实现思路:
- 使用接口获取pdf文件的二进制流,响应类型为blob
- 将拿到的二进制流使用new Blob得到一个blob对象
- 将blob对象使用URL.createObjectURL得到一个URL,iframe的src可以使用这个URL
- 将iframe隐藏并调用浏览器的打印功能print()
实现代码:
export const preview = (params) =>
return axios.post("/url", params, responseType: "blob" );
;
async print()
let res = await preview(params);
let blob = new Blob([res], type: "application/pdf" );
let href = window.URL.createObjectURL(blob);
let iframe = document.createElement("IFRAME");
iframe.style.visibility = "hidden";
iframe.src = href;
document.body.appendChild(iframe);
// 解决火狐浏览器无法打印预览
setTimeout(() =>
iframe.contentWindow.blur();
iframe.contentWindow.focus();
iframe.contentWindow.print();
URL.revokeObjectURL(href);
, 500);
,
在操作完毕后需要移除创建的iframe,否则页面高度将会被撑开
// 解决使用打印时高度被iframe撑开问题
let iframe = document.getElementsByTagName("iframe");
if (iframe && iframe.length)
iframe[0].parentNode.removeChild(iframe[0]);
补充:
1. 火狐浏览器出现about:blank原因
Firefox:打印页面包括about:blank只有about:blank
您将在firefox( jsfiddle )中获得一个空白页面,因为它将在加载任何内容之前打印iframe。 像$(document).onload()提到的方法不会帮助,因为他们只等待DOM加载和setTimeout()仍然可能导致错误,因为你不知道要花费多长时间加载iFrame。
参考文章:在Firefox中打印PDF
原因就是火狐会在加载内容之前打印iframe,所以这里使用setTimeOut等待iframe加载完毕。如果500ms不能解决问题的话,可以尝试延迟更多。
2. Blob对象
参考文章:jsBlob对象
blob表示二进制类型的大对象
var blob = new Blob([一个由 ArrayBuffer,ArrayBufferView,Blob,DOMString 等对象构成的数组],
type:它代表了将会被放入到 blob 中的数组内容的 MIME 类型
endings:
"native",代表行结束符会被更改为适合宿主操作系统文件系统的换行符
"transparent",代表会保持 blob 中保存的结束符不变。
);
URL.createObjectURL 方法接收一个 Blob 对象,并在浏览器内存中创建一个 URL → Blob 映射,所以当不使用该URL后,应该使用URL.revokeObjectURL手动释放
blob:https://example.org/40a5fb5a-d56d-4a33-b4e2-0acf6a8e5f641
3. contentWindow
参考文章:iframe.contentWindow 属性:关于contentWindow和contentDocument区分
contentWindow和contentDocument都是以 HTML 对象来返回 iframe 中的文档,可以通过所有标准的 DOM 方法来处理被返回的对象。
区别如下:
- contentWindow 这是个只读属性,返回指定的iframe的窗口对象。它虽然不是标准的一部分,但各个主流浏览器都支持。
- contentDocument Firefox 支持,IE6,IE7都不支持,IE8开始支持
兼容获取document对象:
var getIFrameDoc = function()
var iobj = document.createElement("iframe");
document.getElementsByTagName("body")[0].appendChild(iobj);
return iobj.contentDocument || iobj.contentWindow.document;
pdf预览完整解决方案及各种兼容(vue版)(代码片段)
...次利用iframe打开另一个pdf时会显示第一份pdf,原因是浏览器对url的缓存处理。**解决办法:**给url加时间戳或随机数,这样就没有缓存问题了。constfresh=newDate().getTime();//时间戳this.url=this.url+'?'+fresh;//... 查看详情
ie火狐谷歌浏览器下兼容统一select样式
项目开发时,对于不同浏览器下的select样式不统一问题,各种查,这里记录一下,项目已使用IE浏览器下样式:火狐浏览器下样式:谷歌浏览器下样式:上代码:1、html2、css至此,大功告成! 查看详情
关于document.body.scrolltop的谷歌,火狐浏览器兼容问题
最近开发页面,出现一个问题,弹框在谷歌浏览器正常,在火狐浏览器中,当滚动条滚动之后,弹框就显示在上面,也就是说document.body.scrollTop它只适用于google浏览器,火狐浏览器就要改为document.documentElement.scrollTop,但是如果做... 查看详情
谷歌浏览器比火狐浏览器容易崩溃
1、市场占有率如果从市场占有率来看,谷歌毫无疑问是浏览器一哥,而且大多数浏览器都采用谷歌内核,看中的就是速度快,简单,兼容性强。火狐浏览器仅有3.82%的用户,谷歌浏览器就接近6成。下载GoogleChromeV94.0.4606.54官方正... 查看详情
兼容火狐浏览器的select下拉框样式(代码片段)
...问题,在使用bootstrap框架的时候select选择框的样式在火狐浏览器上继承的是浏览器本身的样式,跟谷歌等其他的浏览器样式对比很难看,并且很难调整,但是!好东西来了,现在能调成跟谷歌一样的样式,只需要设置兼容火狐的... 查看详情
在div+css为啥写滚动条效果在谷歌浏览器有用,而在火狐没用呢
...http://www.jb51.net/article/20943.htm,以滚动条为例,介绍了各浏览器的兼容方法。 您可以在火狐社区了解更多内容。希望我的回答对您有所帮助,如有疑问,欢迎继续在本平台咨询。 参考技术B这个要看浏览器支持不支持的。 参... 查看详情
iframe调用子页是能够自适应高度,兼容ie8,ie9,火狐等浏览器
关于这个问题,在网上找了好长时间,还是没能解决这个问题,实在是头疼的很。哪位高手能路过并指点下,小妹感激不尽,拜托拜托,附上我所有的财富,虽不多但这代表我急切之心啊!!!!参考技术A 您好!很高兴为... 查看详情
谷歌浏览器打印预览加载不出来?
下载到电子税务局的申报表时只是空表格,数据加载不出来。参考技术A打开ie浏览器里的internet选项,打开安全,在internet里,自定义级别,找到activex控件和插件,选择启用,关闭对话框。刷新你的打印界面,应该可以了。 查看详情
从 javascript 触发 base64 编码 PDF 的打印预览
...ame中加载PDF,并在加载后立即触发它的打印预览。我可以使用这两种方 查看详情
iframe在谷歌浏览器中与在ie、火狐中显示不一致问题!
...”,右边显示“未选择文件”(不是文本框)。为了保证浏览器之间显示的一致性,想把ie的显示当标准来改。(功能上没问题,可以选择文件,上传文件);谢谢大侠了!!! 尊敬的用户,您好!很高兴为您答疑 您说... 查看详情
jquery实现图片预览
...11月26日*介绍:基于JQUERY扩展,图片上传预览插件目前兼容浏览器(IE谷歌火狐)不支持safari*插件网站:http://keleyi.com/keleyi/phtml/image/16.htm*参数说明:Im 查看详情
在 Android 浏览器上嵌入谷歌文档查看器 iframe
】在Android浏览器上嵌入谷歌文档查看器iframe【英文标题】:embeddedgoogledocsvieweriframeonandroidbrowser【发布时间】:2014-08-1412:38:26【问题描述】:我有一个网站,我在其中嵌入了一个显示pdf的Googledocsiframe。与台式计算机连接时,iframe... 查看详情
pdf文档预览
最近在写一个功能,网站在浏览器上实现文件预览功能,我前端的处理方式,可以使用H5的新标签<embed>或者<iframe>src属性给个文件的地址,就可以预览了,当然如果是图片或者pdf格式的文件,是可以的,但是doc,ppt等... 查看详情
浏览器兼容性问题,火狐可以,谷歌不可以
...一个切换样式的(用下拉框选择样式切换)。但是在火狐浏览器可以实现切换,在谷歌和360浏览器就没有反应。求教大神指导。下面是有关代码,有些没有关系的我就删了。<linkhref="css/红.css"rel="stylesheet"type="... 查看详情
web端可拖拉可插入图片可生成并调整二维码大小可插入文字的无插件print打印demo,附谷歌浏览器直接打印方法
...自行兼容****没有兼容IE低版本,需要的自行兼容----谷歌浏览器加载本地图片文件会被拦截----谷歌浏览器加载本地图片文件会被拦截---- 查看详情
jsjquery代码如何调firefox兼容
jquery本身就是兼容各种浏览器的,所有可以用jquery代替dom事件追问页面里写的js跟jquery多了,不是就有冲突吗?参考技术A 您好,感谢您对火狐的支持 JS会有兼容问题,但jquery本身就是兼容各种浏览器的,所有可以用jquery... 查看详情
dw设计网页如何使div能自适应窗口大小居中显示,并且兼容ie、火狐、谷歌、opera等浏览器?
参考技术A想要页面内容居中显示,给最外层的div定义css样式,取个class名或是id名,.class名margin:0auto;width:1000px 查看详情
lodop打印控件,打印的是图片,然后ie上可以打印,预览,但是谷歌.火狐都显示的是图裂的那种坏图
如题.只有IE可以,其中我定义的打印是div中的东西,根据id进行打印,jsp代码如下:========打印方法beginfunctionPrint()LODOP=getLodop(document.getElementById('LODOP_OB'),document.getElementById('LODOP_EM'));vargrid=$("#printDiv").html();LODOP.PRINT_IN... 查看详情