Retournez le pdf généré à l’aide de Spring MVC

J’utilise Spring MVC. Je dois écrire un service qui prendrait en compte le corps de la requête, appendait les données au pdf et renverrait le fichier pdf au navigateur. Le document pdf est généré en utilisant itextpdf. Comment puis-je faire cela en utilisant Spring MVC. J’ai essayé d’utiliser ceci

@RequestMapping(value="/getpdf", method=RequestMethod.POST) public Document getPDF(HttpServletRequest request , HttpServletResponse response, @RequestBody Ssortingng json) throws Exception { response.setContentType("application/pdf"); response.setHeader("Content-Disposition", "attachment:filename=report.pdf"); OutputStream out = response.getOutputStream(); Document doc = PdfUtil.showHelp(emp); return doc; } 

fonction showhelp qui génère le pdf. Je ne fais que mettre des données aléatoires dans le pdf pour le moment.

 public static Document showHelp(Employee emp) throws Exception { Document document = new Document(); PdfWriter.getInstance(document, new FileOutputStream("C:/tmp/report.pdf")); document.open(); document.add(new Paragraph("table")); document.add(new Paragraph(new Date().toSsortingng())); PdfPTable table=new PdfPTable(2); PdfPCell cell = new PdfPCell (new Paragraph ("table")); cell.setColspan (2); cell.setHorizontalAlignment (Element.ALIGN_CENTER); cell.setPadding (10.0f); cell.setBackgroundColor (new BaseColor (140, 221, 8)); table.addCell(cell); ArrayList row=new ArrayList(); Ssortingng[] data=new Ssortingng[2]; data[0]="1"; data[1]="2"; Ssortingng[] data1=new Ssortingng[2]; data1[0]="3"; data1[1]="4"; row.add(data); row.add(data1); for(int i=0;i<row.size();i++) { String[] cols=row.get(i); for(int j=0;j<cols.length;j++){ table.addCell(cols[j]); } } document.add(table); document.close(); return document; } 

Je suis sûr que c’est faux. Je souhaite que ce fichier PDF soit généré et que la boîte de dialog Enregistrer / Ouvrir soit ouverte via le navigateur, de sorte qu’il puisse être stocké dans le système de fichiers du client. Sil te plait aide moi.

Vous êtes sur la bonne voie avec response.getOutputStream() , mais vous n’utilisez pas sa sortie dans votre code. Essentiellement, vous devez diffuser les octets du fichier PDF directement dans le stream de sortie et vider la réponse. Au spring, vous pouvez le faire comme ceci:

 @RequestMapping(value="/getpdf", method=RequestMethod.POST) public ResponseEntity getPDF(@RequestBody Ssortingng json) { // convert JSON to Employee Employee emp = convertSomehow(json); // generate the file PdfUtil.showHelp(emp); // resortingeve contents of "C:/tmp/report.pdf" that were written in showHelp byte[] contents = (...); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.parseMediaType("application/pdf")); // Here you have to set the actual filename of your pdf Ssortingng filename = "output.pdf"; headers.setContentDispositionFormData(filename, filename); headers.setCacheControl("must-revalidate, post-check=0, pre-check=0"); ResponseEntity response = new ResponseEntity<>(contents, headers, HttpStatus.OK); return response; } 

Remarques:

  • utiliser des noms significatifs pour vos méthodes: nommer une méthode qui écrit un document PDF showHelp n’est pas une bonne idée
  • lire un fichier dans un byte[] : exemple ici
  • Je suggère d’append une chaîne aléatoire au nom de fichier PDF temporaire dans showHelp() pour éviter d’écraser le fichier si deux utilisateurs envoient une demande en même temps