[英]Display embedded PDF in Internet Explorer 11 from binary string or base64
[英]Open PDF from binary in Internet Explorer
与需要在IE窗口中打开blob / PDF和在AngularJS中设置window.location或window.open有关,在IE 11中会给出“拒绝访问”的信息 。
我需要打开来自服务中字节数组的PDF:
@RequestMapping("/{dokumentId}")
public ResponseEntity<byte[]> getDoc(@PathVariable Integer docId, HttpServletRequest request, HttpServletResponse response) throws IOException {
byte[] contents = // .. get document
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.parseMediaType("application/pdf"));
headers.add("Content-Disposition", "inline;filename=file");
headers.add("Cache-Control","private, must-revalidate, post-check=0, pre-check=0, max-age=1");
headers.add("Pragma", "no-cache");
headers.setContentLength(contents.length);
return new ResponseEntity<>(contents, headers, HttpStatus.OK);
}
我正在尝试使用以下JS在Internet Explorer 11中打开它:
$scope.openPdf = function(doc){
var winlogicalname = "document_" + doc.docId;
var winparams = 'dependent=yes,locationbar=no,scrollbars=yes,menubar=yes,resizable,screenX=50,screenY=50,width=850,height=1050';
var ieEDGE = navigator.userAgent.match(/Edge/g);
var ie = navigator.userAgent.match(/.NET/g); // IE 11+
var oldIE = navigator.userAgent.match(/MSIE/g);
if(!ie && !oldIE && !ieEDGE){
// Open PDF in new browser window
var detailWindow = window.open("", winlogicalname, winparams);
}
xxxService.getDoc(doc).success(function(data){
//for browser compatibility
if (ie || oldIE || ieEDGE) {
var blob = new window.Blob([data], { type: 'application/pdf' });
window.navigator.msSaveOrOpenBlob(blob);
} else {
var binaryAsString = ArrayBufferToString(data).replace(/"/g,"");
var pdfAsDataUri = "data:application/pdf;base64," + binaryAsString;
var htmlText = '<embed width=100% height=100% type="application/pdf" src="'+ pdfAsDataUri + '"></embed>';
detailWindow.document.write(htmlText);
detailWindow.document.close();
}
}).error(function(data, status, headers, config){
console.log(data, status, headers, config);
});
};
这在Chrome和Firefox中有效(在新窗口中打开,直接使用<embed>
从二进制构造。)但是,这种方法在IE中似乎不起作用,因此msSaveOrOpenBlob
。但是在IE中保存/打开PDF时,出现错误在Adobe Reader中:“ Adobe Acrobat Reader DC could not open 'file.pdf' because it is either not a supported file type or because the file has been damaged (for example, it was sent as an email attachment and wasn't correctly decoded).
” Adobe Acrobat Reader DC could not open 'file.pdf' because it is either not a supported file type or because the file has been damaged (for example, it was sent as an email attachment and wasn't correctly decoded).
“。当我尝试将PDF拖放到IE时,它说“ File does not begin with '%PDF-'.
”。
关于如何直接使用字节数组或构造Blob
在IE11中打开PDF的任何想法?
我将我的网络服务更改为:
byte[] contents = // get contents
response.getOutputStream().write(contents);
response.setContentType("application/pdf");
response.setContentLength(contents.length);
response.addHeader("Content-Disposition", "inline;filename="+filename);
response.addHeader("Cache-Control", "private, must-revalidate, post-check=0, pre-check=0, max-age=1");
response.addHeader("Pragma", "public");
然后在客户端使用:
Service.getDocument(docId).success(function(data){
var file = new Blob([data], {type: 'application/pdf'});
if(window.navigator.msSaveOrOpenBlob){
window.navigator.msSaveOrOpenBlob(file, name + ".pdf");
} else {
var fileURL = URL.createObjectURL(file);
$scope.renderPDF(fileURL, detailWindow.document.getElementById('canvas'));
}
}
其中$scope.renderPDF
使用PDFJS在新窗口中呈现PDF。 请记住在$http.get
(或post
)方法上设置{responseType:'arraybuffer'})
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.