2017-05-14 3 views
1

私はPDFを返さなければならないSpringブートREST APIを持っています。 PDFをバイト配列に変換してから、それをクライアントに返す前にbase64でエンコードしました。ここでSpring起動Angular2、JSONでPDFを返します

は私のインターフェイスです:

@ApiOperation(value = "Update an existing form", notes = "Update an existing form ", response = Void.class, tags={ }) 
    @ApiResponses(value = { 
      @ApiResponse(code = 200, message = "form response", response = Void.class), 
      @ApiResponse(code = 200, message = "unexpected error", response = Void.class) }) 
    @RequestMapping(value = "/forms/{formId}/submissions/{submissionId}/pdf", 
      method = RequestMethod.GET) 
    ResponseEntity<Resource> pdf(
      @ApiParam(value = "Id of the form that needs to be updated", required = true) @PathVariable("formId") Long formId, 
      @ApiParam(value = "Id of the submission that needs to be updated", required = true) @PathVariable("submissionId") Long submissionId, 
      @ApiParam(value = "token to be passed as a header", required = true) @RequestHeader(value = "token", required = true) String token 
    ); 

し、実施方法:

generatePdf(){ 
    this.submissionService.generatePdf(this.form.id, this.submission.id).then(data => { 
     console.log(JSON.stringify(data)); 
     let file = new Blob([atob(data._body)]); 
     FileSaver.saveAs(file, 'helloworld.pdf') 
    }).catch(error => { 
     console.log(error); 
    }); 
} 

私はペイロードに受信PDF:

@Override 
    public ResponseEntity<Resource> pdf(@ApiParam(value = "Id of the form that needs to be updated", required = true) @PathVariable("formId") Long formId, @ApiParam(value = "Id of the submission that needs to be updated", required = true) @PathVariable("submissionId") Long submissionId, @ApiParam(value = "token to be passed as a header", required = true) @RequestHeader(value = "token", required = true) String token) { 
     String name = JWTutils.getEmailInToken(token); 

     if(name == null) { 
      return new ResponseEntity<>(HttpStatus.FORBIDDEN); 
     } 

     User user = userRepository.findByEmail(name); 

     if(user == null){ 
      return new ResponseEntity<>(HttpStatus.FORBIDDEN); 
     } 

     Form form = formRepository.findById(formId); 

     if(form == null){ 
      return new ResponseEntity<>(HttpStatus.NOT_FOUND); 
     } 

     Submission submission = submissionRepository.findOne(submissionId); 

     if(submission == null){ 
      return new ResponseEntity<>(HttpStatus.NOT_FOUND); 
     } 

     //Saving the document 
     final PDPage singlePage = new PDPage(); 
     final PDFont courierBoldFont = PDType1Font.COURIER_BOLD; 
     final int fontSize = 12; 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     try (final PDDocument document = new PDDocument()) 
     { 
      document.addPage(singlePage); 
      final PDPageContentStream contentStream = new PDPageContentStream(document, singlePage); 
      contentStream.beginText(); 
      contentStream.setFont(courierBoldFont, fontSize); 
      contentStream.newLineAtOffset(150, 750); 
      contentStream.showText("Hello PDFBox"); 
      contentStream.showText("Hello PDFBox"); 
      contentStream.showText("Hello PDFBox"); 
      contentStream.showText("Hello PDFBox"); 
      contentStream.showText("Hello PDFBox"); 
      contentStream.showText("Hello PDFBox"); 
      contentStream.showText("Hello PDFBox"); 
      contentStream.showText("Hello PDFBox"); 
      contentStream.showText("Hello PDFBox"); 
      contentStream.endText(); 
      contentStream.close(); // Stream must be closed before saving document. 
      //document.save("pdfs/" + UUID.randomUUID().toString() + ".pdf"); 
      document.save(out); 
     } 
     catch (IOException ioEx) 
     { 
      ioEx.printStackTrace(); 
     } 

     byte[] b64 = Base64.getEncoder().encode(out.toByteArray()); 
     ByteArrayResource resource = new ByteArrayResource(b64); 

     return ResponseEntity.ok() 
       .contentLength(b64.length) 
       .contentType(MediaType.parseMediaType("application/octet-stream")) 
       .body(resource); 
    } 

そして、ここではAngular2のコードです次のようになります。PasteBin

ダウンロードしたPDFを開くと、実際のpdfにテキストが含まれている間に空のページが1ページだけ含まれています。何が起きているのか?私はそれがエンコーディングのような感じです。


SOLUTION

私は私のサービスで私のGETリクエストを変更しなければなりませんでした。私は私のサービスで私のGETリクエストを変更しなければならなかった私の要求responseType: ResponseContentType.Blob;

return this.http.get(this.formsUrl + "/" + formId + "/submissions/" + submissionId + "/pdf", {headers: headers, responseType: ResponseContentType.Blob}) 
     .toPromise() 
     .then(res => res) 
     .catch(this.handleError); 

答えて

1

SOLUTION

にこれを追加しました。これを私の要求に追加しましたresponseType: ResponseContentType.Blob;

return this.http.get(this.formsUrl + "/" + formId + "/submissions/" + submissionId + "/pdf", {headers: headers, responseType: ResponseContentType.Blob}) 
     .toPromise() 
     .then(res => res) 
     .catch(this.handleError); 
関連する問題