2017-08-01 114 views
0

我的問題顯示從碧玉提供服務的PDF報告服務器

我retrieveng碧玉報告生成報表服務器,在一個新的標籤它顯示給用戶的意圖。我可以創建新標籤,但是pdf完全空白。

我的代碼

我要文件,一個PHP文件說對的JasperServer的請求,另一種是查詢該文件並創建使用JavaScript的新標籤。 的Javascript:

sap.ui.getCore().attachInit(function() { 
    var onPress = function(evt){ 
     jQuery.ajax({ 
      type: "GET", 
      url: "JasperReportAPICall.php", 
      xhrFields: {responseType: "text/pdf"}, 
      data: { 
       functionname: "authenticate", 
       argument: "http://localhost:8080/jasperserver/rest_v2/reports/reports/interactive/Directives_Report.pdf?id=1&method=rules" 
      }, 
      success: function(response){ 
       var blob = new Blob([response], {type: "application/pdf"}); 
       var pdfUrl = window.URL.createObjectURL(blob); 
       var newTab = window.open(pdfUrl); 
       newTab.addEventListener('load', function(pdfUrl){ 
        window.URL.revokeObjectURL(pdfUrl); 
       }, false); 
       console.log("Report succesfully received"); 

      } 
     }); 
    }; 
    new sap.m.Button({ 
     text: "GNR", 
     press: onPress 
    }).placeAt("content"); 
}); 

PHP:

function authenticate($url){ 
    global $username, $pwd; 

    $curl = curl_init($url); 
    curl_setopt($curl, CURLOPT_GET, 1); 
    curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
    curl_setopt($curl, CURLOPT_USERPWD, "$username:$pwd"); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 

    $result = curl_exec($curl); 
    if (result===false){ 
     $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); 
     $error = curl_error($curl); 
     echo "HTTPCODE: $httpcode"; 
     echo "ERROR: $error"; 
    } 

    curl_close($curl); 
    return $result; 
} 

if (isset($_GET['functionname']) && isset($_GET['argument'])){ 
    if ($_GET['functionname'] === "authenticate"){ 

     $result = authenticate($_GET['argument']); 
     echo $result; 
    } 
} 

我試過

  • 設置XHR的responseType爲 '斑點'。 window.URL.createObjectURL拒絕它
  • 將xhr responseType設置爲'arraybuffer'並使用所述的arraybuffer創建一個新的Blob。在打開新選項卡時,pdf查看器會抱怨它無法打開文件
  • 與上一個步驟相同,但是使用File對象。相同的結果。

什麼數據看起來像

這是我從服務器接收。

既然它太大了放在這裏,我把它放在pastebin

回答

1

我找到了一個修復程序。問題出在PHP方面。因爲它是,我檢索數據,但沒有設置適當的標頭,因此當使用xhr responseType'blob'時,它沒有MIME類型,導致崩潰時使用它創建一個URL對象。 在將pdf返回給ajax調用之前,我設置了這樣的標題。

function authenticate($url){ 
    ... 
    curl_close($curl); 
    header('Cache-Control: public'); 
    header('Content-type: application/pdf'); 
    header('Content-Disposition: attachment; filename="new.pdf"'); 
    header('Content-Length: '.strlen($result)); 
    return $result; 
} 

這樣,PDF BLOB供應沒有任何錯誤。