2015-08-25 16 views
11

Sto generando un pdf con report japser e vorrei creare un servizio web REST che restituisca questo pdf e lo mostri nel browser. Ho già provato il codice visualizzato qui:Visualizza pdf nel browser utilizzando un servizio di riposo

REST web services method to display pdf file in browser

Ma in questo modo si scarica il file pdf. Preferirei che fosse visualizzato prima nel browser e poi se l'utente vuole che possa scaricarlo in seguito.

(scusate la domanda duplicato, ma come si può vedere la questione di cui sopra non è stato risposto ...)

EDIT:

di lavoro REST Codice:

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

È possibile incollare il codice esatto del servizio? – wawek

risposta

10

cambio

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

a

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

Funziona !!! Grazie, questo è esattamente quello che volevo! – jenny

+0

Wow ... funziona. molte grazie –

0

Si può facilmente farlo con JasperReportsViewResolver. Presumendo che si dispone di dati di fonti di cui, creare una definizione di fagioli come questo:

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

I tuoi rapporti saranno nella cioè /reports/ directory ei tuoi rapporti inizieranno con il prefisso rpt_. Quindi nella cartella reports, inserirai i tuoi file JRXML.

e il metodo di mappatura richiesta sarà simile a questa cioè .:

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

si può sostanzialmente minaccia il vostro rapporto come solo un altro punto di vista. File verrà aperto in una nuova scheda con la possibilità di scaricarlo, stamparlo ecc

0

Seguendo l'esempio di @Branislav Lazic, il modo in cui ho trovato è quello di @Autowired il JasperReportsViewResolver nel controller rapporto:

@Autowired 
private JasperReportsViewResolver jrvr; 

E sovrascrivi (o aggiorna) il titolo di avvitatura "Content-Disposition". Ad esempio:

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

Non so se è il modo migliore, ma funziona bene per me.

1

Usando InputStream prima possiamo caricare il file in InputStream, quindi passare a IOUtils.copy e utilizzare questo response.header("Content-Disposition", "attachment; filename=restfile.pdf")per il download, utilizzare questo per l'anteprimaresponse.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(); 

tipo ritorno del metodo è `ResponseEntity

Problemi correlati