2012-02-22 3 views
6

Tôi là người mới với Spring MVC nhưng khá ấn tượng với khả năng.Cách lấy nội dung PDF (được phục vụ từ phương pháp điều khiển MVC Spring) xuất hiện trong cửa sổ mới

Tôi đang sử dụng 3.1.0-RELEASE và tôi phải hiển thị PDF theo mẫu: gửi biểu mẫu.

Đây là (nhỏ) mã tôi đã viết trong bộ điều khiển:

@RequestMapping(value = "new_product", method = RequestMethod.POST, params = "print") 
@ResponseBody 
public void saveAndShowPDF(ModelMap map, ShippingRequestInfo requestInfo, HttpServletRequest request, HttpServletResponse httpServletResponse) throws IOException { 
    saveProductChanges(map, requestInfo, request, httpServletResponse); 
    httpServletResponse.setContentType("application/pdf"); 
    byte[] pdfImage = productService.getPDFImage(requestInfo.getRequestId()); 
    httpServletResponse.getOutputStream().write(pdfImage); 
} 

Mã này sẽ gửi các byte PDF [] trở lại cửa sổ ban đầu.

Làm cách nào để hiển thị PDF trong cửa sổ riêng biệt để tôi vẫn có thể có cửa sổ trình duyệt gốc hiển thị một số nội dung khác? Tốt nhất là để có PDF được hiển thị bằng cách sử dụng chương trình xem PDF của khách hàng (Adobe Reader, FoxIt, vv ...) nhưng tôi sẽ ổn với PDF hiển thị trong một cửa sổ trình duyệt riêng biệt.

EDIT tôi quyết định để thiết lập Content-Disposition như vậy mà trình duyệt sẽ trả về một hộp lưu/mở nơi người dùng có thể mở Adobe (với mất trang trình duyệt chính)

httpServletResponse.setHeader("Content-Disposition","attachment;filename=cool.pdf"); 

Cảm ơn tất cả mọi người !

Trả lời

5

Chỉ định target="_blank" trong thẻ form:form gửi biểu mẫu của bạn.

+0

Mục tiêu = "_ trống" sẽ (hy vọng) hiển thị PDF trong một cửa sổ riêng biệt. Nếu tôi làm cho phương thức điều khiển trả về một chuỗi, tôi có thể có cửa sổ gốc hiển thị một trang mới (cùng với PDF trong một cửa sổ mới) không? –

+1

Darn ... Tôi không thể sử dụng target = "__ blank" vì biểu mẫu có nhiều nút = "submit" và tôi chỉ nút này cần phản hồi (PDF) trong cửa sổ riêng. Tôi quyết định đặt Nội dung-Bố trí để mang hộp lưu/mở nơi người dùng có thể mở Adobe (mất trang trình duyệt chính) httpServletResponse.setHeader ("Content-Disposition", "attachment; filename = product.pdf "); –

0

Bạn sẽ làm điều đó trên các mặt hàng với một số ví dụ javascript ,:

<a href="http://www.myWebApp.com/somePdf.pdf" onclick="window.open('http://www.myWebApp.com/somePdf.pdf'); return false;" target="_blank">My Super Awesome Docment</a> 

(thay thế với khá jQuery-Ness như mong muốn) Nếu bạn muốn cái gì khác xảy ra trong cửa sổ chính chỉ làm không trả về false từ sự kiện onClick và để cho nhấp chuột thông thường làm bất cứ điều gì bạn muốn xảy ra trong cửa sổ chính

Nó không tùy thuộc vào bạn nếu các tệp PDF mở trong cửa sổ trình duyệt hoặc trong Adobe, cấu hình trên máy tính của người dùng.

-

Ngoài ra, cũng giống như một điều Spring, @ResponseBody trên một phương pháp void không thực hiện bất kỳ ý nghĩa. @ResponseBody đang thông báo cho mùa xuân sử dụng kiểu trả về của phương thức làm Phản hồi. Tức là, bạn sẽ trả về byte[] từ phương thức và để thỏa thuận mùa xuân biến nó thành một phản hồi servlet. Thay vì tự viết trực tiếp phản hồi bên trong phương thức

1

Sử dụng @RequestMapping để xác định loại phản hồi.

@RequestMapping(value = doc/{docId}, method = RequestMethod.GET, produces = "application/pdf") 
@ResponseBody 
public byte[] getDocument(@PathVariable("docId") String docId) throws Exception 
{ 
    return service.getDocument(docId); 
}