web-dev-qa-db-fra.com

Afficher le pdf dans le navigateur en utilisant un service de repos

Je génère un pdf avec des rapports japser et je voudrais créer un service Web REST qui renverra ce pdf et l’affichera dans le navigateur. J'ai déjà essayé le code affiché ici:

REST méthode de service Web permettant d'afficher un fichier pdf dans un navigateur

Mais de cette façon, le fichier pdf est téléchargé. Je préférerais qu'il soit d'abord affiché dans le navigateur, puis si l'utilisateur le souhaite, il peut le télécharger plus tard.

(désolé pour la question en double, mais comme vous pouvez le voir, la question ci-dessus n'a pas de réponse ...)

MODIFIER:

Code de service REST actif:

@GET
@Path("/pdf")
@Produces("application/pdf")
public javax.ws.rs.core.Response getPdf() throws Exception
{
    File file = new File("E:\\tmp\\test.pdf");
    FileInputStream fileInputStream = new FileInputStream(file);
    javax.ws.rs.core.Response.ResponseBuilder responseBuilder = javax.ws.rs.core.Response.ok((Object) fileInputStream);
    responseBuilder.type("application/pdf");
    responseBuilder.header("Content-Disposition", "filename=test.pdf");
    return responseBuilder.build();
}
16
jenny

changement 

response.header("Content-Disposition",  "attachment; filename=restfile.pdf");

à 

response.header("Content-Disposition",  "filename=restfile.pdf");
19

En utilisant d'abord InputStream, nous pouvons charger le fichier dans inputstream, puis passer à IOUtils.copy et utiliser ce response.header("Content-Disposition", "attachment; filename=restfile.pdf") pour le téléchargement , utilisez ce pour le preview response.setHeader("Content-disposition", " filename=" + output)

    InputStream inputStream = new FileInputStream(new File(path)); // load the file
    IOUtils.copy(inputStream, response.getOutputStream());

    response.setContentType("application/pdf");
    response.setHeader("Content-disposition", " filename=" + output);

    response.flushBuffer();

Le type de retour de la méthode est `ResponseEntity

2
chandrashekar.n

Vous pouvez facilement le faire avec JasperReportsViewResolver . En supposant que la source de données soit définie, créez une définition de bean comme celle-ci:

@Autowired
private DataSource dataSource;

@Bean
public JasperReportsViewResolver getJasperReportsViewResolver() {
    JasperReportsViewResolver resolver = new JasperReportsViewResolver();
    resolver.setPrefix("classpath:/reports/");
    resolver.setSuffix(".jrxml");
    resolver.setJdbcDataSource(dataSource);
    resolver.setViewNames("rpt_*");
    resolver.setViewClass(JasperReportsMultiFormatView.class);
    resolver.setOrder(0);
    return resolver;
}

Vos rapports seront dans le répertoire i.e. /reports/ et commenceront par le préfixe rpt_. Donc, dans le dossier reports, vous placerez vos fichiers JRXML.

Et votre méthode de mappage de demandes ressemblera à ceci:

@RequestMapping(value = "/report", method = RequestMethod.GET)
    public ModelAndView showReport() {
        ModelMap modelMap = new ModelMap();
        modelMap.put("format", "pdf");
        ModelAndView modelAndView = new ModelAndView("rpt_myReport", modelMap);
        return modelAndView;
}

En gros, vous pouvez menacer votre rapport comme une autre vue. Le fichier sera ouvert dans un nouvel onglet avec possibilité de le télécharger, de l'imprimer, etc.

0
Branislav Lazic

Suivant l'exemple de @Branislav Lazic, j'ai découvert que @Autowired la JasperReportsViewResolver dans votre contrôleur de rapports: 

@Autowired
private JasperReportsViewResolver jrvr;

Et remplacez (ou mettez à jour) l'en-tête propriété "Content-Disposition". Par exemple:

...
final Properties properties = new Properties();
properties.setProperty("Content-Disposition", "attachment; filename=newReportName.xlsx");
jrvr.setHeaders(properties);
...

Je ne sais pas si c’est la meilleure solution, mais cela fonctionne bien pour moi.

0
JoseAlv