Je suis tombé sur un code de génération PDF utile permettant d'afficher le fichier au client dans une application Spring MVC ( "" Retour généré PDF à l'aide de Spring MVC " ):
@RequestMapping(value = "/form/pdf", produces = "application/pdf")
public ResponseEntity<byte[]> showPdf(DomainModel domain, ModelMap model) {
createPdf(domain, model);
Path path = Paths.get(PATH_FILE);
byte[] pdfContents = null;
try {
pdfContents = Files.readAllBytes(path);
} catch (IOException e) {
e.printStackTrace();
}
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.parseMediaType("application/pdf"));
String filename = NAME_PDF;
headers.setContentDispositionFormData(filename, filename);
headers.setCacheControl("must-revalidate, post-check=0, pre-check=0");
ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(
pdfContents, headers, HttpStatus.OK);
return response;
}
J'ai ajouté une déclaration selon laquelle la méthode renvoie un fichier PDF ( "Spring 3.0 Java REST renvoyer PDF document" ): produces = "application/pdf"
.
Mon problème est que lorsque le code ci-dessus est exécuté, il demande immédiatement au client de sauvegarder le fichier PDF. Je souhaite que le fichier PDF soit affiché en premier dans le navigateur afin que le client puisse décider de le sauvegarder ou non.
J'ai trouvé "Comment obtenir le contenu PDF (servi à partir d'une méthode de contrôleur Spring MVC) à apparaître dans une nouvelle fenêtre" qui suggère d'ajouter target="_blank"
dans la balise de formulaire Spring. Je l'ai testé et, comme prévu, un nouvel onglet est apparu, mais l'invite de sauvegarde est réapparue.
Une autre est "Je ne peux pas ouvrir un fichier .pdf dans mon navigateur avec Java" pour ajouter httpServletResponse.setHeader("Content-Disposition", "inline");
mais je n'utilise pas HttpServletRequest
pour servir mon fichier PDF.
Comment puis-je ouvrir le fichier PDF dans un nouvel onglet en fonction de mon code/de ma situation?
Essayer
httpServletResponse.setHeader("Content-Disposition", "inline");
Mais en utilisant le responseEntity comme suit.
HttpHeaders headers = new HttpHeaders();
headers.add("content-disposition", "attachment; filename=" + fileName)
ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(
pdfContents, headers, HttpStatus.OK);
Ça devrait marcher
Pas sûr, mais il semble que vous utilisiez mal le setContentDispositionFormData, essayez>
headers.setContentDispositionFormData("attachment", fileName);
Faites-moi savoir si cela fonctionne
METTRE &AGRAVE; JOUR
Ce comportement dépend du navigateur et du fichier que vous essayez d'utiliser servir. Avec inline, le navigateur essaiera d'ouvrir le fichier dans le fichier navigateur.
headers.setContentDispositionFormData("inline", fileName);
Ou
headers.add("content-disposition", "inline;filename=" + fileName)
Lisez ceci pour connaître la différence entre inline et attachement
/* Here is a simple code that worked just fine to open pdf(byte stream) file
* in browser , Assuming you have a a method yourService.getPdfContent() that
* returns the bite stream for the pdf file
*/
@GET
@Path("/download/")
@Produces("application/pdf")
public byte[] getDownload() {
byte[] pdfContents = yourService.getPdfContent();
return pdfContents;
}