Почему PDF, отредактированный с помощью iTextPDF, поврежден в контексте веб-сервлета?

У меня проблема с использованием iTextPdf в веб-приложении контекста.

У меня есть веб-сервлет, который загружает PDF после того, как я отредактировал его во время выполнения.

Если я вызываю свой метод, который готовит PDF в приложении без веб-контекста, PDF создается идеально, и он открывается без каких-либо проблем.

Но в приложении веб-контекста файл создается, но когда я делаю загрузку с моей тестовой страницы, он поврежден : когда я открываю загруженный файл, он без изображений и появляется сообщение об ошибке о шрифте, который не найден.

Если я открою «чистый» файл и» поврежденный » файл с помощью текстового редактора, у них будет одинаковое количество строк, но на самом деле содержимое выглядит по-разному.

Поэтому я подозреваю, что проблема заключается в отображении типа контента в веб-ответе или в чем-то подобном.

Я следил за этой документацией:
http://developers.itextpdf.com/examples/itext-action-second-edition/chapter-9

Это реализация контроллера Spring MVC:

@RequestMapping(path = "/downloadPDF", method = RequestMethod.GET)
public void downloadPDF(HttpServletResponse response){
    try{
        response.setContentType("application/pdf;charset=UTF-8");       
        ByteArrayOutputStream baos = myPDFHandler.getPdf('filetest.pdf');
        OutputStream outputStream = response.getOutputStream();
        baos.writeTo(outputStream);
        outputStream.flush();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Это заголовки ответов:

Response Headers

view source
Cache-Control:no-store
Cache-Control:no-cache
Content-Type:application/pdf;charset=UTF-8
Date:Tue, 24 May 2016 10:20:56 GMT
Expires:Thu, 01 Jan 1970 00:00:00 GMT
Pragma:no-cache
Server:Apache-Coyote/1.1
Strict-Transport-Security:max-age=31536000 ; includeSubDomains
Transfer-Encoding:chunked
X-Content-Type-Options:nosniff
X-Frame-Options:DENY
X-XSS-Protection:1; mode=block

Проблема не в » myPDFHandler.getPdf » метод, потому что в не-веб-контексте он работает отлично.

Есть идеи?
Спасибо.

1 ответ

  1. Я нашел решение.

    Проблема заключалась в возврате типа@Controller, изменяющегося voidна @ResponseBody byte[]Work.

    Я также удалил » charset=UTF-8 «и добавил заголовок»content-disposition».

    @RequestMapping(path = "/downloadPDF", method = RequestMethod.GET)
    public @ResponseBody byte[] downloadPDF(HttpServletResponse response){
        try{
            response.setContentType("application/pdf"); 
            response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "inline; filename=somefile.pdf");     
            ByteArrayOutputStream baos = myPDFHandler.getPdf('filetest.pdf');
            return baos.toByteArray();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }