簡體   English   中英

在Internet Explorer中從二進制文件打開PDF

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM