IE中Bloburl调用异常的解决方案咨询(Chrome运行正常)
解决IE浏览器中Blob URL无法打开并打印PDF的问题
嘿,这个问题我太熟悉了!IE对Blob URL的支持一直是个坑,不像Chrome那样顺畅。你遇到的弹窗和报错,本质是IE不允许通过window.open()直接打开Blob URL,它会把Blob识别成需要外部应用打开的文件,所以才会出现那些提示。下面给你两个可行的解决方案,适配IE的场景:
方案1:利用IE专属API msSaveOrOpenBlob
IE提供了专门处理Blob的API window.navigator.msSaveOrOpenBlob,可以直接打开Blob文件,不会触发那些奇怪的弹窗。你可以修改代码,先判断浏览器是否是IE,然后分情况处理:
// 先获取生成的Blob对象 const pdfBlob = this.generatedPDF.output('blob'); // 判断是否是IE浏览器 const isIE = window.navigator.userAgent.indexOf('MSIE ') > -1 || window.navigator.userAgent.indexOf('Trident/') > -1; if (isIE) { // IE下直接用msSaveOrOpenBlob打开 window.navigator.msSaveOrOpenBlob(pdfBlob, 'generated.pdf'); // 这里如果要自动打印的话,需要用户手动在打开的PDF里点击打印,因为IE不支持自动触发外部PDF的打印 } else { // Chrome等现代浏览器保持原逻辑 const newPDF = window.open(this.generatedPDF.output('bloburl'), '_blank'); newPDF.print(); }
这个方案的优点是简单直接,不需要额外的复杂处理,但缺点是IE下无法自动触发打印,需要用户手动操作——这是因为IE的安全限制,不允许脚本自动控制外部打开的PDF文件的打印功能。
方案2:嵌入PDF到页面iframe中实现自动打印
如果你需要在IE下也能自动触发打印,可以把生成的PDF嵌入到页面的隐藏iframe里,然后调用iframe的打印方法。不过需要注意,IE需要依赖Adobe Acrobat插件来渲染PDF,所以用户的IE必须安装了这个插件才能生效:
const pdfBlob = this.generatedPDF.output('blob'); const isIE = window.navigator.userAgent.indexOf('MSIE ') > -1 || window.navigator.userAgent.indexOf('Trident/') > -1; if (isIE) { // 创建隐藏的iframe const iframe = document.createElement('iframe'); iframe.style.display = 'none'; document.body.appendChild(iframe); // 把Blob转成Data URL(注意:大PDF可能会有性能问题) const reader = new FileReader(); reader.onload = function(e) { iframe.src = e.target.result; iframe.onload = function() { // 加载完成后触发打印 iframe.contentWindow.print(); // 打印完成后移除iframe setTimeout(() => document.body.removeChild(iframe), 1000); }; }; reader.readAsDataURL(pdfBlob); } else { // 现代浏览器逻辑不变 const newPDF = window.open(this.generatedPDF.output('bloburl'), '_blank'); newPDF.print(); }
这个方案可以实现IE下的自动打印,但依赖用户的IE安装了Acrobat插件,如果用户没装的话,iframe里可能无法渲染PDF,也就没法打印。所以建议你可以同时提示用户需要安装插件,或者把方案1作为备选。
另外要注意,IE的FileReader处理大Blob的时候可能会有性能问题,如果你的PDF文件很大,方案1会更稳妥。
内容的提问来源于stack exchange,提问作者Chandan Kumar
相关产品推荐
相关产品推荐

