方法一:使用HttpServletResponse
可以直接操作HttpServletResponse
來設置響應的類型和內容,並將PDF文件的字節數據寫入到響應的輸出流中。以下是一個示例代碼[1]:
@RequestMapping(value = "/getpdf", method = RequestMethod.GET)
public void getPDF(HttpServletResponse response) throws Exception {
// 設置響應的內容類型為PDF
response.setContentType("application/pdf");
// 設置Content-Disposition響應頭,使得PDF文件可以作為附件下載
response.setHeader("Content-Disposition", "attachment; filename=example.pdf");
// 使用iText生成PDF文件
Document document = new Document();
PdfWriter.getInstance(document, response.getOutputStream());
document.open();
document.add(new Paragraph("Hello, PDF!"));
document.close();
}
方法二:使用Spring的ResponseEntity
可以返回一個ResponseEntity
對象,其中包含PDF文件的字節數據和相關的HTTP頭信息。這種方法允許更細粒度的控制響應的屬性[4][5]。
@RequestMapping(value = "/getpdf", method = RequestMethod.GET)
public ResponseEntity<byte[]> getPDF() {
// 假設這裡已經生成了PDF文件的字節數據
byte[] contents = createPdfBytes();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_PDF);
// 確保設置了正確的文件名
headers.setContentDispositionFormData("filename", "example.pdf");
headers.setCacheControl("must-revalidate, post-check=0, pre-check=0");
ResponseEntity<byte[]> response = new ResponseEntity<>(contents, headers, HttpStatus.OK);
return response;
}
方法三:使用Spring的Resource ( spring version :5.3.20 )
如果PDF文件已經存在於服務器上,可以將其作為Resource
返回。Spring MVC會自動處理文件的讀取和響應的生成[3][6]。
@RequestMapping(value = "/getpdf/{filename}", method = RequestMethod.GET)
public ResponseEntity<Resource> getPDF(@PathVariable("filename") String filename) throws IOException {
Path file = Paths.get("path/to/pdf", filename);
Resource fileAsResource = new UrlResource(file.toUri());
return ResponseEntity.ok()
.contentType(MediaType.APPLICATION_PDF)
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" +
fileAsResource.getFilename() + "\"")
.body(fileAsResource);
}
方法四:使用Spring的 StreamingResponseBody
當處理大型PDF文件時,可以使用StreamingResponseBody
來逐步將數據寫入HTTP響應,這有助於減少記憶體的使用[7]。
@RequestMapping(value = "/getpdf", method = RequestMethod.GET)
public ResponseEntity<StreamingResponseBody> getPDF() {
StreamingResponseBody stream = outputStream -> {
// 使用iText生成PDF並寫入到outputStream中
Document document = new Document();
PdfWriter.getInstance(document, outputStream);
document.open();
document.add(new Paragraph("Streaming PDF content"));
document.close();
};
return ResponseEntity.ok()
.contentType(MediaType.APPLICATION_PDF)
.body(stream);
}
在實際應用中,您可能需要根據實際情況選擇最合適的方法,並且可能需要處理異常和文件存儲的細節。這些方法都是基於Spring MVC框架,並且需要相應的依賴庫(如iText)來生成PDF文件。