Content-disposition ответа не может быть установлен на вложение при совместном использовании jfree и itext

Мое требование - поместить диаграмму, созданную JFreeChart, в мой документ PDF.

Чтобы отобразить список диаграмм, я получаю список объектов BufferedImage.

private BufferedImage generateChartForPDF (DefaultCategoryDataset dataset,String threadName) {
        String title = "Skill  : "+threadName ;

        JFreeChart chart = ChartFactory.createBarChart(title, "Work Completion",
                "Perce %", dataset, PlotOrientation.VERTICAL, true, true,
                false);

        return chart.createBufferedImage(500, 300) ;
    }

Из этого я заполняю список буферизованных изображений и заполняю диаграмму в формате PDF следующим образом.

ByteArrayOutputStream baos = new ByteArrayOutputStream();
Document pdfDocument = new Document();
PdfWriter pdfWriter = PdfWriter.getInstance(pdfDocument, baos);
setGraphImagesInPDF(pdfDocument, buffImageList) ;
private void setGraphImagesInPDF (Document pdfDocument,List<BufferedImage> buffImageList) throws DocumentException, IOException {
        for (BufferedImage bufferedImage : buffImageList) {
            Image image = Image.getInstance(bufferedImage,Color.LIGHT_GRAY);
            pdfDocument.newPage();
            image.setAbsolutePosition(300, 300) ;
            pdfDocument.add(image);
        }
    }

Вот как я заполняю диаграмму в своем PDF-файле. Теперь, когда я устанавливаю расположение содержимого на вложение, я не получаю ответ в виде вложения в своем пользовательском интерфейсе, а браузер открывает PDF-файл на другой странице.

ServletOutputStream outputStream = response.getOutputStream();
baos.writeTo(outputStream);
setResponseHeaders(response,"Data");
outputStream.flush();
outputStream.close();

private void setResponseHeaders(HttpServletResponse response,String reportingType) {
        System.out.println("setting response headers .. ");
        response.setHeader("Content-Disposition",
                "attachment; filename=\""+reportingType+" Reports.pdf\"");
        response.setContentType("application/pdf");
    }

Несмотря на то, что я установил тип содержимого для вложения в заголовке ответа, это не открывается как вложение. То же самое отлично работает после удаления диаграммной части кода. Пожалуйста помоги мне с этим. Спасибо


person Arun    schedule 15.09.2012    source источник
comment
(1) почему этот вопрос отмечен тегом itext/jfreechart. Этот вопрос касается заголовка ответа, не так ли? Неважно, используете ли вы iText или JFreeChart. (2) Можете ли вы воспроизвести проблему на разных машинах, используя разные браузеры? Я предполагаю, что у вас проблема с локальной конфигурацией, которая не воспроизводится на каждой клиентской машине.   -  person Bruno Lowagie    schedule 15.09.2012


Ответы (1)


Согласно комментарию Бруно, это не вопрос iText/JFreechart, а вопрос сервлета/http.

Вы должны установить заголовки ответа до получения выходного потока: это обязательно. Я предлагаю вам также установить заголовок content-length в методе setResponseHeaders, например:

response.setContentLength(baos.size());

Итак, ваш код должен быть:

setResponseHeaders(response, baos, "Data");
ServletOutputStream outputStream = response.getOutputStream();
baos.writeTo(outputStream);
outputStream.flush();
outputStream.close();
person Pier Luigi    schedule 17.09.2012
comment
Идеальный !! Это сработало !! :-) Сначала заголовки, потом текст :-) - person Arun; 24.09.2012