2015-08-25 22 views
11

Generuję plik pdf z raportami japsera i chcę utworzyć usługę sieci Web REST, która zwróci ten plik pdf i wyświetli go w przeglądarce. Próbowałem już wyświetlony kod tutaj:Wyświetlanie pliku PDF w przeglądarce za pomocą usługi odpoczynku

REST web services method to display pdf file in browser

Ale w ten sposób plik pdf zostanie pobrany. Wolałbym, aby był najpierw wyświetlany w przeglądarce, a następnie, jeśli użytkownik chce, może pobrać go później.

(przepraszam za duplikat pytanie, ale jak widać na powyższe pytanie nie zostało odebrane ...)

EDIT:

robocza REST Service Code:

@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

Czy możesz wkleić swój dokładny kod usługi? – wawek

Odpowiedz

10

zmiana

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

na

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

Działa !!! Dzięki, właśnie tego chciałem! – jenny

+0

Wow ... to działa. Wielkie dzięki –

0

Możesz to łatwo zrobić za pomocą JasperReportsViewResolver. Zakładając, że masz dane źródło zdefiniowane, należy utworzyć definicję fasoli tak:

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

Raporty będzie tj /reports/ katalogu i raporty zaczną z prefiksem rpt_. Tak więc w folderze reports umieścisz swoje pliki JRXML.

A twoja prośba sposób odwzorowywania będzie wyglądać następująco I.E .:

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

można w zasadzie zagrożenie raport jak tylko innego widoku. Plik zostanie otwarty w nowej karcie z możliwością go pobrać, wydrukować itp

0

Wzorem @Branislav Lazic, aż znalazłem to @AutowiredJasperReportsViewResolver w kontrolerze raportu:

@Autowired 
private JasperReportsViewResolver jrvr; 

I zastąp (lub zaktualizuj) właściwość headder: "Content-Disposition". Na przykład:

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

Nie wiem, czy jest to najlepszy sposób, ale działa dobrze dla mnie.

1

Korzystanie InputStream pierwszy możemy załadować plik do InputStream, a następnie przekazać do IOUtils.copy i używać tej response.header("Content-Disposition", "attachment; filename=restfile.pdf")do pobrania, użyj tego do podgląduresponse.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(); 

typ zwracany z Metoda to `ResponseEntity

Powiązane problemy