我遇到了在IE中无法正确显示PDF的问题。下面是我创建的最小测试案例,可以展示这个问题。我正在使用Spring 3.0.5和PdfBox 1.6。
以下是一个简化的控制器,它展示了这个问题:
上述方法适用于Chrome和Firefox。然而,在IE中打开链接时,什么都不会显示。但是,如果我进行以下修改:
以下是一个简化的控制器,它展示了这个问题:
@RequestMapping(method = RequestMethod.GET, value = "generatePdf.pdf")
public ResponseEntity<byte []> generatePdf() throws IOException {
PDDocument document = null;
try {
document = new PDDocument();
PDPage page = new PDPage();
document.addPage(page);
PDFont font = PDType1Font.HELVETICA_BOLD;
PDPageContentStream contentStream = new PDPageContentStream(document, page);
contentStream.beginText();
contentStream.setFont(font, 12);
contentStream.moveTextPositionByAmount(100, 500);
contentStream.drawString("Hello World");
contentStream.endText();
contentStream.close();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
document.save(baos);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(new MediaType("application", "pdf"));
headers.setContentLength(baos.toByteArray().length);
return new ResponseEntity<byte[]>(baos.toByteArray(), headers, HttpStatus.CREATED);
} catch (Exception e) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.TEXT_PLAIN);
return new ResponseEntity<byte[]>("BROKEN".getBytes(), headers, HttpStatus.CREATED);
} finally {
if (document != null) {
document.close();
}
}
}
上述方法适用于Chrome和Firefox。然而,在IE中打开链接时,什么都不会显示。但是,如果我进行以下修改:
@RequestMapping(method = RequestMethod.GET, value = "generatePdf.pdf")
public ResponseEntity<byte []> generatePdf(HttpServletResponse response) throws IOException {
PDDocument document = null;
try {
document = new PDDocument();
//... Same until declaration of HttpHeaders
response.setHeader("Content-Type", "application/pdf");
response.setHeader("Content-Length", String.valueOf(baos.toByteArray().length));
FileCopyUtils.copy(baos.toByteArray(), response.getOutputStream());
return null;
} //... same as above
在IE和其他浏览器中都正常工作。我不太确定我的选择是什么,其他类型的文件可以正确地写出(PNG、JPG等)。
有什么想法可以避免拉取请求,简单地使用ResponseEntity来正确处理它们吗?