2015-08-25 19 views
11

Tôi đang tạo bản pdf với báo cáo japser và tôi muốn tạo một dịch vụ web REST sẽ trả về bản pdf này và hiển thị nó trong trình duyệt. Tôi đã cố gắng mã hiển thị ở đây:Hiển thị pdf trong trình duyệt bằng cách sử dụng dịch vụ còn lại

REST web services method to display pdf file in browser

Nhưng theo cách này file pdf được tải về. Tôi muốn nó được hiển thị trong trình duyệt trước và sau đó nếu người dùng muốn anh ta có thể tải xuống sau.

(xin lỗi cho câu hỏi trùng lặp, nhưng khi bạn có thể xem các câu hỏi ở trên chưa được trả lời ...)

EDIT:

Working REST của Mã dịch vụ:

@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

Bạn có thể dán mã dịch vụ chính xác của mình không? – wawek

Trả lời

10

thay đổi

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

to

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

Nó hoạt động !!! Cảm ơn, đây là chính xác những gì tôi muốn! – jenny

+0

Chà ... nó hoạt động. Cảm ơn rất nhiều –

0

Bạn có thể dễ dàng thực hiện việc đó với JasperReportsViewResolver. Giả sử bạn có dữ liệu nguồn được xác định, tạo ra một định nghĩa bean như thế này:

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

báo cáo của bạn sẽ nằm trong thư mục /reports/ ví dụ và các báo cáo của bạn sẽ bắt đầu với tiền tố rpt_. Vì vậy, trong thư mục reports, bạn sẽ đặt các tệp JRXML của mình.

Và phương pháp lập bản đồ theo yêu cầu của bạn sẽ trông giống như tức là này .:

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

Bạn có thể cơ bản mối đe dọa báo cáo của bạn như chỉ là cái nhìn khác. File sẽ được mở trong tab mới với khả năng tải về nó, hãy in nó vv

0

Tiếp theo ví dụ về @Branislav Lazic, cách tôi tìm thấy là @Autowired các JasperReportsViewResolver trong bộ điều khiển báo cáo của bạn:

@Autowired 
private JasperReportsViewResolver jrvr; 

Và ghi đè lên (hoặc cập nhật) hàm mũ phù hợp "Content-Disposition". Ví dụ:

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

Tôi không biết nếu đó là cách tốt nhất nhưng hoạt động tốt cho tôi.

1

dùng InputStream đầu tiên chúng ta có thể tải các tập tin vào inputstream, sau đó vượt qua để IOUtils.copy và sử dụng này response.header("Content-Disposition", "attachment; filename=restfile.pdf")để tải về, sử dụng này cho xem trướcresponse.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(); 

loại Return of the là `ResponseEntity

Các vấn đề liên quan