Disposisi konten respons tidak dapat disetel ke lampiran saat menggunakan jfree dan itext secara bersamaan

Persyaratan saya adalah memasukkan grafik yang dihasilkan oleh JFreeChart ke dalam dokumen PDF saya

Untuk menampilkan daftar grafik, saya mendapatkan daftar objek 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) ;
    }

Dari sini saya mengisi daftar gambar buffer dan mengisi grafik dalam PDF dengan cara di bawah ini

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);
        }
    }

Beginilah cara saya mengisi bagan di dalam PDF saya. Sekarang ketika saya mengatur disposisi konten ke lampiran, saya tidak mendapatkan respons sebagai lampiran di UI saya, melainkan browser membuka PDF di halaman lain

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");
    }

Meskipun saya menyetel tipe disposisi konten ke lampiran di header respons, ini tidak dibuka sebagai lampiran. Hal yang sama berfungsi dengan baik setelah menghapus bagian bagan dari kode. Tolong bantu saya dalam hal ini. Terima kasih


person Arun    schedule 15.09.2012    source sumber
comment
(1) mengapa pertanyaan ini diberi tag itext/jfreechart. Pertanyaan ini tentang header respons, bukan? Tidak masalah jika Anda menggunakan iText atau JFreeChart. (2) Dapatkah Anda mereproduksi masalah pada mesin yang berbeda, menggunakan browser yang berbeda? Dugaan saya adalah Anda memiliki masalah konfigurasi lokal yang tidak dapat direproduksi di setiap mesin klien.   -  person Bruno Lowagie    schedule 15.09.2012


Jawaban (1)


Menurut komentar Bruno, ini bukan pertanyaan iText/JFreechart, melainkan pertanyaan servlet/http.

Anda harus menyetel header respons sebelum mendapatkan aliran keluaran: ini wajib. Saya menyarankan Anda untuk mengatur juga header content-length dalam metode setResponseHeaders, seperti ini:

response.setContentLength(baos.size());

Jadi kode Anda seharusnya:

setResponseHeaders(response, baos, "Data");
ServletOutputStream outputStream = response.getOutputStream();
baos.writeTo(outputStream);
outputStream.flush();
outputStream.close();
person Pier Luigi    schedule 17.09.2012
comment
Sempurna !! Berhasil!! :-) Header dulu, tulisan berikutnya :-) - person Arun; 24.09.2012