Генерация PDF не отображается в IE - PullRequest
4 голосов
/ 10 августа 2011

У меня проблемы с получением PDF для правильного отображения в IE. Ниже приведен самый маленький тестовый пример, который я могу создать, который показывает проблему. Я использую Spring 3.0.5 с PdfBox 1.6.

Вот упрощенный контроллер, который демонстрирует проблему:

@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 для правильной обработки?

Ответы [ 2 ]

6 голосов
/ 10 августа 2011

Я бы предположил, что это происходит от HttpStatus.CREATED. Возможно, IE не справится с этим. Используйте HttpStatus.OK (200, что является стандартным ответом об успехе). Кажется, это единственное различие между двумя фрагментами

0 голосов
/ 07 апреля 2014

Вы пробовали добавить:

@RequestMapping(method = RequestMethod.GET, value = "generatePdf.pdf", produces =
MediaType.APPLICATION_OCTET_STREAM_VALUE){...}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...