我最近开始使用Bootstrap Table和export plugin。我遇到的一个问题是导出插件不适用于IE,因为文件是使用数据URI输出的,IE不支持(我想我读过IE 11支持它,但我的组织中没有人使用IE 11,当然。)。
我感兴趣的唯一文件类型是Microsoft Office类型(Word,Excel)和PDF。 我已经为MS文件创建了一个功能正常的解决方法。
if (supportsDataUriNavigation())
window.open('data:application/vnd.ms-' + defaults.type + ';filename=exportData.doc;' + base64data);
else {
var iframe = document.getElementById("dataFrame");
iframe = iframe.contentWindow || iframe.contentDocument;
iframe.document.open("text/html", "replace");
iframe.document.write(excelFile);
iframe.document.close();
iframe.focus();
iframe.document.execCommand("SaveAs", true, defaults.fileName + fileExtension);
}
在此检查中,如果浏览器是IE,那么我使用我找到的代码here。这适用于MS文件类型,但是当我尝试对PDF文件执行相同操作时,它会尝试另存为.htm文件。此文件为空。如果我在代码中用.pdf替换fileExtension变量,单击导出时将不会显示SaveAs窗口。没有javascript错误。
我将embed标记的src属性设置为插件javascript返回的字符串,如下所示:'application/pdf;base64,' + Base64.encode(buffer)
任何人都知道任何解决方案/解决方法吗?
答案 0 :(得分:2)
我知道这是一个非常古老的问题,但我找到了解决方案,我想分享有同样问题的人。你可以在这里看到演示: https://jsfiddle.net/quangminh_ln/hy36tnt6/
'use strict';
var data = "...Your PDF base64 string...";
var fileName = "your_file_name";
if (window.navigator && window.navigator.msSaveOrOpenBlob) { // IE workaround
var byteCharacters = atob(data);
var byteNumbers = new Array(byteCharacters.length);
for (var i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i);
}
var byteArray = new Uint8Array(byteNumbers);
var blob = new Blob([byteArray], {type: 'application/pdf'});
window.navigator.msSaveOrOpenBlob(blob, fileName);
}
else { // much easier if not IE
window.open("data:application/pdf;base64, " + data, '', "height=600,width=800");
}
我在解决方案中看到的链接:https://viethoblog.wordpress.com/2016/08/30/loaddisplay-pdf-from-base64-string-bonus-ie-workaround/