2014-02-22 4 views
14

Auf meiner Serverseite benutze ich ASP.NET MVC Web Api, wo ich die PDF-Datei mit Crystal Reports erzeuge und in das PDF-Format exportiere. Der Code lautet wie folgt:Wie man einen serverseitig erzeugten PDF-Stream in Javascript über HttpMessageResponse anzeigt Inhalt

[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; 

} 

Mein Javascript-Code ist:

$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); 
      }); 
    }; 

Dieses einfach nicht funktioniert. Ich weiß nicht, was mit diesem Code nicht stimmt. Ich bekomme den Browser, um den PDF-Viewer zu öffnen, aber es ist leer. Außerdem wird die erstellte PDF korrekt erstellt, da ich sie auf der Festplatte speichern und mit dem Adobe Acrobat Viewer öffnen kann. Der Inhalt der HttpResponseMessage scheint auch korrekt über Fiddler angezeigt zu werden. Siehe Bild:

enter image description here

+0

einen Blick auf [diese eins] [1], zeigt, wie man pdf-Datei exportiert 0 [1]: http://stackoverflow.com/questions/17094822/export-as-a-pdf-file-using-crystal-report – sakir

+0

Ich möchte nicht, dass es in einer Datei gespeichert wird. Ich baue eine Single-Page-Anwendung (angularjs) und was ich brauche, ist die Rückgabe der PDF über einen Web-API-Endpunkt Anruf an den Client und irgendwie Anzeige über Javascript. – zszep

Antwort

8

scheint habe ich es richtig die ganze Zeit. Das Problem war mit meiner angularjs Version (v1.08). Beim Upgrade auf Version 1.2 funktionierte alles einwandfrei. In v1.08 wurde der Parameter responseType: 'arraybuffer' (der für das, was ich tat, entscheidend ist) einfach ignoriert von angularjs. Es scheint ab v.1.1 implementiert zu sein. Siehe diese SO Frage: How to read binary data in AngularJS in an ArrayBuffer?

15

Dieser Link hat uns sehr geholfen. Unten Lösung funktionierte sehr für mich. In unserem Fall OFF LINE im Strom in DB speichern:

//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-Code:

[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 Code:

$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); 
       }); 
+1

Ja, das funktioniert. Der entscheidende Teil scheint responseType zu sein: 'arrayBuffer', der nur verfügbar ist von angularjs v1.1 – zszep

+0

Ich war nicht erfolgreich, aber es funktioniert im IE. IE scheint fileURL als in einer anderen Domäne zu behandeln. – zszep

+0

Ihre Server-Methode hat mir sehr dabei geholfen, Audio-Bytes durch eine einfache Javascript-Funktion zu konsumieren. Danke dafür!!!! – DanielV

Verwandte Themen