web-dev-qa-db-ja.com

生成されたサーバー側を表示する方法PDF HttpMessageResponse Content経由で送信されたJavaScriptのストリーム

私のサーバー側では、ASP.NET MVC Web APIを使用しています。ここでは、Crystalレポートを含むPDFファイルを生成し、PDF形式にエクスポートしています。コードは次のようになります。

[HttpPost]
public HttpResponseMessage SetReport(string name, [FromBody]List<KontoDto> konta)
{
            var response = Request.CreateResponse(HttpStatusCode.OK);
            var strReportName = "KontoReport.rpt";
            var rd = new ReportDocument();
            string strPath = HttpContext.Current.Server.MapPath("~/") + "Reports//" + strReportName;
            rd.Load(strPath);
            rd.SetDataSource(konta);
            var tip = ExportFormatType.PortableDocFormat;
            var pdf = rd.ExportToStream(tip);
           response.Headers.Clear();
            response.Content = new StreamContent(pdf);
            response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
            return response;

}

私のJavaScriptコードは:

  $scope.xxprint = function () {
        console.log($scope.konta);
        $http.post('/api/konto/setReport/pdf', $scope.konta, { responseType: 'arraybuffer' })
            .success(function (data) {
                 var file = new Blob([data], { type: 'application/pdf' });
                var fileURL = URL.createObjectURL(file);
                window.open(fileURL);
            });
    };

これは単に機能しません。このコードの何が問題なのかわかりません。ブラウザでPDFビューアを開くことができますが、空です。また、作成したpdfは、ディスクに保存してAdobe Acrobatビューアで開くことができるため、正しく作成されています。 HttpResponseMessageのコンテンツもFiddler経由で正しく表示されます。画像を見る:

enter image description here

14
zszep

私はいつもそれを正しくやったようです。私のangularjsバージョン(v1.08)に問題がありました。 v1.2にアップグレードすると、すべてが問題なく動作しました。 v1.08ではresponseType: 'arraybuffer'パラメータ(これは私がやっていることにとって重要です)は、angularjsによって単に無視されました。 v.1.1から実装されているようです。これを見るSO質問: ArrayBufferでAngularJSのバイナリデータを読み取る方法?

8
zszep

このリンクは私たちに大いに役立ちました。以下のソリューションは私にとって非常にうまくいきました。私たちの場合、DBのストリームにオフラインで格納します:

    //Reading the exising pdf file   
    byte[] bytes = File.ReadAllBytes(pafTemplate);
    //gettting memory stream object and writing in to it   
    var stream = new MemoryStream();
    stream.Write(bytes, 0, bytes.Length);
    //For our custom need we are placing the memory stream in one of the column
    PdfDataTable.PdfFormDataColum = stream.GetBuffer();

Web-APIコード:

[GET("api/pdf/getPdfRecordData/{pdfId}")] //AttributeRouting
public HttpResponseMessage GetPdfRecordData(int pdfId) 
{ 
    HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, "value"); 
    MemoryStream ms = GetPdfMemoryStreamFromDataBase(pafId); 
    response.Content = new ByteArrayContent(ms.ToArray()); 
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf"); 
    ms.Close(); 
    return response; 
} 

AngularJsコード:

$http.get('api/pdf/getPdfRecordData/10', null, { responseType: 'arraybuffer' })
                .success(function (data) {
                     var file = new Blob([data], { type: 'application/pdf' });
                    var fileURL = URL.createObjectURL(file);
                    window.open(fileURL);
                });
15
user3568943