显示从Jasper Reports Server提供的pdf

时间:2017-08-01 08:47:21

标签: javascript php sapui5 jasperserver

我的问题

我正在检索使用Jasper Reports Server生成的报告,目的是在新选项卡中将其显示给用户。我可以很好地创建新标签,但pdf是完全空白的。

我的代码

我需要文件,一个向jasperserver发出请求的php文件,另一个查询此文件并使用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响应类型设置为' blob'。 window.URL.createObjectURL拒绝了它
  • 将xhr responseType设置为' arraybuffer'并使用所述arraybuffer创建一个新的Blob。打开新标签后,pdf查看器会抱怨它无法打开文件
  • 与上一个步骤相同,但改为使用File对象。同样的结果。

数据是什么样的

这是我从服务器收到的内容。

由于它太大而无法放在这里,我把它放在pastebin

1 个答案:

答案 0 :(得分: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就会没有任何错误。