2017-05-14 1 views
1

J'ai une API REST Spring Spring qui doit retourner un fichier PDF. J'ai converti le PDF en un tableau d'octets, puis je l'ai encodé en base64 avant de le renvoyer au client.Spring boot Angular2, return PDF dans JSON

Voici mon interface:

@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 
    ); 

Et la méthode mise en œuvre:

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

Et voici le code Angular2:

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

Le PDF que je reçois dans la charge utile ressemble à ceci: PasteBin

Lorsque j'ouvre le PDF téléchargé, il ne contient qu'une page qui est vide alors que le vrai pdf contient du texte. Une idée de ce qui se passe? Je pense que c'est à propos de l'encodage.


SOLUTION

je devais changer ma demande GET dans mon service. Je l'ai ajouté à ma demande 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); 

Répondre

1

SOLUTION

je devais changer ma demande GET dans mon service. J'ai ajouté ceci à ma demande 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);